我对一个看起来像这样的大表进行查询:
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
在where子句中有几个类似的条件,并且也有很多联接,但这是一个摘要。
实际上,如果@myIdParam为null,则我们不想使用此参数来限制结果。
我不是数据库专家,但是从我的测试看来,此NULL检查是针对每条记录执行的,并且没有以任何方式进行优化。
如果我删除了空检查并假定参数不为空,则查询将立即返回。否则,最多需要十秒钟。
有没有一种方法可以对此进行优化,以便在运行时仅进行一次检查?
@vercelli这可以解决问题。考虑到这个问题实际上是关于可选参数的,我想说它是您链接的那个的重复。
—
Mystagogue
可能是这样,但这是6年前的帖子。也许在SqlServer 2014或2016中有一种新方法。(我在2014年对其进行了测试,没有进行重新编译,并且花了很
—
长时间
由于您的实际查询具有许多可选参数,因此动态SQL将提供最佳性能。有关该主题的完整文章,请参见sommarskog.se/dyn-search.html。
—
丹·古兹曼
@DanGuzman使用问题Vercelli链接中概述的WITH RECOMPILE可以将查询时间从不到一分钟缩短为几乎即时且具有高度选择性的条件。我认为这是平衡性能和可读性的最佳选择。
—
Mystagogue
OPTION(RECOMPILE)