我只是認爲,我的查詢:如何重寫查詢以適應羣集索引?
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON (X.A = Y.Name OR X.B = Y.Name)
TableB
有CLUSTERED INDEX
ON列Name
因爲它的這個查詢正在採取小時運行。所以我所做的是將這個查詢重寫爲:
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON X.A = Y.Name
UNION
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON X.B = Y.Name
這個在幾秒鐘內運行,或者在最壞的情況下運行幾分鐘。儘管我在理解了自己的理由後明白了理由,但我想知道是否有更簡潔的方式來編寫此查詢。我正在考慮一個CTE,但然後ON X.A = Y.Name
和ON X.B = Y.Name
就像參數,我不知道如何處理這個。
我的實際查詢非常大,所以我想避免重複兩次以獲得UNION
。有什麼建議麼?
+1謝謝。這些鏈接很有幫助!那麼我會堅持下去。我想知道 - 是否有寫這個查詢的緊湊方式(如使用CTE或類似的東西)還是我重複我的查詢兩次? – Legend
你不應該用MS SQL Server來做這件事。我看到這兩篇文章都是針對Oracle的,當我在SQL Server的一個大型(174M行)表上執行最小和最大值時,查詢計劃顯示兩個執行路徑並幾乎立即返回結果。 –
@JasonGoemaat OP表示這不是他真正的查詢。如果不檢查實際的查詢計劃,那麼確定他是否有效使用索引並不是一個好方法。由於一些奇怪的查詢結構,是否可以阻止MSSQL使用索引。 – Matthew