SQL Server 可以优化以下内容:
DECLARE @id INT;
DECLARE @d1 DATE;
SELECT a, b
FROM t
WHERE id_column = @id
AND date_column >= CAST(CURRENT_TIMESTAMP AS DATE)
AND date_column >= @d1
>
请注意,同一列上有两个运算符。假设今天是2020-12-23
并且d1
可能是2020-12-20
或者2020-12-27
,我希望 SQL Server 会自动使用两个日期中的较大者......2020-12-23
在第一种情况和2020-12-27
后一种情况下。但我不确定。
我在数据库中具有日期列的表上对其进行了测试。
https://www.brentozar.com/pastetheplan/?id=r1V9bJ-av
查看查询计划,在 SQL Server 2019 开发版中,SQL 所做的是扫描当前时间戳和指定日期并创建日期范围。然后它扫描我的表以查找该范围内的行(无)。
起初我以为它是在寻找两个日期之间的范围。
但是在查看逻辑读取时,我认为它所做的是在“CAST(CURRENT_TIMESTAMP AS DATE)”和“NOW”之间搜索几个小时。所以我认为 SQL 完全符合您的预期,即优化同一列上的“>”操作。
Scan count 1, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
此外,如果我将查询更改为执行“OR”而不是“AND”,我会得到 84 次逻辑读取而不是 4 次,并且在索引搜索中返回更多行。这向我表明 SQL Server 2019 足够智能,可以在同一列上使用两个“>”优化查询。
https://www.brentozar.com/pastetheplan/?id=BkbGf1Wpw
现在,根据查询的复杂性或 where 子句中是否有更多条件,这可能并不总是适用。在您的环境中测试它是关键。
因为这两个条件都必须满足,所以结果将基于较大的日期。但是,您可以更改查询以取两个较大的日期,而不是创建 2 个条件: