次の方法で共有


MSSQLSERVER_8645

適用対象: SQL Server

詳細

属性
製品名 SQL Server
イベント ID 8645
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 MEMTIMEDOUT_ERR
メッセージ テキスト リソース プール '%ls' (%ld) でクエリ実行のためのメモリ リソースを待機中にタイムアウトが発生しました。 クエリを再実行してください。

説明

このエラーは、SQL Server 要求がクエリ実行 (QE) メモリを長時間待機していて、メモリが使用できなかった場合に発生します。 クエリ実行メモリは、主に並べ替え操作、ハッシュ操作、一括コピー操作、インデックスの作成と作成に使用されます。 これらの操作のいずれかを実行するクエリは、メモリの許可を要求します。 使用可能なメモリがない場合、クエリはメモリが使用可能になるまで RESOURCE_SEMAPHORE を待機するように設定されます。 20 分以上待機した後にメモリを使用できない場合、SQL Server はエラー 8645 "メモリ リソースがリソース プール 'default' でクエリを実行するのを待っている間にタイムアウトが発生しました。 タイムアウト値は、SQL Server のバージョンによって若干異なります。 sys.dm_exec_query_memory_grantstimeout_secを見ると、サーバー レベルで設定されたタイムアウト値が表示される場合があります。

原因

このエラーは、メモリ許可と、そのメモリが使用可能になるまでの長時間の待機に関連して確認できます。 通常、クエリが完了すると、使用する実行メモリが解放されます。 したがって、このエラーが表示された場合は、タイムアウトしたクエリが他の要求を 20 分以上待機して作業を完了したことを意味します。 使用可能なすべての QE メモリを消費した要求が 1 つだけ存在する場合や、多数の要求があり、そのメモリ許可によって QE メモリが使い果たされる可能性があります。 ワークロードで実行時間の長い要求がある場合は、実行時間を短縮し、使用する QE メモリの量を減らすように対策を講じなければなりません。

ユーザー アクション

リソース ガバナーを使用して特定のワークロードのメモリ プールを制限していない場合は、サーバーの全体的な状態とワークロードを確認できます。 リソース ガバナーを使用している場合は、リソース プールまたはワークロード グループの設定を確認します。

詳細な説明とトラブルシューティングの手順については、「 SQL Server でのメモリ許可によって発生するパフォーマンスの低下またはメモリ不足の問題で説明します。

次の一覧は、前述の記事で詳しく説明した手順をまとめたものです。 これらの手順は、QE メモリ エラーの削減または排除に役立ちます。

  1. SQL Server のどの要求が大きなメモリ許可または QE メモリ コンシューマーであるかを特定します。 詳細については、「 クエリ実行メモリの待機を識別する方法を参照してください。

  2. 並べ替え操作とハッシュ操作を最小限に抑えるか、回避するためにクエリを書き換えます。

  3. SQL Server がメモリ許可を正しく見積もるように、統計を更新し、定期的に更新します。

  4. 特定されたクエリに適したインデックスを作成します。 インデックスによって処理される行の数が多くなり、JOIN アルゴリズムが変更され、許可のサイズが縮小されたり、完全に削除されたりする可能性があります。

  5. 可能な場合は、クエリで OPTION (min_grant_percent = XX、max_grant_percent = XX) ヒントを使用します。

  6. リソース ガバナーを使用して、QE メモリ使用量の影響を特定のワークロードのみに制限します。

  7. SQL Server 2017 および 2019 ではアダプティブ クエリ処理が使用されるため、メモリ許可フィードバック メカニズムを使用して、実行時にメモリ許可のサイズを動的に調整できます。 この機能により、最初にメモリ許可の問題が発生しなくなる可能性があります。

  8. SQL Server のメモリを増やすか、既存の設定を調整します。

    1. 次に示す SQL Server メモリ構成パラメーターを確認します。

      • max server memory - 必要に応じて増やす
      • min server memory
      • min memory per query
    2. 通常とは異なる設定がないか確認します。 必要に応じて、これらを修正します。 SQL Server のメモリ要件の増加を考慮します。 既定と推奨される設定は、 Server メモリの構成 オプションに記載されています。

  9. OS レベル (物理または仮想 RAM) でメモリを増やします。

  10. このサーバー上で、他のアプリケーションやサービスによってメモリが消費されていないか確認します。 あまり重要でないアプリケーションまたはサービスを再構成して、消費するメモリを減らすか、別のサーバーに移動します。 この操作により、外部メモリの負荷を取り除くことができます。

  11. 次の DBCC コマンドを実行して、いくつかの SQL Server メモリ キャッシュ (一時的なメジャー) を解放します。

  • DBCC FREESYSTEMCACHE
  • DBCC FREESESSIONCACHE
  • DBCC FREEPROCCACHE