2011-05-06 2 views
13

Existe-t-il une bonne pratique générale sur l'utilisation ou non des vues imbriquées? Existe-t-il un problème de performances lors de l'utilisation de vues imbriquées? Y a-t-il une meilleure pratique qui dit qu'il n'y a vraiment pas un coup de performance jusqu'à ce que vous ayez 4 couches ou plus de profondeur?Sql Server 2008 Vues d'imbrication

La raison pour laquelle je pose cette question est parce que j'ai du mal à les utiliser ou non. Il n'est pas rare d'obtenir une demande de rapport dont la seule façon d'accéder à cette information est de joindre 20 tables ou plus ensemble. Les champs ne sont pas retournés à partir de toutes les tables mais sont nécessaires pour sélectionner les données correctes. Dans ce cas, j'aime imbriquer les vues et réutiliser les vues de niveau inférieur pour les autres rapports, car si une modification de la logique est nécessaire, je mets à jour une vue et tous les rapports sont mis à jour. La plupart des tables avec lesquelles je travaille contiennent des millions et des millions d'enregistrements.

Cependant, ce n'est peut-être pas une bonne pratique. Cela vous dérange-t-il de partager vos pensées à ce sujet?

+2

Les vues font-elles des agrégations? Êtes-vous rejoindre la même table de base à lui-même? Regardez le plan d'exécution et voyez si vous obtenez des plans sous-optimaux. –

+0

Pourriez-vous fournir un exemple de "vue imbriquée"? Je ne connais que la terminologie: vue en ligne (table dérivée AKA), vues non matérialisées et matérialisées (vues indexées AKA dans SQL Server). –

+1

@OMG - Je l'ai pris pour signifier des vues qui référencent d'autres vues qui référencent d'autres vues ... –

Répondre

11

Je voudrais éviter cela à tout prix. D'abord, une fois que vous avez imbriqué des vues, elles ne peuvent pas être indexées. Ensuite, puisqu'ils doivent matérialiser complètement les vues sous-jacentes pour arriver à la couche suivante. Vous pourriez ainsi matérialiser des millions d'enregistrements pour obtenir un résultat final de 5 enregistrements. Nous avons failli perdre un client de plusieurs millions de dollars parce que la performance était tellement épouvantable quand nos développeurs l'ont fait sur une base de données (pas une base de données que j'avais contribué à la conception de).

Enfin, j'ai trouvé que ces types de couches sont beaucoup, beaucoup plus difficiles à maintenir lorsque vous avez besoin de faire un changement. Ce n'est pas amusant de suivre 12 couches de vues pour trouver celle que vous devez corriger. Nous avons également rencontré un problème car les développeurs trouvaient plus simple d'ajouter une autre couche que de réparer les couches sous-jacentes et essayaient d'accéder à trop de tables dans une requête, et trop d'entre elles étaient la même table d'enregistrements multi-million 7 ou 8 fois dans différentes couches des vues.

Il n'y a aucune circonstance où j'autoriserais plus d'une couche dans une vue dans une base de données que je gère et je serais en colère si vous faisiez cela.

+2

+1 SQL est une circonstance dans laquelle vous vous répétez pour éviter d'imbriquer des vues. – Matthew

+6

L'optimiseur peut utiliser des index dans des vues imbriquées, sauf si la logique de vue est compliquée et obscurcit l'index. Les vues indexées présentent un ensemble différent de problèmes, mais pour les vues ordinaires exécutant des jointures simples, l'imbrication n'empêche PAS l'optimiseur d'utiliser un index. –

+0

Je veux dire que vous ne pouvez pas créer d'index sur les vues, pas qu'elles ne peuvent pas utiliser les index sous-jacents. Cependant, vous pouvez très rapidement arriver au point où l'optimiseur ne peut pas comprendre comment gérer cela efficacement. Non seulement qu'ils deviennent très vite un gâchis impossible à maintenir. C'est un antipattern SQL qui devrait être évité si possible et c'est presque toujours possible. – HLGEM

4

Autres options à considérer: Vues indexées - Peut être dangereux à utiliser s'il n'est pas utilisé correctement mais les gains de performances peuvent être incroyables.

Analytics - tels que le regroupement définit

procédures & tables temporaires - Obtenir les données dont vous avez besoin via la procédure écrire sur des tables temporaires sélectionner des tables de temp.

Dans l'ensemble, je n'aime pas l'impact de la performance sur la vue sur la vue ou les vues imbriquées.

Généralement, vous pouvez générer une vue en utilisant les bonnes jointures entre les tables qui contiennent toutes les informations après et filtrer les données en utilisant des critères.

+0

Question sur les vues indexées. La vue doit-elle être explicitement spécifiée ou l'optimiseur choisira-t-il une vue indexée même si vous allez dans certaines tables de base, mais dans le chemin d'exécution, elle détermine que la vue est meilleure. – user742085

+1

J'ai donc trouvé cette réponse La vue n'a pas besoin d'être référencée directement dans la requête pour que l'optimiseur l'utilise dans le plan d'exécution de la requête. – user742085

+0

@user - Depens sur la version. Cela se produit uniquement dans Enterprise et Developer Edition, sinon vous devez référencer explicitement la vue et utiliser l'indicateur 'noexpand'. –