Dies ist eine Frage über SQL Server 2008 R2Warum gibt es einen riesigen Performance-Unterschied zwischen temporärer Tabelle und subselect
Ich bin kein DBA, bei weitem. Ich bin ein Java-Entwickler, der von Zeit zu Zeit SQL schreiben muss. (meist in Code eingebettet). Ich möchte wissen, ob ich hier etwas falsch gemacht habe, und wenn ja, was ich tun kann, um zu vermeiden, dass es wieder passiert.
Q1:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Q1 kennzeichnet 14
Q2 verbindet die gleiche wie Q1 ist, mit einer Ausnahme. (SELECT * FROM T1 WHERE condition1) wird zuvor ausgeführt und in einer temporären Tabelle gespeichert.
Dies ist keine korrelierte Unterabfrage.
Q2:
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
wieder, 14 verbindet.
Das Ding, das mich jetzt verwirrt, ist, dass Q1> 2min nahm, (versuchte es ein paar Mal, um Zwischenspeicherung zu vermeiden, eine Rolle zu spielen), während Q2 (beide Abfragen kombiniert) 2sec dauerte !!! Was gibt?
Meine Vermutung wäre, dass die geschätzte Anzahl der Zeilen für 'SELECT * FROM T1 WHERE condition1' sehr ungenau ist. Wenn Sie es in eine '# tempTable' materialisieren, bedeutet dies, dass SQL Server genau weiß, wie viele Zeilen zurückgegeben werden. Können Sie die XML-Version beider tatsächlichen Ausführungspläne posten? –