Sql-Server

SQL Server 是否優化同一列上的兩個“>”操作

  • December 23, 2020

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 子句中是否有更多條件,這可能並不總是適用。在您的環境中測試它是關鍵。

引用自:https://dba.stackexchange.com/questions/282034