首页 > 解决方案 > SQL Server Where 子句性能

问题描述

我有一个 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)

标签: sqlsql-servertsql

解决方案


避免参数中的“智能逻辑”,否则 MSSQL 无法找出获取数据的最佳方式。

获得最佳执行计划的最可靠方法是避免 SQL 语句中不必要的过滤器。

https://use-the-index-luke.com/sql/where-clause/obfuscation/smart-logic


推荐阅读