積極的索引不足和缺少索引的數據
我知道我的數據庫上有很多阻塞,並且已盡力按供應商進行排序,因為此應用程序受他們支持並且尚未產生任何成功的結果。時不時地,我們遇到阻塞問題,這種阻塞變得如此嚴重,而且它們的設計如此糟糕,以至於整個門戶都崩潰了,除非並且直到我殺死幾個持有獨占鎖的 SPID(大部分)。
我已經使用 sp_blitzindex 快一年了,並且是 Brent Ozar 先生和團隊提供的 First Responder Kit 的忠實粉絲。當我對該發生阻塞的數據庫執行 sp_blitzindex 時,它顯示 - “ Aggressive Under-Indexing: Total lock wait time > 5 minutes (row + page) with long average waits ” 優先級為 10。我檢查了URL列和還檢查了其他相關頁面,但無法獲得太多幫助。
我知道這裡列出的表索引不足,需要創建更多索引,但是當我使用以下命令在表級別單獨執行這些對象的 sp_blitzindex 時,需要創建更多索引:
EXEC dbo.sp_BlitzIndex @DatabaseName='db1', @SchemaName='sch', @TableName='tab1';
我根本沒有得到任何缺失的索引詳細資訊。所有現有索引都被利用並且讀取計數小於寫入計數,此處突出顯示的唯一問題在主鍵的“鎖定等待”列中。
我不知道需要創建哪個列索引。我還檢查了 sp_blitzlock 以查看是否可以收集更多資訊,這將有所幫助,但是我看到的所有資訊都存在很多死鎖,並且列出了相同的對象,這些對像被認為是激進的索引不足。
還通過在此特定數據庫中將排序順序作為“讀取”和“持續時間”傳遞來檢查 sp_blitzcache 的輸出,但沒有失去索引請求。有警告說“未參數化查詢”和“未參數化查詢,非 SARGables”,這些計劃涉及不同的表集。
非常感謝任何幫助。
Version: Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Sep 7 2018 01:37:51 Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
免費單位
由於您使用的是First Responder Kit,因此我將堅持在我的範例中使用它來教您如何進一步診斷。
沒有缺失索引?
為什麼 SQL Server 在 DMV 或查詢計劃中沒有任何缺失的索引請求?
首先,等待
使用
sp_BlitzFirst @SinceStartup = 1;
並查看您的等待統計資訊。如果
LCK_
等待不在您列表的頂部(前 10 名左右),並且如果該Avg ms Per Wait
列沒有顯示超過 1-2 秒的LCK_
等待值,那麼情況可能不會那麼糟糕。我可能會將注意力轉移到其他地方。修飾符
與其用於查看 Reads 或 Duration,不如
sp_BlitzCache
使用它查看以下內容:EXEC sp_BlitzCache @SortOrder = 'writes'; EXEC sp_BlitzCache @SortOrder = 'avg writes';
您可能會發現一次修改大量數據的查詢。如果這樣做,將它們更改為批量修改可以減少鎖定成本。
這種方法的問題在於,當您查找它們時,它依賴於記憶體中的執行計劃。由於各種原因,它們可能不是。
由於您正在執行
sp_BlitzCache
,請注意警告匯總中的行(第二個輸出);常見問題
長鎖可能來自最終使用者可能不會注意到的地方,例如索引維護。
如果這是源頭,您可能需要考慮縮減執行維護的碎片級別(50-80%)、維護頻率(每週或每月),或者根本不這樣做,只更新統計資訊(侵入性小得多,不易阻塞)。
尋找使用 的程式碼模式
BEGIN TRAN
,然後在送出之前做大量的工作。這需要您進行程式碼審查。這裡沒有捷徑,這通常是您希望監控工具做的事情。尋找具有級關聯作
sp_BlitzIndex
的外鍵。這些可能會導致大量的鎖定。希望這可以幫助!