我有一个sql proc,其中一些条件看起来像这样:
AND (@p1 is null OR @p1 like '%' + cast(f1 as varchar(max)) + '%')
显然,这是允许用户根据需要过滤特定参数,或者不过滤它们传递的空值。我在尝试调试查询时注意到的奇怪之处在于,当我对此行进行注释时,即使@ p1为null,查询也会运行得更快。
如果@ p1为null,我希望SQL足够聪明,可以忽略其他OR条件。我在这里做错了还是有更好的方法来实现这一点,以便SQL在第一个满足时不会浪费时间和额外的OR条件?或者,我是否有一个基本问题,我不明白SQL如何检索阻止它这样做的数据?
答案 0 :(得分:3)
执行计划基于查询,在创建计划时不考虑@p1
的实际值(或者至少不被认为是计划将用于的唯一值)。
如果数据库决定条件应该被短路,那么即使条件的第二部分可以使用索引并更有效地消除记录,它也必须实际评估每条记录的条件。
通常将查询转换为通常比为每条记录计算表达式更有效的内容。然而,对于某些特定值,这可能会降低效率。
答案 1 :(得分:2)
因为SQL是声明性的,而不是程序性的。因此,执行顺序不是由用户控制的,并且不是由写入语句的顺序指示的。您描述了您想要的内容, RDBMS 决定如何最好地满足您的请求。