運行以下查詢後:SQL服務器 - 索引未使用
SELECT [hour], count(*) as hits, avg(elapsed)
FROM myTable
WHERE [url] IS NOT NULL and floordate >= '2017-05-01'
group by [hour]
執行計劃基本上是一個聚集索引掃描的PK(INT,自動遞增,工作的97%)
的事情是:URL
上有一個索引(普通索引,因爲我一直在尋找一個精確匹配),floordate
的索引還...
爲什麼他們沒有被使用?我怎樣才能加快這個查詢?
PS:表是70M的項目長,這個查詢需要大約9分鐘運行
編輯1
如果我不使用仍然在我的指數(選擇或過濾器)一列,將其使用?通常我也爲clientId
(在整個數據庫中大約有300個唯一字符)和hour
(24個唯一字符)篩選/篩選...
如果這些列沒有包含在您提到的索引中,那麼列「hour」和「Elapsed」如何處理?查詢將需要在聚集索引中查找以獲取這些值。 –
單個列上的索引不包括整個查詢('hour'和'elapsed'仍然需要查找),如果大多數行具有'url'' NOT NULL',那麼'url'上的索引isn'完全有用。所有這一切都取決於引擎估計將由'floordate> ='2017-05-01'覆蓋多少行以及聚集索引查找是否會直接掃描它。如果你的統計數據過時了,這個估計值可能會大幅下降。在做任何事情之前嘗試更新它們(下一個邏輯步驟是在該索引中包含「INCLUDE」列)。 –
您可以通過count(1)替換count(*),並且它可能有助於提高一些時間。 – SAJ