web-dev-qa-db-ja.com

カーソルがあるため、クエリプランのコストを削減できず、キールックアップを削除できません

私は、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

enter image description here

enter image description here

2
Lucy

質問へのコメントで2つの解決策が言及されました。両方を確認してみましょう。

READ_ONLYカーソルを使用する

記事が意味するように、静的および読み取り専用の引数を使用できますか? – Jacob H23時間

そのコメントは、Paul Randalのブログ投稿 クエリチューニングのアドベンチャー:予期しないキールックアップ を参照しています。これは、カーソルタイプがデフォルトで動的オプティミスティックであることを示しています。 Microsoft Docs から、「楽観的」な部分がすべての問題のあるキールックアップを引き起こしていることがわかります。

楽観的
...
代わりに、タイムスタンプ列の値の比較、またはテーブルにタイムスタンプ列がない場合はチェックサム値を使用して、カーソルに読み込まれた後に行が変更されたかどうかを判断します。

そのため、読み込んだ行が変更されているかどうかを確認するためにキー検索を行う必要があります。

ブログ投稿およびJacob Hによって提案された解決策は、これらの余分なキー検索を完全に回避するために、より制限的なカーソルタイプ(READ_ONLYなど)を使用することです。

インデックスを最適化する

非クラスター化インデックスにClaim_Unique_Noをキー列として追加することで、述語をサポートするようにキールックアップの一部を改善できます。 – sp_BlitzErik23時間前

クエリは現在clusteredインデックスを使用してキールックアップを実行しています。

このコメントは、Claim_Unique_No既存のnonclusteredインデックスのキー列として(スキャンで使用されているもの:IDX_Claim_Audit...)述語をサポートします(必要な出力リストがすでにサポートされているようです)。

3
Josh Darnell