查询优化; Table.Column = @Param OR @Param IS NULL

Kas*_*hif 1 sql t-sql sql-server sql-server-2008

在WHERE子句中使用类似这样的条件时Table.Column = @Param OR @Param IS NULL它不在列上使用INDEX.

是真的,如果是这样,那么如何编写这种也使用INDEX的查询

查询示例

SELECT Col1, Col2 ...
FROM Table
WHERE (Col1 = @col OR @col IS NULL)
AND   (Col2 = @col2 OR @col2 IS NULL)
AND   (Col3 = @col3 OR @col3 IS NULL)
Run Code Online (Sandbox Code Playgroud)

任何帮助.

Mat*_*lie 5

不幸的是,执行计划的生成并不像您期望的那样.

对于该单个查询,将创建单个计划.在创建该计划时,将选择并修复要使用的索引.无论您提供什么参数,始终使用相同的计划,相同的索引等都无关紧要.

otpimiser 试图找到适合所有事件的最佳计划,但根据这种类型的查询的性质,没有一个.计划产生的一个特征,你根本没有使用索引.


解决方案是使用动态SQL.这感觉不整洁,但如果你使用参数化查询sp_executesql,它实际上可以非常结构化,并且非常高效.

以下是关于该主题的非常有用的文章的链接: 动态搜索

这是非常深入的,但它解决这个问题的一种非常强大的方法.