Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Очистка призрака — это фоновый процесс, который физически удаляет строки, помеченные для удаления операторами DML. В следующей статье представлен обзор этого процесса.
Строки призрака
Строки, удаленные со страниц конечного уровня индекса, физически не удаляются с страницы. Вместо этого строка помечается для дальнейшего удаления или привидения. Это означает, что строка остаётся на странице, но в заголовке строки изменяется специальный бит, который указывает на то, что строка имеет статус "призрак". Это позволяет оптимизировать производительность во время операции удаления. Призраки необходимы для блокировки на уровне строк и для транзакций изоляции моментальных снимков, где ядро СУБД должно поддерживать старые версии строк.
Задача очистки призрака
Строки, помеченные для удаления или ставшие призрачными, очищаются в процессе фоновой очистки, когда они больше не требуются. Очистка призрака периодически выполняется и проверяет, имеют ли какие-либо страницы фантомные строки. Если он находит их, он физически удаляет эти строки. Существует один поток очистки призрака для всех баз данных в экземпляре ядра СУБД.
При привидении строки база данных помечается как привидение записей. Процесс очистки призрака сканирует только такие базы данных. Процесс очистки от призрачных строк также помечает базу данных как не имеющую призрачных строк после удаления всех призрачных строк и пропускает эту базу данных при следующем запуске. Процесс также пропускает любую базу данных, если она не может получить общую блокировку базы данных. При следующем запуске она повторяет приобретение блокировки в базе данных.
Следующий запрос возвращает приблизительное количество удалённых строк в базе данных.
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;
Отключение очистки призрака
В системах с высокой нагрузкой и большим количеством удалений процесс очистки призрачных строк может снизить производительность, если он заменяет многие из часто используемых страниц в буферном пуле другими страницами, содержащими призрачные строки. В результате часто доступные страницы должны быть повторно считываются с диска, создавая дополнительные операции ввода-вывода и увеличивая задержку запросов. При этом можно отключить очистку призрака с помощью флага трассировки 661.
Без очистки призраков база данных может увеличиваться ненужно большой, что также может снизить производительность из-за дополнительных операций ввода-вывода и потребления памяти. Поскольку процесс очистки призраков удаляет строки, помеченные как призраки, отключение процесса оставляет эти строки на странице, что предотвращает повторное использование этого пространства ядром СУБД. Это заставляет ядро СУБД добавлять данные на новые страницы, что ведет к раздутию файлов базы данных, а также может привести к разбиениям страниц. Разделение страниц увеличивает объем операций ввода-вывода диска, что может снизить производительность запросов. Если очистка призрака отключена, база данных может выйти из строя.
Предупреждение
Отключение процесса очистки призрака безвозвратно не рекомендуется.
Чтобы удалить строки-призраки при отключенной очистке призраков, перестройте индексы таблиц, где были удалены строки. Перестроение индекса создает новые страницы из существующих данных, пропуская невидимые строки в процессе.
Связанный контент
- Руководство по архитектуре страниц и экстентов