Sql-Server

由於游標,無法降低查詢計劃的成本並擺脫 Key Lookup

  • May 31, 2018

我試圖在輸出列表中的欄位上創建一個非聚集索引,這些欄位是 created_by 和 Chk1002 。我在任何地方都沒有名為 Chk1002 的列。我在這裡讀到它與 Cursor 有關。

有什麼辦法可以保留游標並降低查詢計劃的成本並擺脫鍵查找?

    DECLARE @ClaimUniqueNo INT
       DECLARE ClaimAudit CURSOR
               FOR
                   SELECT CA.Claim_Audit_ID, CA.Claim_Audit_Action, CA.Create_Date, CA.Created_By, C.Claim_Status
                   FROM dbo.Claim_Audit_Tbl CA LEFT JOIN Claim_Tbl C 
                   ON CA.Claim_Unique_No = C.Claim_Unique_No
                   WHERE CA.Claim_Unique_No = @ClaimUniqueNo
                   ORDER BY Create_Date ASC

在此處輸入圖像描述

在此處輸入圖像描述

在對您的問題的評論中提到了兩種解決方案。讓我們回顧一下它們。

使用 READ_ONLY 游標

正如文章所暗示的,您是否能夠使用 STATIC 和 READ-ONLY 參數?–雅各布 H 23 小時

該評論指的是 Paul Randal 的博文Adventures in query tunes: unexpected key lookups。這指出游標類型預設是動態樂觀的。從Microsoft Docs中,您可以看到“樂觀”部分是導致所有有問題的鍵查找的原因:

OPTIMISTIC

它改為使用時間戳列值的比較,或者如果表沒有時間戳列,則使用校驗和值來確定該行在讀入游標後是否被修改。

因此,它必須進行鍵查找以檢查您讀入的行是否已被修改。

Jacob H 在部落格文章中提出的解決方案是使用更嚴格的游標類型(例如 READ_ONLY),以完全避免這些額外的鍵查找。

優化索引

您可以通過將 Claim_Unique_No 作為鍵列添加到非聚集索引來改進部分鍵查找以支持謂詞。– sp_BlitzErik 23 小時前

該查詢目前正在使用聚集索引進行鍵查找。

該註釋指出,您可以在現有的非聚集索引(掃描中使用的索引:)中添加Claim_Unique_No一個鍵列來支持謂詞(看起來它已經支持您想要的輸出列表)。IDX_Claim_Audit...

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