L'ordre Sql JOIN affecte-t-il les performances?

Je ne faisais que ranger quelques sql quand je suis tombé sur cette requête:

SELECT jm.IMEI , jm.MaxSpeedKM , jm.MaxAccel , jm.MaxDeccel , jm.JourneyMaxLeft , jm.JourneyMaxRight , jm.DistanceKM , jm.IdleTimeSeconds , jm.WebUserJourneyId , jm.lifetime_odo_metres , jm.[Descriptor] FROM dbo.Reporting_WebUsers AS wu WITH (NOLOCK) INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId WHERE ( wu.isActive = 1 ) AND ( j.JourneyDuration > 2 ) AND ( j.JourneyDuration < 1000 ) AND ( j.JourneyDistance > 0 ) 

Ma question est-ce que cela fait toute différence de performance l'ordre des jointures comme pour la requête ci-dessus j'aurais fait

 FROM dbo.Reporting_JourneyMaster90 AS jm 

puis rejoint les 2 autres tables à celui-là

Non, la command JOIN by est modifiée lors de l'optimization.

La seule mise en garde est l'option FORCE ORDER qui forcera les jointures à se produire dans l'ordre exact où elles sont spécifiées.

L'ordre de jointure dans le server SQL2008R2 affecte indéniablement les performances des requêtes, en particulier dans les requêtes où il existe un grand nombre de jointures de tables avec des clauses where appliquées à plusieurs tables.

Bien que l'ordre de jointure soit modifié en optimization, l'optimiseur n'essaie pas tous les ordres de jointure possibles. Il s'arrête lorsqu'il trouve ce qu'il considère comme une solution réalisable car l'acte même d'optimization utilise des ressources précieuses.

Nous avons vu des requêtes qui se comportaient comme des chiens (1min + time d'exécution) descendre à des performances de sous-seconde juste en changeant l'ordre des expressions de jointure. S'il vous plaît noter cependant que ce sont des requêtes avec 12 à 20 jointures et où les clauses sur plusieurs des tables.

L'astuce consiste à configurer votre command pour aider l'optimiseur de requête à comprendre ce qui a du sens. Vous pouvez utiliser Force Order mais cela peut être trop rigide. Essayez de vous assurer que votre ordre de jointure commence par les tables où datatables seront réduites par le biais des clauses where.

J'ai un exemple clair de jointure interne affectant la performance. C'est une simple jointure entre deux tables. L'un comptait plus de 50 millions de documents, l'autre en comptait 2 000. Si je choisis de la plus petite table et rejoins la plus grande cela prend 5+ minutes.

Si je choisis de la plus grande table et joint la plus petite cela prend 2 min 30 secondes.

C'est avec SQL Server 2012.

Pour moi, cela est contre-intuitif puisque j'utilise le plus grand set de données pour la requête initiale.

JOIN command JOIN n'a pas d'importance, le moteur de requête va réorganiser sa command en fonction des statistics pour les index et autres.

Pour le test, procédez comme suit:

  • select afficher le plan d'exécution réel et exécuter la première requête
  • modifier la command JOIN et réexécutez la requête
  • comparer les plans d'exécution

Ils doivent être identiques car le moteur de search les réorganisera en fonction d'autres facteurs.

Comme commenté sur d'autres, vous pouvez utiliser OPTION (FORCE ORDER) pour utiliser exactement l'ordre que vous voulez mais peut-être ce ne serait pas le plus efficace.

En règle générale, l'ordre JOIN devrait être avec la table des moindres loggings en haut, et la plupart des loggings durent, comme certains moteurs de SGBD l'ordre peut faire la différence, et si la command FORCE ORDER a été utilisée pour limiter les résultats .

Habituellement non. Je ne suis pas 100% cela s'applique textuellement à Sql-Server, mais dans Postgres le planificateur de requêtes se réserve le droit de réorganiser les jointures internes comme bon lui semble. L'exception est lorsque vous atteignez un seuil au-delà duquel il est trop cher d'étudier la modification de leur command.

Faux. SQL Server 2005 est important car vous limitez l'set de données à partir du début de la clause FROM. Si vous commencez avec 2000 loggings au lieu de 2 millions, votre requête sera plus rapide.