L'amélioration des performances sur un point de vue avec BEAUCOUP de jointures
J'ai une vue qui utilise 11 jointures externes et les deux jointures internes à la création des données. Il en résulte plus de 8 millions de lignes. Quand je fais un count (*) sur la table, il faut environ 5 minutes pour s'exécuter. Je suis à une perte sur la façon d'améliorer la performance de ce tableau. Quelqu'un aurait-il des suggestions sur où commencer? Il semble y avoir des indices sur toutes les colonnes qui sont de rejoindre (si certains sont en composite, vous ne savez pas si cela fait une différence...)
Toute aide appréciée.
avez-vous regardé l'prévue/effective des plans d'exécution? ils pourront vous dire si il vous manque un indice quelque part
Je l'ai regardée. Il n'y a pas de table d'analyses prendre beaucoup de temps. Il y a beaucoup de "Hachage Correspond à" qui s'ajoutent à la mauvaise performance, mais de Hachage matchs ne sont exécutées que lorsque les index sont utilisés correct?
un truc que j'ai trouvé très utile est de casser un complexe de requête en sous-requêtes, par exemple, si vous avez une requête avec 11 joint - c'est un travail dur pour l'optimiseur qui n'est généralement pas capable d'envisager plus de 4 rejoint à la fois. Je voudrais essayer de garder la requête externe avec 4 rejoint déplacer d'autres se joint à des sous-requêtes. M'a aidé dans quelques cas.
Je l'ai regardée. Il n'y a pas de table d'analyses prendre beaucoup de temps. Il y a beaucoup de "Hachage Correspond à" qui s'ajoutent à la mauvaise performance, mais de Hachage matchs ne sont exécutées que lorsque les index sont utilisés correct?
un truc que j'ai trouvé très utile est de casser un complexe de requête en sous-requêtes, par exemple, si vous avez une requête avec 11 joint - c'est un travail dur pour l'optimiseur qui n'est généralement pas capable d'envisager plus de 4 rejoint à la fois. Je voudrais essayer de garder la requête externe avec 4 rejoint déplacer d'autres se joint à des sous-requêtes. M'a aidé dans quelques cas.
OriginalL'auteur Abe Miessler | 2009-12-17
Vous devez vous connecter pour publier un commentaire.
C'est un dur, avec une vue complexe vous avez également des interactions possibles avec les requêtes contre la vue, afin de garantir des performances acceptables sera très difficile. Les jointures externes dans les vues (particulièrement complexes) sont également susceptibles de causer des problèmes pour l'optimiseur de requête.
Une option serait de matérialiser la vue (vue indexée' sur SQL Server). Cependant, vous pouvez avoir besoin de surveiller les performances de mise à jour pour vérifier qu'elle n'impose pas trop de frais généraux. Aussi, les jointures externes dans une vue matérialisée peut empêcher de rafraîchissement temps réel; si vous avez besoin de cela, alors vous pourriez avoir à re-mettre en œuvre la vue comme un denormalised table et conserver les données avec des déclencheurs.
Une autre possibilité serait d'examiner si la vue peut être divisée en deux ou trois plus simple, les vues, éventuellement, la matérialisation de certains, mais pas tous de la vue. Il peut être plus facile à concrétiser certains de la vue et d'obtenir des performances du système de cette façon.
C'est correct. Vous pourriez être en mesure de matérialiser une partie de la vue et de construire une vue sur le dessus de ce.. Alternativement, vous pourriez être en mesure de re-mettre en œuvre la vue comme une table maintenu par un ensemble de déclencheurs.
Oui, je pense que c'est l'approche que je vais avoir à prendre.
avez-vous une idée de combien d'espace est-ce que cela prendra? faire de ce point de vue a persisté n'est pas une bonne idée.
OriginalL'auteur ConcernedOfTunbridgeWells
votre postulat de base est faux.
ayant un point de vue qui renvoie 8 millions de lignes n'est pas une bonne idée parce que realisticaly vous ne pouvez pas vraiment faire n'importe quoi avec une telle quantité de données.
5 minutes semble assez bon pour 8 millions de count() à cause de toutes ces jointures.
ce que vous avez à faire est de penser au sujet de votre problème d'entreprise et d'écrire une petite requête.
OriginalL'auteur Mladen Prajdic
Quelques choses que vous pourriez envisager:
OriginalL'auteur AdaTheDev
Exécuter le générateur de profils sql/assistant paramétrage d'index. parfois, il fait des recommandations d'index qui ne sont pas immédiatement sens, mais se ont une belle perf avantages
désolé, l'outil qui ne fait les recommandations, est "Sql Server" Assistant Paramétrage d'Index. Cet outil prend en entrée une trace du générateur de profils de fichier 🙂
OriginalL'auteur Joel Martinez
Peut-être certains des tableaux laquelle vous essayez d' (externe) de jointure sont disjoints? Si oui, envisagez la création d'une procédure stockée à la place de la vue et de créer quelque chose comme ceci:
select ...
into #set1
from T1 left join T2 left join...
where ...
select ...
into #set2
from T3 left join T4 left join...
where ...
...
select ... from #set1 left join #set2 left join ...
Avec cela, vous pouvez éviter de traiter d'énormes quantités de données. Quand vous faites des jointures externes, l'optimiseur ne peuvent souvent pas déplacer la sélection vers le bas dans l'arbre d'analyse de la requête (si elle le fait, vous ne seriez pas obtenir les lignes avec des valeurs null vous voulez)
Bien sûr, vous ne pouvez pas créer une requête avec jointure avec la procédure stockée. Ce n'est qu'une idée de base que vous pouvez utiliser.
OriginalL'auteur Marcin Krupowicz