web-dev-qa-db-fra.com

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

Est un 

select *  from myView

plus rapide que la requête elle-même pour créer la vue (afin d'avoir le même resultSet):

select * from ([query to create same resultSet as myView])

?

Ce n'est pas tout à fait clair pour moi si la vue utilise une sorte de mise en cache, ce qui la rend plus rapide par rapport à une simple requête. 

298
JohnIdol

Oui, un index en cluster peut être affecté aux vues et, lorsqu'elles le sont, elles stockent des résultats temporaires pouvant accélérer les requêtes résultantes. 

Mise à jour: Au moins trois personnes ont voté contre moi à ce sujet. Avec tout le respect que je vous dois, je pense qu’ils ont tout simplement tort; La propre documentation de Microsoft indique très clairement que Views peut améliorer les performances.

Premièrement, les vues simples sont étendues et ne contribuent donc pas directement à l’amélioration des performances - c’est vrai. Cependant, les vues indexées peuvent améliorer considérablement les performances. 

Laissez-moi aller directement à la documentation: 

Une fois qu'un index en cluster unique est créé dans la vue, le jeu de résultats de la vue est immédiatement matérialisé et conservé dans la mémoire physique de la base de données, ce qui évite la surcharge liée à 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 puisse l'utiliser pendant 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.

Vous pouvez trouver cette documentation, ainsi que des graphiques présentant les améliorations de performances, ici .

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

Disons que nous sommes une entreprise de logiciels dans un petit pays. Je vais utiliser la Lituanie comme exemple. Nous vendons des logiciels dans le monde entier et conservons nos archives dans une base de données SQL Server. Nous avons beaucoup de succès et ainsi, dans quelques années, nous avons plus de 1 000 000 d'albums. Cependant, nous devons souvent déclarer les ventes aux fins de l'impôt et nous constatons que nous n'avons vendu que 100 exemplaires de nos logiciels dans notre pays d'origine. En créant une vue indexée de toutes les archives lituaniennes, nous gardons les archives dont nous avons besoin dans un cache indexé, comme décrit dans la documentation de MS. Lorsque nous publions nos rapports sur les ventes en Lituanie en 2008, notre requête effectuera une recherche dans un index d'une profondeur de seulement 7 (Log2 (100) avec quelques feuilles non utilisées). Si nous devions faire la même chose sans VIEW et en nous appuyant simplement sur un index dans la table, nous devrions parcourir une arborescence d'index avec une profondeur de recherche de 21! 

Clairement, la vue elle-même nous procurerait 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 de ventes en Lituanie nous donnerait un avantage encore plus grand.

Notez que je suis juste en utilisant un b-arbre droit pour mon exemple. Bien que je sois à peu près certain que SQL Server utilise une variante du b-tree, je ne connais pas les détails. Néanmoins, le point est vrai.

Mise à jour 3: On s'est demandé si une vue indexée utilisait simplement un index placé sur la table sous-jacente. C'est-à-dire, pour paraphraser: "une vue indexée est simplement l'équivalent d'un index standard et n'offre rien de nouveau ou unique à une vue." Si cela était vrai, bien sûr, l'analyse ci-dessus serait incorrecte! Permettez-moi de citer une citation de la documentation Microsoft qui explique pourquoi, à mon avis, cette critique n’est ni valide ni 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 supplémentaires en termes de performances, qu'il est impossible d'obtenir avec des 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 Views, je pense qu'il est prudent de dire qu'une vue indexée est pas simplement un SQL mis en cache. arrive à utiliser un index défini sur la table principale. Ainsi, je continue à me tenir à cette réponse.

550
Mark Brittingham

En règle générale, non. Les vues sont principalement utilisées pour des raisons de commodité et de sécurité, et non pour améliorer la vitesse.

Cela dit, SQL Server 2000 et les versions ultérieures ont une fonctionnalité spéciale appelée Vues indexées que peut améliorer considérablement les performances, mais vous devez créer des vues indexées suivant un très ensemble spécifique de règles } . 

Il existe une référence importante dans Books Online concernant voir la résolution

Voici un article décrivant les avantages et création de vues indexées :

Pendant de nombreuses années, Microsoft® SQL Server ™ a soutenu la possibilité de créer tables virtuelles appelées vues . Historiquement, ces vues ont servi ces objectifs principaux: 

  • Fournir un mécanisme de sécurité qui restreint les utilisateurs à un certain sous-ensemble de données dans une ou plusieurs tables de base. 

  • Fournir un mécanisme qui permet les développeurs pour personnaliser la façon dont les utilisateurs peuvent afficher logiquement les données stockées dans la base les tables.

Avec SQL Server 2000, le la fonctionnalité des vues SQL Server était développé pour fournir la performance du système avantages. Il est possible de créer un index clusterisé unique sur une vue, sous la forme ainsi que des index non clusterisés, à améliorer les performances d’accès aux données sur le requêtes les plus complexes. Dans SQL Server 2000 et 2005, une vue qui a un on se réfère à un index cluster unique comme une vue indexée. 

