ゴースト クリーンアップ プロセスは、削除対象としてマークされているページからレコードを削除するシングル スレッドのバックグラウンド プロセスです。 次の記事では、このプロセスの概要について説明します。
ゴースト レコード
インデックス ページのリーフ レベルから削除されたレコードは、ページから物理的に削除されません。代わりに、レコードは "削除対象" または "ゴースト" としてマークされます。 つまり、行はページ上にとどまりますが、行ヘッダーで少し変更され、行が実際にはゴーストであることを示します。 これは、削除操作中のパフォーマンスを最適化するためのものです。 ゴーストは行レベルのロックに必要ですが、古いバージョンの行を維持する必要があるスナップショットの分離にも必要です。
ゴースト レコードのクリーンアップ タスク
削除対象としてマークされたレコードまたは ゴースト化されたレコードは、バックグラウンド ゴースト クリーンアップ プロセスによってクリーンアップされます。 このバックグラウンド プロセスは、削除トランザクションがコミットされた後、ページから物理的にゴースト レコードを削除した後に実行されます。 ゴースト クリーンアップ プロセスは、間隔 (SQL Server 2012 以降では 5 秒ごと、SQL Server 2008/2008R2 の場合は 10 秒ごと) に自動的に実行され、ページがゴースト レコードでマークされているかどうかを確認します。 いずれかが見つかると、削除対象としてマークされたレコードまたは ゴースト化されたレコードが、実行ごとに最大 10 ページに触れて削除されます。
レコードがゴースト化されると、データベースはゴースト エントリを持つものとしてマークされ、ゴースト クリーンアップ プロセスはこれらのデータベースのみをスキャンします。 また、ゴースト クリーンアップ プロセスでは、すべてのゴースト レコードが削除されると、データベースは "ゴースト レコードがありません" としてマークされ、次回の実行時にこのデータベースはスキップされます。 このプロセスでは、共有ロックを有効にできないデータベースもスキップされ、次回の実行時に再試行されます。
次のクエリでは、1 つのデータベースに存在するゴースト レコードの数を特定できます。
SELECT sum(ghost_record_count) total_ghost_records, db_name(database_id)
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED')
group by database_id
order by total_ghost_records desc
ゴースト クリーンアップを無効にする
削除が多い負荷の高いシステムでは、ゴースト クリーンアップ プロセスによって、ページがバッファー プールに保持され、IO が生成されるというパフォーマンスの問題が発生する可能性があります。 そのため、 トレース フラグ 661 を使用してこのプロセスを無効にできます。 ただし、プロセスを無効にするとパフォーマンスに影響します。
ゴースト クリーンアップ プロセスを無効にすると、データベースが不必要に大きくなり、パフォーマンスの問題につながる可能性があります。 ゴースト クリーンアップ プロセスではゴーストとしてマークされているレコードが削除されるため、このプロセスを無効にすると、これらのレコードがページに残り、SQL Server でこの領域が再利用されなくなります。 これにより、SQL Server は新しいページにデータを強制的に追加し、データベース ファイルが肥大化し、 ページ分割が発生する可能性もあります。 ページ分割は、実行プランを作成するとき、およびスキャン操作を実行するときのパフォーマンスの問題につながります。
ゴースト クリーンアップ プロセスが無効になったら、ゴースト レコードを削除するために何らかのアクションを実行する必要があります。 1 つのオプションは、ページ上でデータを移動するインデックス再構築を実行することです。 もう 1 つのオプションは、(すべてのデータベース データ ファイルをクリーンアップするために) sp_clean_db_free_space を手動で実行するか 、( 単一のデータベース データ ファイルをクリーンアップするために) sp_clean_db_file_free_spaceして、ゴースト レコードを削除することです。
警告
一般に、ゴースト クリーンアップ プロセスを無効にすることはお勧めしません。 運用環境に永続的に実装される前に、制御された環境で十分にテストする必要があります。