Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Процесс очистки призрака — это однопоточный фоновый процесс, который удаляет записи из страниц, помеченных для удаления. В следующей статье представлен обзор этого процесса.
Фантомные записи
Записи, удаленные с листьевого уровня страницы индекса, физически не удаляются с страницы — вместо этого запись помечается как "для удаления" или призрачная. Это означает, что строка остается на странице, но в заголовке строки изменяется один бит, чтобы обозначить, что строка действительно призрак. Это позволяет оптимизировать производительность во время операции удаления. Призраки необходимы для блокировки на уровне строк, а также для изолированной моментальной фиксации, где необходимо поддерживать старые версии строк.
Задача очистки пустых записей
Записи, помеченные для удаления или обезличенные, удаляются фоновым процессом очистки. Этот фоновый процесс выполняется через некоторое время после фиксации транзакции удаления и физически удаляет удаленные записи с страниц. Процесс очистки призрачных записей выполняется автоматически через определенные интервалы (каждые 5 секунд для SQL Server 2012+, каждые 10 секунд для SQL Server 2008/2008R2) и проверяет, помечены ли какие-либо страницы призрачными записями. Если он находит какие-либо записи, он удаляет те, которые помечены для удаления или как удаленные, затрагивая не более 10 страниц за одно выполнение.
Когда запись становится 'призраком', база данных помечается как содержащая 'призрачные' записи, и процесс очистки 'призраков' будет сканировать только эти базы данных. Процесс очистки призраков также пометит базу данных как «не имеющую фантомных записей», как только все фантомные записи будут удалены, и пропустит эту базу данных при следующем запуске. Процесс также пропустит все базы данных, на которые он не сможет взять общую блокировку, и повторит попытку при следующем запуске.
Приведенный ниже запрос может определить, сколько фантомных записей существует в одной базе данных.
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 (для очистки одного файла данных базы данных), что приведет к удалению фантомных записей.
Предупреждение
Отключение процесса очистки призрака обычно не рекомендуется. Это необходимо тщательно проверить в управляемой среде, прежде чем быть реализованной постоянно в рабочей среде.