1

使用硬编码的 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)

- 非常慢

4

2 回答 2

3

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

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

于 2013-09-20T16:27:55.217 回答
1

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

但是当您说“Where 1=0”时,数据库仅从语句中就知道条件将始终为 false,并且不会找到任何记录,因此会快速致盲,因为它甚至不需要读取表即可返回给您一个空的结果集

于 2013-09-20T16:31:44.340 回答