41
BradC

Dans SQL Server au moins, les plans de requête sont stockés dans le cache de plan pour les vues et les requêtes SQL ordinaires, en fonction des paramètres de requête/vue. Dans les deux cas, ils sont supprimés du cache lorsqu'ils n'ont pas été utilisés pendant une période suffisamment longue et que l'espace est nécessaire pour une autre requête récemment soumise. Après quoi, si la même requête est émise, elle est recompilée et le plan est remis dans le cache. Donc non, il n'y a pas de différence, étant donné que vous réutilisez la même requête SQL et la même vue avec la même fréquence. 

Évidemment, en général, une vue, de par sa nature même (quelqu'un qui pensait qu'elle devait être utilisée assez souvent pour en faire une vue), est généralement plus susceptible d'être "réutilisée" que toute instruction SQL arbitraire. 

13
Charles Bretana

EDIT: Je me suis trompé et vous devriez voir Répondez à la réponse ci-dessus.

Je ne peux pas parler d'expérience avec SQL Server , mais pour la plupart des bases de données, la réponse serait non. En termes de performances, le seul avantage potentiel de l’utilisation d’une vue est qu’elle pourrait potentiellement créer des chemins d’accès basés sur la requête. Mais la principale raison d'utiliser une vue est de simplifier une requête ou de normaliser un moyen d'accéder à certaines données d'une table. De manière générale, vous n'obtiendrez aucun avantage en termes de performances. Je peux me tromper, cependant. 

Je proposerais un exemple moyennement plus compliqué et le regarderais vous-même.

12
Ryan Guill

Cela peut être plus rapide si vous créez une vue matérialisée (avec une liaison de schéma). Les vues non matérialisées s'exécutent exactement comme les requêtes classiques.

4
Otávio Décio

D'après ce que j'ai compris, il y a quelque temps, une vue serait plus rapide, car SQL Server pouvait stocker un plan d'exécution, puis l'utiliser, au lieu d'essayer d'en comprendre un à la volée. Je pense que les gains de performance de nos jours ne sont probablement pas aussi importants qu’auparavant, mais je dois deviner qu’il y aurait une légère amélioration à utiliser cette vue.

4
E.J. Brennan

Une vue vaut certainement mieux qu'une requête imbriquée pour SQL Server. Sans savoir exactement pourquoi il vaut mieux (jusqu'à ce que je lise le message de Mark Brittingham), j'avais effectué quelques tests et mes performances avaient été améliorées de manière presque choquante lorsque je utilisais une vue plutôt qu'une requête imbriquée. Après avoir exécuté chaque version de la requête plusieurs centaines de fois à la suite, la version d'affichage de la requête s'est achevée deux fois plus vite. Je dirais que c'est une preuve suffisante pour moi.

2
Jordan

Je m'attendrais à ce que les deux requêtes fonctionnent de manière identique. Une vue n'est rien de plus qu'une définition de requête stockée, il n'y a pas de mise en cache ni de stockage de données pour une vue. L'optimiseur transformera effectivement votre première requête en votre seconde requête lorsque vous l'exécuterez.

2
Tony Andrews

Il n’y a pas de différence pratique et si vous lisez BOL, vous constaterez que votre ancien et simple SQL SELECT * FROM X tire parti de la mise en cache des plans, etc.

0
keithwarren7

Le stockage du plan d'exécution devrait présenter un avantage trivial, mais ce sera négligeable.

0
JosephStyons

Cela dépend complètement de la situation. Les vues indexées MS SQL sont plus rapides qu'une vue ou une requête normale, mais les vues indexées ne peuvent pas être utilisées dans un environnement de base de données en miroir (MS SQL).

Une vue dans n'importe quel type de boucle provoquera un ralentissement important car la vue est repeuplée chaque fois qu'elle est appelée dans la boucle. Identique à une requête. Dans cette situation, une table temporaire utilisant # ou @ pour conserver vos données en boucle est plus rapide qu'une vue ou une requête.

Donc tout dépend de la situation.

0
Dasboot

Le but d'une vue est d'utiliser la requête encore et encore. À cette fin, SQL Server, Oracle, etc. fournissent généralement une version "mise en cache" ou "compilée" de votre vue, améliorant ainsi ses performances. En général, cela devrait mieux fonctionner qu'une requête "simple", bien que si la requête est vraiment très simple, les avantages peuvent être négligeables.

Maintenant, si vous faites une requête complexe, créez la vue.

0
CAReed

D'après ma conclusion, l'utilisation de la vue est un peu plus rapide qu'une requête normale. Ma procédure stockée prenait environ 25 minutes (avec un jeu d'enregistrements plus grand et plusieurs jointures) et après utilisation de la vue (sans cluster), les performances étaient légèrement plus rapides, mais pas significatives. J'ai dû utiliser d'autres techniques/méthodes d'optimisation des requêtes pour en faire un changement radical.

0
kta