【发布时间】:2014-11-04 20:25:48
【问题描述】:
我有使用以下构造的 T-SQL 查询 (SQL Server 2008/2012):
WHERE (@param1 IS NULL OR column1 = @param1)
AND (@param2 IS NULL OR column2 = @param2)
AND (@param3 IS NULL OR column3 = @param3)
这可以正常工作,并使用 NULL 参数自动优化 WHERE 子句的任何 AND 部分。
但是当我对子查询做同样的事情时,即使参数为 NULL,优化器似乎仍会执行子查询:
WHERE
(@param1 IS NULL OR column1 IN (SELECT column
FROM table
WHERE column = @param1))
AND (@param2 IS NULL OR column2 IN (SELECT column
FROM table
WHERE column = @param2))
AND (@param3 IS NULL OR column3 IN (SELECT column
FROM table
WHERE column = @param3))
我的问题是,为什么优化器甚至会考虑“IN”SELECT,因为参数为 NULL 的事实应该已经“短路”了查询的那部分?
【问题讨论】:
-
据我所知,SQL Server 中没有
short circuit。您需要使用CASE来实现short circuit行为 -
阅读我的this answer 了解 CASE 的使用示例
-
@cha:我非常有信心第一个代码示例按预期工作;这不是我发明的,但我已经使用了一段时间,执行计划证明了预期的行为。第二个代码示例也可以,但执行计划显示子查询仍在执行中。
-
@user640466 。 . .是什么让您认为第一个查询对
or子句做了任何优化? -
@GordonLinoff:查看执行计划以及根据哪些参数是否为 NULL 来确认查询中使用了哪些索引;这是对这种结构的众多引用之一:weblogs.sqlteam.com/jeffs/archive/2007/09/18/…
标签: sql sql-server tsql subquery where-in