次の方法で共有


MSSQLSERVER_2814

適用対象: SQL サーバー

詳細

属性 Value
製品名 SQL Server
イベント ID 2814
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 PR_POSSIBLE_INFINITE_RECOMPILE
メッセージ テキスト SQLHANDLE %hs、PlanHandle %hs、開始オフセット %d、終了オフセット %d の再コンパイルが無限に行われる可能性があることが検出されました。 前回の再コンパイルの理由は、%d でした。

説明

1 つ以上のステートメントにより、クエリ バッチが少なくとも 50 回再コンパイルされました。 指定したステートメントを修正し、これ以上再コンパイルされるのを回避する必要があります。

次の表に、再コンパイルの理由を示します。

理由コード 説明
1 スキーマの変更
2 統計の変更
3 コンパイルの遅延
4 Set オプションの変更
5 Temp テーブルの変更
6 リモート行セットの変更
7 参照権限の変更
8 クエリ通知環境の変更
9 パーティション ビューの変更
10 カーソル オプションの変更
11 オプション (再コンパイル) の要求

ユーザーの操作

  1. 次のクエリを実行して、再コンパイルの原因になっているステートメントを確認します。 sql_handlestarting_offsetending_offsetplan_handle の各プレースホルダーを、エラー メッセージで指定された値に置き換えます。 アドホックおよび準備済みの Transact-SQL ステートメントの場合、 database_name 列と object_name 列は NULL です。

    SELECT DB_NAME(st.dbid) AS database_name,  
        OBJECT_NAME(st.objectid) AS object_name,  
        st.text  
    FROM sys.dm_exec_query_stats AS qs  
    CROSS APPLY sys.dm_exec_sql_text (0x01000600B74C2A1300D2582A2100000000000000000000000000000000000000000000000000000000000000 /* replace the 0x01000600B... value with the actual sql_handle*/) AS st  
    WHERE qs.statement_start_offset = 123 /*replace 123 with actual starting_offset value*/  
    AND qs.statement_end_offset = 456 /*replace 456 with actual ending_offset value*/
    AND qs.plan_handle = 0x06000100A27E7C1FA821B10600 /*replace 0x06000100A27E7C1FA821B10600with actual plan_handle value*/;
    
  2. 理由コードの説明に基づいて、再コンパイルを回避するようにステートメント、バッチ、またはプロシージャを修正します。 たとえば、ストアド プロシージャに 1 つ以上の SET ステートメントが含まれていることがあります。 これらのステートメントはプロシージャから削除する必要があります。 再コンパイルの理由と解決策のその他の例については、「SQL Server 2005 のバッチのコンパイル、再コンパイル、およびプランのキャッシュに関する問題」を参照してください。

  3. 問題が継続して発生する場合は、マイクロソフト カスタマー サポート サービスに問い合わせてください。

参照

SQL:StmtRecompile イベント クラス