2016-02-09 75 views
0

考慮以下查詢:條件聯接基於多個屬性,優化

SELECT 
    * 
FROM Employees E 
JOIN States S ON E.idEmployee = S.idEmployee 
LEFT JOIN Data1 D1 ON S.data1 = D1.data1 
LEFT JOIN Data2 D2 ON S.data2 = D2.data2 
LEFT JOIN Data3 D3 ON S.data3 = D3.data3 

WHERE (S.idStateType = 1 and D1.attribute1 = value) 
    OR (S.idStateType = 2 and D2.attribute2 = value and D2.attribute3 = value) 
    OR (S.idStateType = 3 and (D1.attribute1 = value or D3.attribute3 = value)) 

第二加入(表DATA2)是有效僅當S.idStateType = 2,如果是idStateType <這將成爲不必要> 2。

如果我改變連接條件以取決於idStateType,它會起作用嗎(從optimziation的角度來看,但也是設計視圖)?

它將成爲:

LEFT JOIN data2 DT ON S.idStateType = 2 AND S.data2 = D2.data2 
+1

I.e將這些條件移至「ON」子句。 – jarlh

+0

D1.attribute1 =在哪些更改中加入常規聯接的值 – Paparazzi

+0

@jarlh請您詳細說明一下嗎? – Leon

回答

0

爲您的網站查詢應該是罰款的大部分。 SQL是一種解釋型語言,因此它不一定按照您編寫的順序運行,而是根據它認爲結果的樣子運行它認爲是最有效的順序。如果您想要真正測試結果,請在SSMS的「SQL編輯器」欄中切換「包括實際執行計劃」並以多種方式運行查詢,以查看最有效的方式。

你可以重寫查詢是這樣的:

SELECT 
* 
FROM Employees E 
JOIN States S ON E.idEmployee = S.idEmployee 
LEFT JOIN Data1 D1 ON S.data1 = D1.data1 AND S.idStateType = 1 
    AND D1.attribute1 = value 
LEFT JOIN Data2 D2 ON S.data2 = D2.data2 AND S.idStateType = 2 
    and D2.attribute2 = value and D2.attribute3 = value 
LEFT JOIN Data3 D3 ON S.data3 = D3.data3 AND S.idStateType = 3 
    and (D1.attribute1 = value or D3.attribute3 = value) 

這樣做可能會加快查詢,但實際解釋器將具有基於表結構和索引說了算。使用執行計劃可以幫助確定解釋器如何運行此查詢,並有助於找到最佳的優化方法。

+0

這不會限制S.idStateType爲(1,2,3) – Paparazzi