Sql-Server

通過過濾聚集索引和附加列來查詢具有 200+ 百萬行的表非常慢

  • April 8, 2020

我們有一個表在兩列上有聚集索引:第一個是類型NVARCHAR(50),第二個是DATETIME2(3)類型。

其他欄目很少。當我們WHERE在聚集索引列上查詢帶有子句的表時,即使結果集是數万行,也會立即收到結果。

但是,如果我們在 where 子句上再添加一個謂詞,查詢會非常慢。十秒鐘後,我停止了它,因為這對我們沒有用。

該表有 200+ 百萬行。

這是超快的查詢:

SELECT *
FROM Table
WHERE Col1 = 'blah' AND Col2 BETWEEN 'date1' AND 'date2'

這是超級慢的查詢:

SELECT *
FROM Table
WHERE Col1 = 'blah' AND Col2 BETWEEN 'date1' AND 'date2' AND BooleanColumn = 1

在我看來,第二個查詢應該使用聚集索引來搜尋行,然後簡單地掃描結果集以過濾掉需要的內容。

是否可以(以某種方式)使第二個查詢快速工作,而無需創建額外的非聚集索引,該索引將包含我們需要過濾的其他列?

這是第二個的查詢計劃:

查詢計劃

https://www.brentozar.com/pastetheplan/?id=BJj28mjvL

第一次執行後,它現在可以快速地為WHERE元件的不同值組合工作,這意味著可能不是結果被記憶體,而是查詢計劃被生成和優化。

每次添加新列謂詞時,優化器都會在該列上建構(採樣)統計資訊以計算選擇性。這就是時間去的地方——建立統計數據。在一張大桌子上,即使採樣率很低,這也可能需要一段時間。

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