2009-10-21 27 views
2

有誰能夠解釋我爲什麼這個查詢需要13秒時:T-SQL:如果我使用表變量,爲什麼我的查詢更快?

SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID, COUNT(*) 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 
GROUP BY Table1.Location, Table2.SID, Table2.CID, Table1.VID 

而這一次只需要1秒:

DECLARE @Test TABLE (Location INT, SID INT, CID INT, VID INT) 

INSERT INTO @Test 
SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 

SELECT Location, SID, CID, VID, COUNT(*) 
FROM  @Test 
GROUP BY Location, SID, CID, VID 

當我從第一次查詢中刪除GROUP BY需要只需1秒太。我也嘗試寫一個子選擇符並對結果進行分組,但它也需要13秒。我並不是無視這一點。

回答

1

如果您對每個在GROUP BY列(或各一個,或所有列的組合單一指數)

臨時版本效果更好的原因的索引GROUP BY可能會表現得更好可能是因爲GROUP BY是在一個更小的數據子集上執行的,因此即使沒有索引也是快速的。

您的臨時表方法絕不是這樣做的錯誤方法。這是您衡量每種方法的專業和客觀的情況之一。主表上的索引可能會降低插入/更新速度並增加數據庫大小。但是,一旦數據大小隨時間增加,臨時表可能無法充分執行。

+0

好的,謝謝。我雖然認爲GROUP BY是在WHERE之後執行的,所以查詢也會將較小的結果集分組。 – Torben 2009-10-21 11:48:10

+1

SQL可以做到這一點,但它也不能。要做的事情越是「猜測」,那麼錯誤發生的可能性就越大。因此,索引或過濾結果可以在這種情況下幫助它。正如Jim G所說,比較執行計劃,它會告訴你究竟有什麼區別。 – 2009-10-21 12:39:33

4

比較兩個查詢的execution plans

+1

+1 - 總是比較你正在努力的任何查詢的執行計劃。 – 2009-10-21 10:34:44

1

可能是您在第一個查詢中進行分組和計數的查詢結果大於第二個查詢中使用較小數據集的查詢的結果。可能是索引問題。一旦你修復了它,不要忘記重新檢查更大的結果集,因爲「更好的」查詢可以在更大的數據集上執行得更好。

相關問題