Le nombre de tables est “de trop” dans une seule SQL SELECT?
En tant que DBA MS SQL 2000 et 2005, je vais régulièrement voir des requêtes de sélection de Rejoindre de 7 à 10 ou même plus de tables. Je trouve, cependant, qu'il existe un certain point de passé et dont le rendement a tendance à souffrir, et la requête devient très difficile à déboguer et/ou à améliorer.
Donc, il y a une "règle du pouce" pour quand je dois être d'envisager d'autres méthodes de requête, comme les tables temporaires pour tenir les résultats préliminaires? Ou est-il un point au-delà duquel la requête SQL optimizer juste ne pas faire un très bon travail de déterminer le meilleur plan?
Question similaire: stackoverflow.com/questions/793647/...
OriginalL'auteur BradC | 2009-06-09
Vous devez vous connecter pour publier un commentaire.
Un grand nombre de fois, vous pouvez atténuer le visuel de l'odorat par la création de helper points de vue, je ne pense pas qu'il y est une règle dure et rapide du nombre de jointures sont considérées comme des mauvaises.
Contrairement à la procédure de codage, de casser SQL en petits morceaux peuvent entraîner requêtes inefficace.
L'Optimiseur SQL fonctionnent très bien avec des tonnes de jointures de table, et si vous frappez un coin des cas, vous pouvez spécifier l'ordre de jointure ou de style à l'aide d'indicateurs. En réalité, je pense qu'il est très rare de recevoir des requêtes de jointure en plus de, disons, 10 tables, mais il est tout à fait possible que cela pourrait se produire dans une déclaration de type de scénario.
Si vous découvrez une situation où vous avez beaucoup de jointures ET ont découvert que cette requête est un goulot d'étranglement ET que vous avez les bons index en place, vous avez probablement besoin de revoir. Cependant, gardez à l'esprit que la grande quantité de jointures ne peut être qu'une symptôme, pas la cause de la question. La norme de pratique pour la requête optimisation doivent être suivies (regardez profiler, plan de requête, la structure de base de données, la logique, etc.)
SQL Server utilise la base de données tempdb de toute façon pour les jointures de fusion, de sorte qu'il est généralement pas nécessaire de créer de la table temporaire juste pour refactoriser une seule requête SELECT.
Vrai, comme n'importe quel peu de refactoring cette technique peut être utilisée à mauvais escient. Je pense que vous devriez envisager helper vues si sa va aider plusieurs requêtes (et pas seulement pour la refactorisation une seule requête)
OriginalL'auteur Sam Saffron
Ça dépend vraiment de la taille de vos tables, de même vous ne joindre 2 tables si il a 100M de dossiers, puis ça va être un processus lent de toute façon.
Si vous avez X enregistrements dans une table et Y enregistrements dans la table b, si vous joindre à eux, vous pouvez obtenir jusqu'à x*y documents, dans ce cas, le swap de la mémoire en cours d'utilisation pendant le processus, ça va être lent, les comparer, les petites requêtes jonly utilisation de la CPU, de la mémoire cache L2 qui a la meilleure performance.
Cependant, si vous vous sentez vraiment besoin d'adhérer à un grand nombre de tables à atteindre l'objectif , je suggère à vos bases de données sont de plus normalisé, 3e normalisation qui fonctionne vraiment bien dans la plupart des scénarios, n'essayez pas de cracher les informations de trop , comme il a reconnu être inefficace pour l'interrogation.
Oui, si nécessaire, s'il vous plaît créer un tableau pour mettre en cache les résultats de la lourde requête, et met à jour les champs que lorsqu'il est nécessaire, ou même une seule fois par jour.
OriginalL'auteur Shuoling Liu
Je vois aussi mammouth requêtes de rejoindre 7-10 tables, mais de ce que j'ai vu la requête de l'optimiseur semble toujours trouver le plan le plus efficace - certes, tous les problèmes de performances, je vois dans ces sortes de questions complexes sont généralement liées à un autre problème (comme conditionnelle LORSQUE les déclarations ou imbriquée des sous-requêtes)
OriginalL'auteur Justin
L'optimiseur définit une limite de temps sur lui-même pour l'empêcher de courir trop longtemps. Le problème avec de nombreux tableaux, c'est que chacun multiplie le nombre de plans possibles pour l'optimiseur à évaluer (en fait, c'est le nombre de Jointures, pas de tables de soi). À un certain point l'optimiseur de manque de temps et utilisera simplement le meilleur plan qu'il a, à ce jour, qui peut être assez mauvais.
Alors, où est-ce point? Eh bien, c'est très situationnel, et 2005 est beaucoup mieux qu'en 2000, mais à mon habitude règle de base est de 4 à 8 pour SQL Server 2000 et 6-16 pour SQL Server 2005.
OriginalL'auteur RBarryYoung
Il y a d'autres variables qui ont un impact plus important sur l'ensemble du plan de requête et de la performance, dans mon expérience, tels que:
Vous pourriez avoir seulement deux tables jointes ensemble dans une requête, mais si une colonne de clé est un GUID et l'autre est un varchar représentation d'un GUID, vous n'avez pas d'indices de n'importe où, et les tables sont de 2 millions de lignes chacune, alors vous aurez probablement de mauvaise performance.
J'ai codé des requêtes de rapport avec 10+ joint avant, et l'utilisation judicieuse de quelques index non cluster sur les colonnes de clé étrangère a généralement le plus grand avantage sur le plan de.
OriginalL'auteur Sam