簡體   English   中英

SQL Server子句性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM