我正在测试一个问题并尝试理解为什么优化器不会优化总是评估为false的条件。这可能会有一个非常简单的答案,但是,它是星期五,我感觉很密集,所以这里:
采取以下三个陈述:
DECLARE @Field1 = 22
DECLARE @Test BIT = 0
SELECT * FROM MyTable WHERE(MyField = @FieldID OR @Test=1)--1. SLOW
SELECT * FROM MyTable WHERE(MyField = @FieldID OR @Test=0)--2. FAST
SELECT * FROM MyTable WHERE(MyField = @FieldID OR 1=0) --3. FAST
SELECT * FROM MyTable WHERE(MyField = @FieldID OR 0=0) --4. FAST
查询1在执行时间中滞后其他查询大约30秒。 无论表中是否存在@FieldID,查询2,3,4都会在1秒内返回数据。
为什么查询1的执行时间比查询3长30? @Test值无法在WHERE语句中更改,因此应该将其视为查询3中的常量值,我认为。