2014-10-22 32 views
1

在下面兩個查詢之間的性能和輸出方面是否有任何基本差異?使用臨時表加入性能問題

select * from table1 
left outer join table2 on table1.col=table2.col 
    and table2.col1='shhjs' 

select * into #temp from table2 where table2.col1='shhjs' 

select * from table1 left outer join #temp on table1.col=#temp.col 

這裏表2有記錄的數量龐大,同時#TEMP有較少量。

+1

通常情況下,單語句查詢總是會給多語句查詢提供最佳性能。只要索引查詢可以在第一個查詢的執行計劃內獲得將是最好的。 – 2014-10-22 11:27:23

+0

這是不正確的。有時單語句查詢變得過於複雜而無法有效優化,或者基數估計錯誤會導致查詢的後續部分運行速度變慢。 – 2014-10-22 12:19:38

+0

如果你選擇去你的第二條路線,把你的第一條命令改成'SELECT DISTINCT col INTO #temp FROM table2 WHERE table2.col1 ='shhjs''對於兩條路徑,將SELECT * FROM table1中的*更改爲你需要的列。 – programmer43229 2014-10-22 15:02:09

回答

0

是的,有。第二種方法是在臨時數據庫中實現一個表,這需要額外的開銷。

第一種方法不需要這種開銷。而且,它可以更好地優化。例如,如果table2(col, col1)上存在索引,則第一個版本可能會利用它。第二個不會。

但是,您可以隨時使用您的數據在您的系統上嘗試兩次查詢,並確定是否明顯勝過其他數據。