Pourquoi il y a une ÉNORME différence de performance entre la table temporaire et sous-sélection

C'est une question à propos de SQL Server 2008 R2

Je ne suis pas administrateur de base de données, et de loin. Je suis un développeur java, qui a écrire de SQL, de temps à autre. (pour la plupart intégrées dans le code). Je veux savoir si j'ai fait quelque chose de mal ici, et si oui, ce que je peux faire pour éviter qu'il se produise de nouveau.

Q1:

SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...

T1 dispose de 14 rejoint

T2 est le même que T1, avec une exception. (SELECT * from T1 OÙ condition1) est exécutée avant, et stockée dans une table temp.

Ce n'est pas une sous-requête corrélée.

T2:

SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable  JOIN ...

de nouveau, 14 jointures.

La chose qui m'intrigue, c'est maintenant que T1 a pris > 2min, (il a essayé quelques fois, pour éviter la mise en cache pour jouer un rôle), tandis que T2 (les deux requêtes combinées) prend 2sec!!!! Ce qui donne?

  • J'imagine que le nombre estimé de lignes pour SELECT * FROM T1 WHERE condition1 sont très imprécise. La matérialisation dans un #tempTable signifie que SQL Server ne sait exactement combien de lignes vous sera retourné. Vous pouvez poster la version XML de réels plans d'exécution?
InformationsquelleAutor Ward | 2013-05-27