バッファー プールのスキャンをトリガーする操作は、大容量メモリ コンピューターで実行速度が低下する可能性があります
この記事では、大容量メモリ コンピューターで SQL Server バッファー プールのスキャンが完了するまでに長い時間がかかる場合がある方法について説明します。
適用対象: SQL Server
元の KB 番号: 4566579
現象
Microsoft SQL Server での特定の操作により、バッファー プール (データベース ページをメモリに格納するキャッシュ) のスキャンがトリガーされます。 大規模な RAM (1 TB 以上のメモリ) が搭載されたシステムでは、バッファー プールのスキャンに時間がかかる場合があります。 これにより、スキャンをトリガーした操作の速度が遅くなります。
バッファー プール スキャンの原因となる操作
バッファー プールのスキャンが発生する可能性があるいくつかの操作を次に示します。
- データベースの起動
- データベースのシャットダウンまたは再起動
- AG フェールオーバー
- データベースの削除 (ドロップ)
- データベースからのファイルの削除
- データベースの完全バックアップまたは差分バックアップ
- データベースの復元
- トランザクション ログの復元
- オンライン復元
DBCC CHECKDB
またはDBCC CHECKTABLE
操作
エラー ログに、スキャンに長い時間がかかったことが示されます
SQL Server 2016 SP3、SQL Server 2017 CU23 および SQL Server 2019 CU9 以降、バッファー プール スキャンに時間 (10 秒以上) かかったことを示すエラー メッセージが SQL Server Error ログに追加されました。
バッファー プール スキャンには 14 秒かかりました。データベース ID 7、コマンド 'BACKUP DATABASE'、操作 'FlushCache'、スキャンされたバッファー 115、反復処理されたバッファーの合計204640239、待機時間 0 ミリ秒。 詳細については、「https://go.microsoft.com/fwlink/?linkid=2132602」を参照してください。
長いスキャンを診断するための拡張イベント
また、
スキャンに 1 秒を超える時間がかかる場合、イベントが有効になると、XEvent が次のように記録されます。
name | database_id | elapsed_time_ms | command | operation | scanned_buffers | total_iterated_buffers |
---|---|---|---|---|---|---|
buffer_pool_scan_complete | 7 | 1308 | BACKUP DATABASE | FlushCache | 243 | 19932814 |
Note
XEvent のしきい値が小さいので、より細かく情報をキャプチャできます。
回避策
SQL Server 2022 より前は、この問題を解決する方法はありませんでした。 バッファー プールからクリーン バッファー (DBCC DROPCLEANBUFFERS) を削除するとパフォーマンスが大幅に低下する可能性があるため、バッファー プールをクリアする操作は実行しないことをお勧めします。 メモリからデータベース ページを削除すると、後続のクエリ実行でディスク上のデータベース ファイルからデータが再読み取りされます。 ディスク I/O を介してデータにアクセスするこのプロセスでは、クエリの速度が低下します。
SQL Server 2022 では、バッファー プールスキャンは複数のコアを利用して並列化されるため、この問題は軽減されます。 800 万バッファー (64 GB) ごとに 1 つのタスクがあり、800 万未満のバッファーがある場合でもシリアル スキャンが使用されます。 詳細については、 バッファー プールの並列スキャンを参照してください。
詳細
大きなバッファー プールで発生する可能性がある問題の詳細については、「 SQL Server: Large RAM and DB Checkpointing」を参照してください。