分享方式:


幽靈清理流程指南

幽靈清理是一個背景程序,會實體移除 DML 陳述中標記刪除的列。 以下文章概述了此過程。

幽靈划船

從索引葉節點層頁面刪除的列,並不會從頁面上實體移除。 相反地,這行會被標記為將來移除,或是標記為ghosted。 這表示該列仍留在頁面上,但列頭會改變位元,表示該列為幽靈。 這是為了最佳化刪除作業期間的效能。 幽靈對於列層鎖定以及快照隔離交易是必要的,因為資料庫引擎必須維護較舊的列版本。

鬼魂清理任務

標記為刪除或幽靈化的列,當不再需要時,會由背景幽靈清理程序進行清理。 幽靈清理會定期執行,並檢查是否有頁面出現重影列。 如果找到,就會物理移除這些列。 資料庫引擎實例中所有資料庫都有一個單一的幽靈清理執行緒。

當某列被重影時,資料庫會被標記為有重影條目。 幽靈清理程序只掃描此類資料庫。 幽靈清理程序在移除所有幽靈列後,也會將資料庫標記為沒有幽靈列,並在下次執行時跳過該資料庫。 如果無法取得資料庫的共享鎖,這個程序也會跳過任何資料庫。 下一次執行時,它會重試資料庫的鎖定獲取。

以下查詢會回傳資料庫中大約的殭屍列數。

SELECT SUM(ghost_record_count) AS total_ghost_records,
       DB_NAME(database_id) AS database_name
FROM sys.dm_db_index_physical_stats(NULL, NULL, NULL, NULL, 'SAMPLED')
GROUP BY database_id
ORDER BY total_ghost_records DESC;

關閉幽靈清理

在高負載且具有大量刪除的系統中,如果幻影清理過程將緩衝區中許多頻繁存取的頁面替換成包含幻影列的其他頁面,可能會降低性能。 因此,經常存取的頁面必須從磁碟重新讀取,產生額外的磁碟 I/O 並增加查詢延遲。 如果發生這種情況,你可以使用 trace flag 661 關閉幽靈清理。

如果沒有幽靈清理,資料庫可能會不必要地膨脹,進而因額外的 I/O 和記憶體消耗而降低效能。 由於幽靈清理程序會移除標記為幽靈的列,停用該程序會讓這些列留在頁面上,防止資料庫引擎重複使用此空間。 這迫使資料庫引擎必須將資料加入新頁面,導致資料庫檔案臃腫,也可能導致 頁面分割。 頁面分割會增加磁碟 I/O,進而降低查詢效能。 如果關閉幽靈清理,資料庫可能會空間不足。

警告

不建議永久停用幽靈清理流程。

在關閉幽靈清理時移除幽靈列,請重建刪除資料表的索引。 重建索引時,會從現有資料建立新頁面,過程中省略重影列。