鬼清理程序是一個單執行緒的背景程序,負責刪除已標示要刪除的頁面記錄。 下面文章提供此過程的概觀。
幽靈記錄
從索引頁面分葉層級刪除的記錄不會從頁面實際移除,而是將記錄標示為「要刪除」或 準刪除。 這意味著行仍然保留在頁面上,但行標頭中有些微變動,以指示該行實際上是一個幽靈。 這是為了最佳化刪除作業期間的效能。 資料列層級鎖定需要幽靈記錄,但對於需要維護舊版資料列的快照隔離也是必要的。
幽靈記錄清理任務
標示為刪除或待刪除的記錄會由背景鬼清理程式清除。 此背景程序會在刪除交易認可後的某個時間執行,並從頁面實際移除被標記刪除的記錄。 幽靈清除程序會按照間隔時間自動運行(SQL Server 2012+ 每 5 秒一次,SQL Server 2008/2008R2 每 10 秒一次),並檢查是否有頁面被標記為幽靈記錄。 如果找到任何,則會然後刪除標示要刪除或已準備刪除的記錄,每次執行時最多觸及 10 頁。
當記錄設為幽靈記錄時,資料庫會標示為具有幽靈記錄,幽靈清理程序僅會掃描這些已標示的資料庫。 準刪除清除程式也會在刪除所有準刪除記錄後,將資料庫標示為「沒有準刪除的記錄」,下次執行時會略過此資料庫。 此程式也會略過無法開啟共享鎖定的任何資料庫,並在下次執行時再試一次。
以下 SQL 查詢可以識別單一資料庫中存在多少筆隱藏記錄。
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
停用幽靈清理
在存在大量刪除操作的高負載系統中,清理幽靈記錄的過程可能會導致性能問題,因其會使頁面留在緩衝池中並生成輸入/輸出操作。 因此,您可以使用 追蹤旗標 661 來停用此程式。 不過,停用進程會產生效能影響。
停用幽靈清理程序可能會導致資料庫不必要地增加尺寸,並可能引發效能問題。 由於鬼影清除程式移除被標示為鬼影的記錄,停用該程式會導致這些記錄保留在頁面上,從而阻止 SQL Server 重複使用此空間。 這會強制 SQL Server 改為將數據新增至新頁面,導致資料庫檔案膨脹,而且也可能造成 頁面分割。 頁面分割會導致建立執行計劃以及執行掃描作業時的效能問題。
一旦關閉鬼資料清理程序,就需要採取一些行動來刪除殘餘的記錄。 其中一個選項是執行索引重建,這會在頁面上移動數據。 另一個選項是手動執行 sp_clean_db_free_space (清除所有資料庫數據檔)或 sp_clean_db_file_free_space (清除單一資料庫數據檔),這會刪除准刪除的記錄。
警告
通常不建議停用幽靈清理程序。 這麼做應該在受控制的環境中徹底測試,再於生產環境中永久實作。