假設我有一個表,其中兩列 X 和 Y 是 INT,并且存在其他列。
| X | 是 | 其他價值 |
|---|---|---|
| 1 | 1 | 一種 |
| 1 | 2 | 乙 |
| 2 | 1 | 乙 |
| 3 | 2 | C |
我正在嘗試獲取基于 X 和 Y 的行,其中請求可能需要特定的 X 或 Y,或兩者兼而有之。否則,它可能想要獲取所有行(即沒有給出 X 或 Y)。
SELECT OtherValue
FROM Table
WHERE X = @x
AND Y=@y
我能找到的最接近的建議建議類似于 WHERE X=@x OR @x IS NULL,這對我來說很有意義,但提到了這種糟糕的性能反模式。
還有另一種更好的方法我應該解決這個解決方案嗎?
uj5u.com熱心網友回復:
是的,使用OR運算子可能會破壞 SQL Server 優化器,并且通常意味著您最終會得到一個糟糕的計劃。例如,當從Table表中提取資料時,SQL 需要選擇一個索引,并且只有一個,它將用于從該表中提取所有資料。假設NONCLUSTEREDX 和 Y 上分別存在一個索引,這些選項可能看起來像這樣。
- CLUSTERED SCAN:表掃描 X 或 Y 匹配的所有行。
- 在非聚類索引 X 上搜索(但這不會提供 Y 的詳細資訊)
- 尋找非聚集索引 Y(但這不會提供 X 的詳細資訊)
最終結果通常是對 CLUSTERED INDEX 的掃描。走這條路,SQL Server 知道它可以在一次 INDEX SCAN 中獲取 X 和 Y,而使用任何一個可用的 SEEKS 時都需要多個后續步驟。
現在,如果您在這些列的每一列上都有單獨的 INDEXES,您可以為每個唯一的輸入組合撰寫一個查詢。這最終會更快,因為每個單獨的查詢都使用最適合其結果集的索引。
結果看起來像這樣。
SELECT OtherValue
FROM Table
WHERE X = @x
AND @x IS NOT NULL
AND @y IS NULL
UNION ALL
SELECT OtherValue
FROM Table
WHERE Y=@y
AND @y IS NOT NULL
AND @x IS NULL
UNION ALL
SELECT OtherValue
FROM Table
WHERE X = @x AND @x IS NOT NULL
AND Y = @y AND @y IS NOT NULL
UNION ALL
SELECT OtherValue
FROM Table
WHERE @x IS NULL
AND @y IS NULL
我更多地談論在我的博客OR上使用in的含義。但同樣的邏輯也適用于陳述句。UPDATESSELECT
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443785.html
