Настройки Ghost Cleanup

10

Я использую базу данных с высокой транзакцией (в среднем ~ 175 тыс. Транзакций в минуту, добавлено и удалено почти 9 млн записей в час)

До недавнего времени это не было большой проблемой, поскольку у нас было ~ 7,5 миллионов записей, добавленных и удаленных, но с последними потоками данных очистка от привидений, похоже, не справляется с очисткой неиспользуемое пространство на таблицах / индексах.

Несколько дней назад мы получили 53 ГБ «Неиспользуемого пространства» в 16 таблицах (в основном 2 из них), поэтому в результате начали изучать процесс очистки от привидений, чтобы он запускался каждые 5 секунд и занимал более 10 страниц.

Мое текущее решение состоит в том, что рано утром я запускаю три потока следующей команды:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

чтобы отследить отставание от прошлой ночи (когда происходит большинство наших удалений)

Мне интересно, есть ли способ изменить настройки по умолчанию с 5 секунд и 10 страниц, чтобы сказать каждую секунду, или запустить более 20 страниц, есть ли способ сделать это, или я должен продолжать просто вращать несколько процедур очистки, чтобы очистить данные, или если есть какие-либо другие действия, которые могут помочь с этим

Повторная индексация выполняется по большинству используемых индексов, по крайней мере, один раз в неделю (большинство происходит через день)

SQL Server 2012 Enterprise SP3_CU8 (обновление до CU9 завтра) в кластере AlwaysOn с высокой доступностью, а также с репликацией (распространение на отдельном сервере)

Ste Bov
источник

Ответы:

4

Мне интересно, есть ли способ изменить настройки по умолчанию с 5 секунд и 10 страниц, чтобы сказать каждую секунду или запустить более 20 страниц

Нет там ни одного. По крайней мере, я не знаю, как сейчас :-)

если есть какие-либо другие действия, которые могут помочь с этим

Из блога Пола Рэндала. Один из методов, который иногда рассматривают люди, заключается в том, чтобы принудить очистку призрака очистить все, выполнив сканирование таблицы или индекса (таким образом поставив в очередь все удаленные записи для задачи очистки призрака).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Есть ли возможность разделить таблицу и очистить старый раздел вместо удаления ? К вашему сведению ... SQL Server 2016 и более поздние версии позволяют также обрезать отдельные разделы.

Кроме того, вы можете (проверить и внедрить) - отключить очистку от призраков (флаг трассировки 661), а затем rebuild index WITH ONLINE = ONопцию, так как вы используете редакцию Enterprise.

Если вы используете AlwaysON (с асинхронным) с репликацией, обязательно включите флаг трассировки 1448 - позволяет считывателю журнала репликации двигаться вперед, даже если асинхронные вторичные реплики не подтвердили получение изменения.

Обязательно прочитайте « Удаление разделенных страниц и перенаправленных призраков» от Пола Уайта, чтобы увидеть, есть ли в ваших таблицах триггеры или столбцы больших объектов, которые могут замедляться.

Кин Шах
источник