Sql-Server-2012

索引被刪除後是否繼續使用(數據庫輪詢調查)

  • April 6, 2018

使用數據庫輪詢的開發人員的愚蠢行為如下所示。

我在下面確定了一個查詢,該查詢在特定列上沒有索引

除了使用以下查詢每秒輪詢數據庫之外,開發人員沒有使用 CloseDateTime 上的索引,因此對大約 50,000 行的掃描不斷地訪問數據庫。(請記住,這是在開發中,所以數據集更小)

在通過向開發人員顯示一個查詢向開發人員提供了我們在數據庫上遇到高 CPU 使用率的原因後,他們以各種藉口(例如病毒等)返回。

然後我不得不進一步調查這個問題,這涉及使用 Perfmon 關聯 CPU 使用率,使用 SentryOne Plan Explorer 更仔細地查看查詢的影響,然後最後 - 觀察當我添加一個似乎是的新索引時 CPU 使用率做了什麼失踪。

SPBlitzFirst 的輸出幫助我辨識查詢。 spblitzfirst 的輸出

然後我在哨兵一號計劃瀏覽器中進一步調查了它。我首先註意到“CloseDateTime”上沒有索引(在內部查詢的 where 子句中)

在此處輸入圖像描述

我通過在該列上創建索引來測試我的假設,並觀察到 CPU 使用率突然下降。然後我嘗試刪除這個新創建的索引,期望看到 CPU 使用率再次增加,但它沒有。

我的問題是,即使我們刪除了這個索引,數據庫還會繼續使用它嗎?

在此處輸入圖像描述

 MemberId,
   Sum(RemovedAmount) as Amount,
   Sum(RemovedQty) as Qty,
   PromotionId,
   CheckNo,
   ProcessedDT
   from vm_config..HospitalityTransaction HT with (NOLOCK)
   where exists (Select * from vm_warehouse..TransHeader TH with (NOLOCK) where AssociatedCheckNo = HT.CheckNo and  CloseDateTime between HT.ProcessedDT -1 and HT.ProcessedDT + 1)
     Group By     MemberId, CheckNo, PromotionId, ProcessedDT

不存在的索引根本不存在。

一種可能性是您最初的計劃不是最佳的,可能是由於糟糕的(或只是當時不同的)統計數據。所以你經歷了這個過程:

  • 你有一個不是最優的計劃。
  • 您創建了索引,這使引用該表的現有計劃無效。新計劃很棒!使用索引中的統計數據更精簡的索引。
  • 您刪除了索引,再次強制執行新計劃。這一次,計劃更好,不是因為索引,而是因為更好的統計資訊,可能同時重建或重組表/CI,數據更改等。

這只是一個理論。如果不擷取所有三個州的計劃,就不可能知道,但僅僅因為即使在您刪除索引後性能更好,並不意味著有一些幽靈索引在幫助您。

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