バッファー プールをスキャンSQL Server操作は、大きなメモリ マシンでは低速です

この記事では、大規模なメモリ マシンSQL Serverバッファー プールのスキャンに長い時間がかかる可能性について説明します。

適用対象:   SQL Server
元の KB 番号:   4566579

要約

特定の操作SQL Serverバッファー プール (データベース ページをメモリに格納するキャッシュ) のスキャンをトリガーします。 バッファー プール のスキャンをトリガーする操作を次に示します。

  • データベースの起動
  • データベースのシャットダウン/再起動
  • AG フェールオーバー
  • データベースの削除
  • データベースからファイルを削除する
  • データベースの完全/差分バックアップ
  • データベースの復元
  • トランザクション ログの復元
  • オンライン復元
  • DBCC CheckDB/CheckTable

メモリ量が多いシステム (1 TB 以上) では、バッファー プールのスキャンに時間がかかるので、スキャンをトリガーした操作が遅くなります。

現在、この問題に対する修正はありません。 問題の操作が迅速に完了する必要がある場合は、次のコマンドを使用してバッファー プールをクリアしてください USE <DatabaseName>; CHECKPOINT; GO

サーバーに複数のデータベースがある場合は、サーバー上のすべてのユーザー データベースに対して上記のコマンドを繰り返します。

サーバー上のすべてのデータベースにチェックポイントが設定された後、コマンドを実行します DBCC DROPCLEANBUFFERS

警告

バッファー プールからクリーン バッファーを削除すると、変更されていないデータベース ページはすべてメモリから削除されます。 これには、ディスク上のデータベース ファイルからデータを読み取る後続のクエリが必要であり、パフォーマンスが大幅に低下する可能性があります。

詳細情報

大きなバッファー プールから発生する可能性のある問題の詳細については、「SQL Server RAM と DB チェックポイント」を参照してください

2017 SQL Server CU23およびSQL Server 2019 CU9から、次のログ記録と XEvents が追加され、長いバッファー プール スキャンの識別に役立ちます。

errorlog メッセージ

スキャンに 10 秒以上かかる場合、次のようにメッセージが出力されます。

バッファー プールのスキャンには 14 秒かかっています。データベース ID 7、コマンド 'BACKUP DATABASE'、操作 'FlushCache'、スキャンされたバッファー 115、反復処理されたバッファーの合計 204640239、待機時間 0 ms。 詳細については https://go.microsoft.com/fwlink/?linkid=2132602 、「'」を参照してください。

XEvent buffer_pool_scan_complete

スキャンに 1 秒以上かかる場合、イベントが有効な場合、XEvent は次のように記録されます。 しきい値を小さくすると、必要に応じて細かい精度でキャプチャできます。

name database_id elapsed_time_ms command 操作 scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 BACKUP DATABASE FlushCache 243 19932814