我有一個關於對於超過30分鐘,運行一個很簡單的查詢性能問題:聚集JOIN性能問題(SQL SERVER)
SELECT P.pID
,COUNT(T1.ID) AS NB1
,COUNT(T2.ID) AS NB2
,COUNT(T3.ID) AS NB3
,COUNT(T4.ID) AS NB4
,COUNT(T5.ID) AS NB5
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
凡爲每個查詢會在幾毫秒回覆:
ex。
SELECT P.pID
,COUNT(T1.ID) AS NB1
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
GROUP BY P.pID
如果我不使用任何聚合(COUNT或其他任何東西)查詢運行在幾毫秒: 前。 SELECT P.pID
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
顯然,所有指標都設置等等 唯一的「放緩」元素是pid是一個varchar(50),但我不能改變它,在我看來這這裏不是主要問題。
我使用了一個解決方法,包括所有工作正常的工會,但我真的想知道爲什麼這些是如此之久,我怎麼可以優化這一點作爲聚合多個左連接是真正常見的報告項目的東西,不應該這麼慢。
謝謝你的幫助。
[編輯] thx到ARION我有一個很好的查詢工作真的很好。
但我主要關心的是瞭解在用多個左連接編寫查詢的sql引擎中出現了什麼問題。
表DESCR是:在social.msdn.microsoft.com
Table P (500 rows)
pID varchar(50) NOT NULL as primary key
p.* doesn't matter
Table Tn (between 2000 and 8000 rows)
Tn.ID int NOT NULL as primary key
pID varchar(50) NOT NULL as Foreign key
[編輯]由於厄蘭Sommarskog指向我,我的分析誤差。 - 詳細介紹一下答案
請記住:
LEFT JOIN表笛卡爾乘積
我錯了假設笛卡爾乘積可能已被過濾,因爲我總是參考,以相同的表。
感謝
我們需要查看一些數據樣本和表格統計信息 – cctan 2012-02-13 10:23:50
原始查詢的問題不是(僅)緩慢。如果'Tx'表中的行具有普通的'pID',它也可能給出錯誤的結果。 – 2012-02-13 14:46:26