Один из возможных сценариев, который меня очень забавляет:
- Строки были изначально записаны, когда в базе данных не было включено чтение зафиксированного снимка (RCSI), изоляция моментального снимка (SI) или группы доступности (AG)
- RCSI или SI был включен, или база данных была добавлена в группу доступности
- Во время удаления в удаленные строки была добавлена 14-байтовая временная метка для поддержки чтения RCSI / SI / AG.
Поскольку этот сервер является основным в AG, он подвержен влиянию вторичных серверов. Информация о версии добавляется на основной - страницы данных одинаковы как на основных, так и на дополнительных. Вторичные серверы используют хранилище версий для чтения, пока строки обновляются AG, но вторичные серверы не записывают свои собственные версии метки времени на страницу. Они просто наследуют версии от работы первичного.
Чтобы продемонстрировать рост, я взял экспорт базы данных Stack Overflow (для которого не включен RCSI) и создал несколько индексов для таблицы Posts. Я проверил размеры индекса с помощью sp_BlitzIndex @Mode = 2 (скопировать / вставить в электронную таблицу и немного очистить, чтобы максимизировать плотность информации):
Затем я удалил около половины строк:
BEGIN TRAN;
DELETE dbo.Posts WHERE Id % 2 = 0;
GO
Забавно, что в то время, как происходило удаление, файл данных увеличивался и для размещения временных меток! Отчет об использовании дисков SSMS показывает события роста - вот только верхняя часть для иллюстрации:
(Должен любить демо, где удаление приводит к росту базы данных.) Пока выполнялось удаление, я снова запустил sp_BlitzIndex. Обратите внимание, что кластеризованный индекс имеет меньше строк, но его размер уже вырос примерно на 1,5 ГБ. Некластеризованные индексы в AcceptedAnswerId значительно выросли - это индексы с небольшим значением, которое в основном равно нулю, поэтому их размеры почти удвоились!
Мне не нужно ждать окончания удаления, чтобы доказать это, поэтому я остановлю демонстрацию там. Суть в том, что: когда вы делаете большие удаления в таблице, которая была реализована до того, как были включены RCSI, SI или AG, индексы (включая кластеризованные) могут фактически расти, чтобы приспособить добавление временной метки хранилища версий.