Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Une vue est-elle plus rapide qu'une simple requête ?

Oui , les vues peuvent se voient attribuer un index clusterisé et, lorsqu'ils le font, ils stockent des résultats temporaires qui peuvent accélérer les requêtes résultantes.

La propre documentation de Microsoft indique très clairement que les vues peuvent améliorer les performances.

Premièrement, la plupart des vues que les gens créent sont simples vues et n'utilisent pas cette fonctionnalité, et ne sont donc pas différents de l'interrogation directe des tables de base. Les vues simples sont développées sur place et ne contribuent donc pas directement à l'amélioration des performances - c'est vrai. Cependant, les vues indexées peuvent considérablement améliorer les performances.

Permettez-moi d'aller directement à la documentation :

Une fois qu'un index clusterisé unique est créé sur la vue, l'ensemble de résultats de la vue est immédiatement matérialisé et conservé dans le stockage physique de la base de données, ce qui permet d'économiser les frais généraux liés à l'exécution de cette opération coûteuse au moment de l'exécution.

Deuxièmement, ces vues indexées peuvent fonctionner même lorsqu'elles ne sont pas directement référencées par une autre requête car l'optimiseur les utilisera à la place d'une référence de table le cas échéant.

Encore une fois, la documentation :

La vue indexée peut être utilisée dans une exécution de requête de deux manières. La requête peut référencer directement la vue indexée ou, plus important encore, l'optimiseur de requête peut sélectionner la vue s'il détermine que la vue peut être remplacée par une partie ou la totalité de la requête dans le plan de requête le moins coûteux. Dans le second cas, la vue indexée est utilisée à la place des tables sous-jacentes et de leurs index ordinaires. La vue n'a pas besoin d'être référencée dans la requête pour que l'optimiseur de requête l'utilise lors de l'exécution de la requête. Cela permet aux applications existantes de bénéficier des vues indexées nouvellement créées sans modifier ces applications.

Cette documentation, ainsi que des graphiques démontrant l'amélioration des performances, sont disponibles ici.

Mise à jour 2 : la réponse a été critiquée au motif que c'est «l'index» qui fournit l'avantage en termes de performances, et non la «vue». Cependant, cela est facilement réfuté.

Disons que nous sommes une société de logiciels dans un petit pays; Je vais utiliser la Lituanie comme exemple. Nous vendons des logiciels dans le monde entier et conservons nos enregistrements dans une base de données SQL Server. Nous avons beaucoup de succès et donc, en quelques années, nous avons plus d'un million d'enregistrements. Cependant, nous devons souvent déclarer les ventes à des fins fiscales et nous constatons que nous n'avons vendu que 100 exemplaires de notre logiciel dans notre pays d'origine. En créant une vue indexée des seuls enregistrements lituaniens, nous pouvons conserver les enregistrements dont nous avons besoin dans un cache indexé, comme décrit dans la documentation MS. Lorsque nous exécutons nos rapports sur les ventes lituaniennes en 2008, notre requête recherche dans un index d'une profondeur de seulement 7 (Log2(100) avec quelques feuilles inutilisées). Si nous devions faire la même chose sans VIEW et en nous appuyant uniquement sur un index dans la table, nous aurions à parcourir un arbre d'index avec une profondeur de recherche de 21 !

De toute évidence, la vue elle-même nous fournirait un avantage de performance (3x) par rapport à la simple utilisation de l'index seul. J'ai essayé d'utiliser un exemple concret, mais vous remarquerez qu'une simple liste des ventes lituaniennes nous donnerait un avantage encore plus grand.

Notez que j'utilise juste un b-tree droit pour mon exemple. Bien que je sois à peu près certain que SQL Server utilise une variante d'un b-tree, je ne connais pas les détails. Néanmoins, le point tient.

Mise à jour 3 : La question s'est posée de savoir si une vue indexée utilise uniquement un index placé sur la table sous-jacente. Autrement dit, pour paraphraser :"une vue indexée est juste l'équivalent d'un index standard et elle n'offre rien de nouveau ou d'unique à une vue". Si cela était vrai, bien sûr, alors l'analyse ci-dessus serait incorrecte ! Permettez-moi de fournir une citation de la documentation Microsoft qui démontre pourquoi je pense que cette critique n'est pas valide ou vraie :

L'utilisation d'index pour améliorer les performances des requêtes n'est pas un nouveau concept; cependant, les vues indexées offrent des avantages de performances supplémentaires qui ne peuvent pas être obtenus à l'aide d'index standard.

Avec la citation ci-dessus concernant la persistance des données dans le stockage physique et d'autres informations dans la documentation sur la façon dont les index sont créés sur les vues, je pense qu'il est sûr de dire qu'une vue indexée n'est pas juste un SQL Select mis en cache qui utilise un index défini sur la table principale. Ainsi, je continue à maintenir cette réponse.