[英]SQL Server Where Clause Performance
我有一個SQL查詢,它在where子句中查找10個條件。 我不確定以下哪種方式在性能方面會更好。 我的一些參數很重要,有些是次要的。
如果您能解釋哪個更好,為什么我將不勝感激。
我的參數
DECLARE @ParamImportant1 int, @ParamImportant2 int, @ParamImportant2 int,
@ParamSecondary1 int, @ParamSecondary2 int,@ParamSecondary3 int
第一種方法我有一個包含所有參數的索引。
SELECT
*
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
AND (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
第二種方法使用子查詢或cte划分查詢。
SELECT
*
FROM
(
SELECT
*
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
) X
WHERE (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
使用臨時表的第三種方法
SELECT
*
INTO #MyTemp
FROM MyTable
WHERE Col1 = @ParamImportant1 AND Col2 = @ParamImportant2 AND Col3 = @ParamImportant3
SELECT
*
FROM #MyTemp
WHERE (@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1)
AND (@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2)
AND (@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
在大多數情況下,您的第一個版本應該運行良好:
WHERE Col1 = @ParamImportant1 AND
Col2 = @ParamImportant2 AND
Col3 = @ParamImportant3 AND
(@ParamSecondary1 IS NULL OR ColSec1 = @ParamSecondary1) AND
(@ParamSecondary2 IS NULL OR ColSec2 = @ParamSecondary2) AND
(@ParamSecondary3 IS NULL OR ColSec3 = @ParamSecondary3)
您想要的索引需要從三個重要列開始。 然后,它也可以包括其他列(col1, col2, col3, colsec1, colsec2, colsec3)
。
請注意,索引將通過col1, col2, col3
所有值進行掃描。 也就是說,索引不會減少輔助列的行數。
在大多數情況下,這似乎是合理的。 如果不是這樣,則可能需要多個索引和動態SQL。
避免在參數中使用“智能邏輯”,否則MSSQL無法找出獲取數據的最佳方法。
達到最佳執行計划的最可靠方法是避免SQL語句中不必要的過濾器。
https://use-the-index-luke.com/sql/where-clause/obfuscation/smart-logic
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.