如果我用一个变量替换sql server查询中的硬编码1 = 0,它会慢下来

时间:2013-09-20 16:23:27

标签: sql sql-server sql-server-2005

使用硬编码的1 = 0和1 = 1值测试查询。当我为它们替换变量时,查询会慢下来。和建议?

DECLARE @BoxType int
SET @BoxType = 2

Select blah from table t
INNER JOIN table2 t2
    ON (t2.blah = t.blah AND 1=1 OR t2.blah = t.blah AND 1=0)

- 非常快

使用重写:

...
INNER JOIN table t
    ON (t2.blah = t.blah AND @BoxType = 2 OR t2.blah = t.blah AND @BoxType = 1)

- 非常慢

2 个答案:

答案 0 :(得分:3)

t2.blah = t.blah AND 1=0将始终为false,因此可以在编译时进行优化。

如果您说@BoxType <> 1时第二个查询速度较慢且您使用的是SQL Server 2008+,则可以尝试将OPTION (RECOMPILE)添加到查询中以获得相同的编译时间简化,具体取决于实际情况变量的值。

答案 1 :(得分:1)

评论有点触及这一点。当你说“Where MyField = 1”时,数据库不知道它会找到哪些行,因此必须实际搜索它们。如果该字段上有索引,则可能相当快。如果没有索引,那么需要扫描的表可能会很长。

但是当你说“Where 1 = 0”时,数据库只是从语句中知道条件总是为假并且没有找到记录所以会快速致盲,因为它甚至不需要读取表格返回给你一个空的结果集