Руководство по процессу очистки фантомных записейGhost cleanup process guide

Процесс очистки фантомных записей представляет собой однопоточный фоновый процесс, удаляющий записи со страниц, которые были помечены для удаления.The ghost cleanup process is a single-threaded background process that deletes records off of pages that have been marked for deletion. В следующей статье приводится обзор этого процесса.The following article provides an overview of this process.

Фантомные записиGhost records

Записи, которые удаляются с конечного уровня страницы индексов, физически не удаляются со страницы — запись помечается как подлежащая удалению или фантомная.Records that are deleted from a leaf level of an index page aren't physically removed from the page - instead, the record is marked as 'to be deleted', or ghosted. Это означает, что строка остается на странице, но меняется в строке заголовка, чтобы указать, что она действительно является фантомной.This means that the row stays on the page but a bit is changed in the row header to indicate that the row is really a ghost. Это позволяет оптимизировать производительность во время операции удаления.This is to optimize performance during a delete operation. Фантомные записи необходимы для блокировки на уровне строк. Они также нужны для изоляции моментального снимка, когда требуется сохранить более старые версии строк.Ghosts are necessary for row-level locking, but are also necessary for snapshot isolation where we need to maintain the older versions of rows.

Задача очистки фантомных записейGhost record cleanup task

Записи, помеченные для удаления (или фантомные), очищаются в ходе фонового процесса очистки фантомных записей.Records that are marked for deletion, or ghosted, are cleaned up by the background ghost cleanup process. Этот фоновый процесс иногда выполняется после фиксации операции удаления и физически удаляет фантомные записи со страниц.This background process runs sometime after the delete transaction is committed, and physically removes ghosted records from pages. Процесс очистки фантомных записей запускается автоматически через определенный интервал (каждые 5 секунд для SQL Server 2012 и более поздних версий, каждые 10 секунд для SQL Server 2008/2008 R2) и ищет все страницы, помеченные как имеющие фантомные записи.The ghost cleanup process runs automatically on an interval (every 5 seconds for SQL Server 2012+, every 10 seconds for SQL Server 2008/2008R2) and checks to see if any pages have been marked with ghost records. При обнаружении таких страниц процесс удаляет записи, помеченные для удаления (или фантомные), захватывая максимум 10 страниц при каждом выполнении.If it finds any, then it goes and deletes the records that are marked for deletion, or ghosted, touching at most 10 pages with each execution.

Если запись является фантомной, база данных помечается как имеющая фантомные записи и процесс очистки фантомных записей будет проверять только эти базы данных.When a record is ghosted, the database is marked as having ghosted entries, and the ghost cleanup process will only scan those databases. После удаления всех фантомных записей процесс очистки также пометит базу данных как не имеющую фантомных записей и пропустит ее во время следующего выполнения.The ghost cleanup process will also mark the database as 'having no ghosted records' once all ghosted records have been deleted, and it will skip this database the next time it runs. Процесс также будет пропускать все базы данных, к которым он не может применить общую блокировку, и повторит попытку во время следующего запуска.The process will also skip any databases it is unable to take a shared lock on, and will try again the next time it runs.

Приведенный ниже запрос позволяет определить количество фантомных записей, существующих в одной базе данных.The below query can identify how many ghosted records exist in a single database.

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

Отключение очистки фантомных записейDisable the ghost cleanup

В системах с высокой нагрузкой и большим количеством операций удаления процесс очистки фантомных записей может вызвать проблемы с производительностью, связанные с сохранением страниц в буферном пуле и созданием операций ввода-вывода.On high-load systems with many deletes, the ghost cleanup process can cause a performance issue from keeping pages in the buffer pool and generating IO. Поэтому этот процесс можно отключить с помощью флага трассировки 661.As such, it is possible to disable this process with the use of trace flag 661. Дополнительные сведения об этом см. в статье о параметрах настройки для SQL Server при выполнении высокопроизводительных рабочих нагрузок.More information about this can be found in Tuning options for SQL Server when running high performance workloads. Однако отключение процесса оказывает влияние на производительность.However, there are performance implications from disabling the process.

Отключение процесса очистки фантомных записей может привести к ненужному увеличению базы данных и возникновению проблем с производительностью.Disabling the ghost cleanup process can cause your database to grow unnecessarily large and can lead to performance issues. Так как процесс очистки фантомных записей удаляет записи, помеченные как фантомные, после его отключения эти записи будут оставаться на странице и SQL Server не сможет использовать это пространство повторно.Since the ghost cleanup process removes records that are marked as ghosts, disabling the process will leave these records on the page, preventing SQL Server from reusing this space. В результате SQL Server принудительно добавляет данные на новые страницы, что приводит к чрезмерному увеличению файлов базы данных и может также стать причиной разбиений страниц.This forces SQL Server to add data to new pages instead, leading to bloated database files, and can also cause page splits. Разбиения страниц снижают производительность при создании планов выполнения и проведении операций сканирования.Page splits lead to performance issues when creating execution plans, and when doing scan operations.

После отключения процесса очистки фантомных записей необходимо выполнить определенное действие по удалению фантомных записей.Once the ghost cleanup process is disabled, some action needs to be taken to remove the ghosted records. Одним вариантом является перестроение индекса для перемещения данных на страницах.One option is to execute an index rebuild, which will move data around on pages. Другой вариант заключается в запуске хранимой процедуры sp_clean_db_free_space (для очистки всех файлов базы данных) или sp_clean_db_file_free_space (для очистки одного файла данных базы данных) вручную для удаления фантомных записей.Another option is to manually run sp_clean_db_free_space (to clean all database data files) or sp_clean_db_file_free_space (to clean a single database datafile), which will delete ghosted records.

Предупреждение

Обычно не рекомендуется отключать процесс очистки фантомных записей.Disabling the ghost cleanup process is not generally recommended. Перед окончательным отключением процесса в рабочей среде необходимо провести соответствующую тщательную проверку в управляемой среде.Doing so should be tested thoroughly in a controlled environment before being implemented permanently in a production environment.

Дальнейшие действияNext steps

Отключение процесса очистки фантомных записейDisabling the ghost clean up process
Удаление фантомных записей из одного файла базы данныхRemove ghost records from a single database file
Удаление фантомных записей из всех файлов базы данныхRemove ghost records from all database data files