私は、created_byおよびChk1002である出力リストにあるフィールドに非クラスター化インデックスを作成しようとしました。Chk1002という列がどこにもありません。私は here を読んだので、それは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
質問へのコメントで2つの解決策が言及されました。両方を確認してみましょう。
そのコメントは、Paul Randalのブログ投稿 クエリチューニングのアドベンチャー:予期しないキールックアップ を参照しています。これは、カーソルタイプがデフォルトで動的オプティミスティックであることを示しています。 Microsoft Docs から、「楽観的」な部分がすべての問題のあるキールックアップを引き起こしていることがわかります。
楽観的
...
代わりに、タイムスタンプ列の値の比較、またはテーブルにタイムスタンプ列がない場合はチェックサム値を使用して、カーソルに読み込まれた後に行が変更されたかどうかを判断します。
そのため、読み込んだ行が変更されているかどうかを確認するためにキー検索を行う必要があります。
ブログ投稿およびJacob Hによって提案された解決策は、これらの余分なキー検索を完全に回避するために、より制限的なカーソルタイプ(READ_ONLYなど)を使用することです。
非クラスター化インデックスにClaim_Unique_Noをキー列として追加することで、述語をサポートするようにキールックアップの一部を改善できます。 – sp_BlitzErik23時間前
クエリは現在clusteredインデックスを使用してキールックアップを実行しています。
このコメントは、Claim_Unique_No
既存のnonclusteredインデックスのキー列として(スキャンで使用されているもの:IDX_Claim_Audit...
)述語をサポートします(必要な出力リストがすでにサポートされているようです)。