【发布时间】:2016-10-25 18:36:27
【问题描述】:
我有一个 SP,sp 在一个表上执行,索引在 col_1、col_2、col_3、col_4、col_n 三列中。 Col 1 是一个身份。 col_2,col_3,col_4 上有一个索引。
当我查询类似
@parameter=1
SELECT col_2,col_3,col_4
WHERE col_2=@parameter
AND col_3='2'
AND col_4=10.00
它使用我之前提到的索引,但如果我查询类似
@paramete =null; -- the parameter is null in this case when parameter
has value it uses the index
SELECT col_2,col_3,col_4
WHERE (@parameter is null OR col_2 = @parameter)
AND col_3='2'
AND col_4=10.00
它显示了一个查询计划,其中在 col_1 上进行键查找,成本为 99%。
有时该值为空,我必须保持这种状态。
有人可以解释一下吗?可以修吗?
谢谢。
【问题讨论】:
-
这正是此类查询始终有效的方式。它通常被称为“catch all”查询。这是一篇很棒的文章,讨论了这种类型的查询以及如何修复它。 simple-talk.com/sql/t-sql-programming/…
标签: sql sql-server performance sql-server-2014 sql-execution-plan