Sql-Server
由於游標,無法降低查詢計劃的成本並擺脫 Key Lookup
我試圖在輸出列表中的欄位上創建一個非聚集索引,這些欄位是 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 游標
該評論指的是 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...