查询优化阶段会考虑这个吗?

Leg*_*end 5 sql-server sql-server-2008

我有一个StartDate索引日期列的表.我只是想知道查询优化阶段如何处理以下形式的查询:

SELECT * 
FROM <dbo.TABLE> 
WHERE (StartDate BETWEEN '2010-01-01' AND '2010-01-10')
OR (StartDate BETWEEN '2010-01-05' AND '2010-01-15')
Run Code Online (Sandbox Code Playgroud)

两个日期之间有重叠.我是否应该自己进行优化,给它一个日期,(StartDate BETWEEN '2010-01-01' AND '2010-01-15')或者SQL引擎可以自己优化它?

gbn*_*gbn 5

将它与变量和常量进行比较:计划应该有所不同.

SQL Server可以针对常量进行优化,但旨在重用变量.因此,计划对变量更为通用.当使用常量时,不需要"通用的可重用计划",因为如果常量发生变化,它将是一个新的计划

"变量"计划不会考虑end < start与常量短路的条件.

如对该问题的评论中所述,行为与预期一致

你应该对" 强制参数化 "的常量做同样的事情,但我还没试过.