2013-09-30 9 views
0

J'ai un cas de jointures multiples pour plusieurs tables avec diverses clauses where. Une vue simple exécutera toujours l'instruction select (c'est-à-dire ce qui est sauvegardé dans la base de données dans tous les cas), donc filtrer les données semble une grosse perte de temps. Une vue indexée ferait la même chose mais accélérerait également les choses en utilisant des index. À MSDN, nous lisons que Lorsqu'un index cluster unique est créé sur une vue, le jeu de résultats est stocké dans la base de données comme une tableAffichage, vue indexée et requête de jointure. Quoi de mieux en termes de performances pour plusieurs jointures?

plusieurs jointures apporterait les données correctes par la clause where de la requête sans avoir besoin de tout apporter au début et de le filtrer plus tard (vues simples), ni de la nécessité de conserver des index pour les vues indexées sur des données changeant assez fréquemment, mais entraînerait des requêtes plus complexes. Ces jointures impliquent jusqu'à 20 tables (certaines jointures externes (2 à 4) qui doivent être écrites dans les deux sens car les vues indexées ne les prennent pas en charge) et les lignes de résultat sont plusieurs milliers (environ 2 à 4) million de lignes dans chaque vue).

Ceci est plus d'une question de conception, mais ce qui serait le plus efficace (perfomrance-sage et stockage sage) dans ce cas?

P.S. Les requêtes sont assez fastidieuses à écrire chaque fois dans le développement de l'environnement frontal, c'est pourquoi je cherche une autre solution.

+5

"* Une vue simple exécutera toujours l'instruction select (c'est ce qui est enregistré dans la base de données dans tous les cas) *" Non, ce n'est pas le fonctionnement de Views. Une vue en elle-même ne fait * rien *, et ne stocke aucune donnée. Une vue est simplement un alias pour une requête SQL. Il ne peut être utilisé que dans d'autres requêtes qui le référencent. Lorsque cela se produit, le compilateur de requêtes l'optimise avec toutes les autres parties de la requête, y compris les clauses WHERE ou d'autres contraintes. Aussi souvent que non, cela entraînera l'application des clauses explicites "WHERE" externes avant que * les résultats de la vue ne soient ajoutés à quoi que ce soit d'autre. – RBarryYoung

+0

Merci, je ne le savais pas. Je pensais que cela fonctionnait comme un alias pour une requête imbriquée. Il n'y a donc aucun problème en termes d'efficacité pour utiliser une vue simple. Mais la vue indexée est-elle encore meilleure? –

Répondre

1

Quelques conseils pour optimiser les performances des requêtes.

Numéro 1: Utilisez les filtres où vous le pouvez, l'optimiseur utilisera ces filtres pour limiter les données qu'il renvoie (avec une table de 100 000 000 lignes, les filtres accélèrent réellement le processus de visualisation).

Numéro 2: conversions implicites: Une conversion implicite est lorsque vous ne voyez pas la conversion d'un type de données à un autre, mais dans les coulisses, ils mâchent beaucoup de temps. Table de 6 000 000 lignes à partir d'un serveur distant. Temps de requête de 2 minutes avec conversion implicite, 5 secondes après la suppression de la conversion implicite (BTW datetime <> smalldatetime).

Numéro 3: utilisez le plan d'exécution, qui vous permettra de savoir où se trouvent vos plus grosses opérations CPU (c'est ainsi que j'ai localisé la conversion implicite Datetime -> Smalldatetime).

Questions connexes