【发布时间】:2015-01-26 01:08:34
【问题描述】:
让我们假设以下代码:
CREATE TABLE Foo (V1 INT NULL, V2 INT NOT NULL)
CREATE INDEX niFooV1V2 ON Foo(V1, V2)
DECLARE @searchForV1 INT = NULL
DECLARE @searchForV2 INT = 0
如何编写使用索引查找所有具有指定值 V1 和 V2 的行的查询?
基本上,有一个准确的索引,应该可以通过一次查找找到所有行。但无论我尝试什么,SqlServer 都不会使用索引的两列。
例如我尝试了以下方法:
SELECT * FROM Foo WITH(FORCESEEK) WHERE ((V1 IS NULL AND @searchForV1 IS NULL) OR (V1 IS NOT NULL AND @searchForV1 IS NOT NULL AND @searchForV1 = V1)) AND V2 = @searchForV2
在执行计划中,它为 V1 执行两个独立的索引搜索(一个为 null,一个为非 null),然后为 V2 应用一个过滤器。在我的例子中,第一个索引搜索返回大约 100.000 行,然后扫描 V2 以将结果减少到 100 行。这不是很有效。
解决此问题的另一种方法可能是 IF-Else-Construct,我根据 @searchForV1 是 NULL 还是 NOT NULL 编写两个独立的查询。但这似乎很尴尬……
还有其他选择吗?
【问题讨论】:
标签: sql-server indexing sql-execution-plan