当搜索条件值为空时,查询计划显示 99% 的键查找
Posted
技术标签:
【中文标题】当搜索条件值为空时,查询计划显示 99% 的键查找【英文标题】:query plan shows key lookup with 99% when search condition value is null 【发布时间】: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/… 【参考方案1】:首先,在查询中添加OPTION(RECOMPILE)
:
SELECT col_2,col_3,col_4
WHERE
(@parameter is null OR col_2 = @parameter)
AND col_3='2'
AND col_4=10.00
OPTION(RECOMPILE);
有关详细信息,请参阅 Erland Sommarskog 的优秀文章 Dynamic Search Conditions in T‑SQL。
如果@parameter
不为NULL,则OPTION(RECOMPILE)
的查询实际上变成了这样:
SELECT col_2,col_3,col_4
WHERE
col_2 = <actual_parameter_value>
AND col_3='2'
AND col_4=10.00
col_2,col_3,col_4
上的索引可用于在此查询中快速找到必要的行。
如果@parameter
为NULL,则OPTION(RECOMPILE)
的查询实际上变成了这样:
SELECT col_2,col_3,col_4
WHERE
col_3='2'
AND col_4=10.00
现在很明显,col_2,col_3,col_4
上的索引在这里没有帮助。您需要在 col_3,col_4 include (col_2)
上创建第二个索引以提高效率。
另一方面,具有不同列顺序的单个索引在这两种情况下都会有所帮助。因此,不是在col_2,col_3,col_4
上创建索引,而是在col_4,col_3,col_2
或col_3,col_4,col_2
上创建和索引。将col_2
放在索引定义的最后。在这两种情况下都会有效地使用它(OPTION(RECOMPILE)
)。
【讨论】:
以上是关于当搜索条件值为空时,查询计划显示 99% 的键查找的主要内容,如果未能解决你的问题,请参考以下文章
当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写
gson实体转json时当字段值为空时,json串中就不存在该属于,请问如何在值为空的时候也保留该字符串