2011-10-11 83 views
2

我想知道如果使用表變量比使用內部聯接(選擇)
實施例更多或更少的高性能:SQL INNER JOIN表變量ON VS. INNER JOIN(選擇)ON

DECLARE @tab TABLE(Id int) 
INSERT INTO @tab 
SELECT Id 
FROM SomeTable 
WHERE SomeDate = "10 DAYS AGO" 

SELECT * 
FROM SomeOtherTable 
INNER JOIN @tab t 
ON SomeOtherTable.id = t.id 

--VERSUS-- 

SELECT * 
FROM SomeOtherTable 
INNER JOIN (SELECT Id FROM SomeTable WHERE SomeDate = "10 DAYS AGO") t 
ON SomeOtherTable.id = t.id 

對於大型查詢第一個是如果有更多的維護你必須做幾次相同的連接,但最高性能的是什麼?

問候

+0

怎麼樣SELECT * FROM SomeOtherTable WHERE Id IN(SELECT ID FROM SomeTable WHERE SomeDate =「10 DAYS AGO」)',爲'SomeDate'建立索引幷包含'Id'? –

+0

檢查與MySQL **解釋**,如果我一般沒有錯,你想要一個技巧,使內部(選擇)首先執行,從內向外執行。另外谷歌的SQL查詢優化或SQL連接優化 – Melsi

+0

我假定SQL Server,請讓我知道如果這是正確的。 –

回答

7

SQL Server不維護詳細的統計數據表變量或自動重新編譯以反映較少的顆粒基數信息的變化(不包括TF 2453),所以一般會假定他們輸出的單排。

這意味着有時您會得到次優連接策略。第二個版本可以使用統計信息,也可以避免將中間結果插入臨時對象的開銷。

但是,如果第二個查詢的開銷非常大,因爲SomeDate沒有編入索引,您可能會從實現此前期(與反覆重新評估相比)中獲得改進的性能。

您也可以考慮使用#temp表,因爲這樣可以避免統計問題。 Some people suggest never using a table variable in JOINs