2014-10-30 28 views
3

請原諒我,如果這是一個重複和/或明顯的問題,但我無法找到一個滿意的答案,無論是在stackoverflow或其他地方在線。爲什麼嵌套select語句比臨時表處理需要更長的時間?

使用Microsoft SQL Server中,我有一個看起來像這樣的嵌套選擇查詢:

select * 
into FinalTable 
from 
    (select * from RawTable1 join RawTable2) 
    join 
    (select * from RawTable3 join RawTable4) 

而不是使用嵌套選擇,查詢可以使用臨時表來寫,這樣的:

select * 
into Temp1 
from RawTable1 join RawTable2 

select * 
into Temp2 
from RawTable3 join RawTable4 

select * 
into FinalTable 
from Temp1 join Temp2 

雖然等同,但第二個(非嵌套)查詢的運行速度比第一個(嵌套)查詢快幾個數量級。在我的開發服務器和客戶端服務器上都是如此。爲什麼?

+4

你的答案就在這裏http://stackoverflow.com/questions/16767645/why-is-there-a-huge-performance-difference-between-temp-table-and-subselect – radar 2014-10-30 19:38:39

回答

0

數據庫引擎是在執行時擁有必要的內存子查詢,因爲它們是虛擬的不是物理,優化器不能選擇最佳路線,或至少直到在計劃中的排序。這也意味着優化器將對每個操作執行多個全表掃描,而不是在臨時表上進行可能的索引查找。

考慮每個子查詢是一個雜耍球。您爲數據庫引擎提供的子查詢越多,一次處理的東西就越多。如果使用臨時表批處理代碼簡化了此操作,則優化程序在大多數情況下(無論索引是否也如此)找到了清除路由,至少對於更新版本的SQL Server而言。

相關問題