Sql-Server
通過過濾聚集索引和附加列來查詢具有 200+ 百萬行的表非常慢
我們有一個表在兩列上有聚集索引:第一個是類型
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
元件的不同值組合工作,這意味著可能不是結果被記憶體,而是查詢計劃被生成和優化。
每次添加新列謂詞時,優化器都會在該列上建構(採樣)統計資訊以計算選擇性。這就是時間去的地方——建立統計數據。在一張大桌子上,即使採樣率很低,這也可能需要一段時間。