Sql-Server

具有高鎖定等待的索引 - 如何修復

  • April 6, 2017

我一直在執行dbo.sp_BlitzIndex,並且在我的數據庫的主表上有 4 個有點相似的索引。每個都有大量的等待和升級嘗試。我不確定這些是從哪裡來的。我沒有失去的索引。我沒有看到此表上的搜尋需要很長時間,所以不確定這些是來自選擇還是插入。需要一些關於下一步看哪裡的指示。

CORE.tblCase.idx_tblCase_bClos​​ed_nUserID_PrimaryAgent(2):

行鎖等待:1;總持續時間:0 秒;平均持續時間:0 秒;

頁面鎖等待:85;總時長:92 分鐘;平均時長:1 分鐘;

鎖升級嘗試:100,965;

實際升級:1. 表上的 NC 索引:1

CORE.tblCase.idx_tblCase_bClos​​ed_nActionID_Last_nWorkflowID (27):

行鎖等待:3;總時長:26 秒;平均持續時間:8 秒;

頁面鎖等待:15;總時長:10分鐘;平均持續時間:42 秒;

鎖升級嘗試:31,908;

實際升級:0。表上的 NC 索引:1

CORE.tblCase.idx_tblCase_bClos​​ed_nWorkflowID_nActionID_Last (28):

頁面鎖等待:112;總時長:85分鐘;平均持續時間:46 秒;

鎖升級嘗試:31,748;

實際升級:0。表上的 NC 索引:1

CORE.tblCase.idx_tblCase_bClos​​ed_nCaseID_INC (35):

行鎖等待:2;總時長:13分鐘;平均時長:6 分鐘;

頁面鎖等待:307;總時長:399 分鐘;平均時長:1 分鐘;

鎖升級嘗試:43,090;

實際升級:0。表上的 NC 索引:1

先說明一下 - 嗯,這些結果有些可疑。他們都說同一張表,但同時說“表上的 NC 索引:1”。這意味著我們認為表上只有 1 個索引 - 但您在這裡顯示 4 個。這些可能位於不同的數據庫中,或者 sp_BlitzIndex 程式碼中可能存在錯誤。

除此之外,您還有幾個不同的問題。

**我怎麼知道我是否有阻塞問題?*查看等待統計資訊,它跟踪您的 SQL Server 一直在等待的內容。我個人最喜歡的工具是sp_Blitz @CheckServerInfo = 1, @OutputType = ‘markdown’因為您可以將結果發佈在 Stack 上的問題中。(免責聲明:我為啟動這些腳本的公司工作。)其中一個部分將顯示您最重要的等待 - 首先關注那些。如果您的主要等待類型包括 LCK,那麼您可能遇到了阻塞問題。

**如何找到正在鎖定的查詢?**如果沒有監控軟體,這可能會有點困難。我將從sp_BlitzCache @SortOrder = ‘duration’開始, 這將向您展示執行時間最長的查詢,它有時可以指出涉及阻塞的查詢。但是,您不能真正按表過濾,至少不能很快。

**如何設計正確的索引來支持這些查詢?**這是一個很大的問題。通常,您需要盡可能多的索引來支持您的工作負載,但不要太多索引,以免刪除/更新/插入 (DUI) 操作由於必須獲得大量鎖而減慢速度。如果您的表確實只有一個索引,那麼 DUI 查詢可能會進行表掃描以找到他們想要更新的行。是時候看看在更新時如何訪問這些表了。

例如,假設您有電話簿的經典白頁 - 按姓氏、名字組織。如果您嘗試更新名字為“Brent”的所有使用者,您將不得不掃描整個電話簿,最終可能會出現一些令人討厭的鎖定情況。您希望在名字上創建一個單獨的索引,以便您可以快速找到需要更新的行,然後退出表。

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