【发布时间】:2015-09-22 23:27:05
【问题描述】:
我有一个 sql proc,其中一些 where 条件看起来像这样:
AND (@p1 is null OR @p1 like '%' + cast(f1 as varchar(max)) + '%')
显然,这是为了允许用户根据需要按特定参数进行过滤,或者不过滤他们传入的 null。我今天在尝试调试查询时注意到的一件奇怪的事情是,当我将此行注释掉时,即使@p1 为空,查询的运行速度也会大大加快。
如果@p1 为空,我希望 SQL 足够聪明,可以忽略其他 OR 条件。我在这里做错了什么还是有更好的方法来实现这一点,以便在满足第一个 OR 条件时 SQL 不会浪费时间处理额外的 OR 条件?还是有一个我不明白的基本问题是关于 SQL 如何检索阻止它这样做的数据?
【问题讨论】:
-
如果要提高性能,可以在查询后使用OPTION(RECOMPILE)。 SQL Server 根据参数新值重新编译查询时间。
-
这种情况下动态生成的 SQL 会提高性能。如果
@p1为空,则完全排除该条件。假设您有许多这些条件,将 SQL 修改为您需要检查的内容会更有效。 -
一般来说,因为编译查询的成本很高,所以会创建一个返回正确结果的计划无论变量的值是什么,并且该计划会被重用。因此,该计划至少必须至少访问具有 f1 字段的表或索引,如果您完全删除该子句,它可以可能生成使用不包含 f1 的索引的计划。要更快。您必须查看计划以了解它们有何不同。
-
我认为这里的任何人都无法比this article by Gail Shaw 更好地回答您的问题。说真的,那太好了。
-
@DMason +1 无论如何都是极好的链接。
标签: sql sql-server-2012