Cela fait-il une différence si vous filtrez une vue à l'intérieur ou à l'extérieur de la vue?
Par exemple, y a-t-il une différence entre ces deux requêtes?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Ou
SELECT Id
FROM MyView
WHERE SomeColumn = 1
Et MyView
est défini comme
SELECT Id, SomeColumn
FROM MyTable
Et la réponse est-elle différente si la table source se trouve sur un serveur lié?
Je demande parce que je dois interroger une grande table (lignes 44mil) deux fois à partir d'un serveur lié et obtenir un agrégat des résultats. Je veux savoir si je dois créer deux vues pour accéder aux données, une pour chaque requête, ou si je peux m'en tirer avec une seule vue et une WHERE
clause.
UNION ALL
. Il est beaucoup plus facile d'utiliser une vue que d'avoir à réécrire la requête UNION chaque fois que j'ai besoin des données.Réponses:
Vous ne devriez voir absolument aucune différence dans les plans ou les performances entre ces deux choix. Lorsque la vue est interrogée, elle est étendue à une requête sur la table de base, ce qui signifie que la même recherche ou analyse sera utilisée.
Maintenant, selon le type de données et la sélectivité de
MyColumn
, si vous vouliez créer un index filtré sur la table de base (lorsque vous passez à SQL Server 2008+), vous pourriez obtenir de meilleures performances, mais cela ne sera pas différent via la vue ou sans.la source
where
clause en dehors de la vue prend autant de temps que lorsqu'elle est placée dans la vue?Voici juste un petit exemple montrant qu'il ne devrait pas y avoir de différence. La base de données est la
AdventureWorks
base de données.Deux définitions de vue:
Voici la première requête, avec la
WHERE
clause incluse dans la définition de la vue:Voici le plan d'exécution:
Et la deuxième requête, avec la
WHERE
clause non pas dans la définition de la vue, mais dans laSELECT
requête:Voici ce plan d'exécution:
Comme vous pouvez le voir sur ces plans d'exécution, ils sont identiques avec des résultats identiques. Je ne connais pas de situation où ce type de logique / conception produirait des résultats différents. Je serais donc prêt à dire que vous êtes en sécurité de toute façon, et que vous préférez les préférences personnelles (ou les procédures de magasin).
la source
where
clause en dehors de la vue prend autant de temps que lorsqu'elle est placée dans la vue?Where
clause correspond à laPARTITION BY
. SQL Server 2008 semble avoir une nouvelle règleSelOnSeqPrj
pour reconnaître ce cas particulier.Sur la base de ce que je lis , SQL utilisera une vue standard comme une sous-requête lors de la détermination du plan d'exécution.
Donc, en utilisant mon exemple de requête,
où
MyView
est défini commeil doit générer le même plan d'exécution que
mais ce plan d'exécution peut être différent de ce qui serait généré avec
Je ne sais pas si cette réponse serait la même pour les vues indexées
la source
sp_refreshview
est nécessaire que le concept de substitution de texte ne le fasse pas.