我有以下查询
DECLARE @StartDate DATE = '2017-09-22'
DECLARE @EndDate DATE = '2017-09-23'
SELECT a.col1,
a.col2,
b.col1,
b.col2,
b.col3,
a.col3
FROM TableA a
JOIN TableB b
ON b.pred = a.pred
WHERE b.col2 > @StartDate AND b.col2 < @EndDate
当我运行它并检查实际的执行计划时,我可以看到成本最高的运算符是聚集索引扫描(索引在 a.pred 上)
但是,如果我按如下方式更改查询
SELECT a.col1,
a.col2,
b.col1,
b.col2,
b.col3,
a.col3
FROM TableA a
JOIN TableB b
ON b.pred = a.pred
WHERE b.col2 > '2017-09-22' AND b.col2 < '2017-09-23'
消除了索引扫描并使用了索引查找。
有人可以解释这是为什么吗?在我看来,这与变量中的值可以是任何值有关,因此 SQL 不知道如何计划执行。
有什么办法可以消除表扫描但仍然可以使用变量?(PS,这将被转换为以@StartDate 和@EndDate 作为参数的存储过程)
编辑
col2 是 DATETIME,但是,如果我将变量设为 DATETIME,问题仍然存在