2009-11-02 13 views
1

J'essaie de déterminer les performances d'un SQL généré dans SQL Server 2005.Les performances de SQL Server sont-elles croisées avec les conditions dans l'instruction where de la même manière que les jointures internes avec les conditions dans l'instruction on de la jointure?

Il utilise CROSS JOINS, mais les conditionnels liant les tables croisées sont dans l'instruction where.

J'ai précédemment pensé que toutes les jointures croisées qui ont des instructions où tirer d'abord le produit cartésien complet, puis appliquer le filtre. Toutefois, ce lien suivant sur MSDN suggère différemment.

http://msdn.microsoft.com/en-us/library/ms190690.aspx

Il précise que s'il y a une condition sur une table de croix rejoint, il « se comporter » comme une jointure interne. Il continue en montrant un exemple des résultats similaires d'une jointure interne et d'une jointure croisée w/où conditionnel.

Il ne précise pas ce que la différence de performance est cependant, seulement qu'ils se comportent d'une manière similaire.

Répondre

1
The example given is correct, atleast in a basic query. 

La requête ci-dessous donnera les mêmes temps de plan d'exécution et d'exécution pour les deux requêtes. L'Optimiseur Sql est généralement libre de déplacer les restrictions entre les clauses where et les clauses 'on' lors des opérations de jointure, et j'imagine qu'il en va de même pour les jointures croisées.

select companies.id, contacts.id 
from 
companies 
cross join contacts 
where 
contacts.companyid = companies.id 


select companies.id, contacts.id 
from 
companies 
inner join contacts on contacts.companyid = companies.id 
+0

J'ai entendu parler d'un plan d'explication. Est-ce la même chose qu'un plan d'exécution? – jetimms

+0

drôle, je n'ai jamais entendu parler d'un plan d'exécution! Si vous utilisez SQL Server Management Studio, écrivez votre requête, faites un clic droit, puis faites 'show execution pkan' il décompose la requête en composants de traitement logique et vous montre où le temps/traitement est utilisé. Typiquement, je l'utilise pour déterminer quand les analyses de table se produisent sur les goulets d'étranglement de la requête apparaissent – mrwayne

+0

J'ai techniquement SQL Server Manager, mais je fais tout dans l'outil de requête avancée (www.querytool.com). Cela permet quelque chose de semblable à un plan d'exécution (ou peut-être exactement la même chose.) Je n'ai pas encore tout à fait compris à quoi cela servait, mais avec votre recommandation et celle de Whish, je vais essayer. Merci! – jetimms