這是一個關於SQL Server 2008 R2的問題爲什麼臨時表和子查詢之間有巨大的性能差異
我不是DBA,到目前爲止。我是一名Java開發人員,他不得不隨時寫SQL。 (主要嵌入代碼中)。我想知道我在這裏做錯了什麼,如果是的話,我可以做些什麼來避免它再次發生。
Q1:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Q1特徵14聯接
Q2相同Q1,有一個例外。 (SELECT * FROM T1 WHERE condition1)之前執行,並存儲在臨時表中。
這不是一個相關的子查詢。
Q2:
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
再次,14連結。
現在讓我感到困惑的是Q1花費了2分鐘(試了幾次,以避免緩存發揮作用),而Q2(兩個查詢相結合)花了2秒!是什麼賦予了?
我的猜測是'SELECT * FROM T1 WHERE condition1'的估計行數非常不準確。將它物化爲'#tempTable'意味着SQL Server確切地知道將返回多少行。你能發佈兩種實際執行計劃的XML版本嗎? –