недавно я обнаружил, что одна таблица кучи имеет более 70% фрагментации. Поэтому я решил сделать
ALTER TABLE dbo.myTable REBUILD
Забавно, но потом у меня была 20% фрагментация. С тех пор на этом столе не было записи. Поэтому я решил сделать перестройку еще раз.
После 2-го раза настольная шляпа 50% фрагментации, так что даже больше! Я действительно не понимаю, как это может произойти ...
sql-server
fragmentation
heap
tuxmania
источник
источник
Ответы:
Что означает фрагментация в куче
Значение фрагментации в куче, которое вы получаете из столбца
avg_fragmentation_in_percent
путем запросаsys.dm_db_index_physical_stats
DMV, гласит, чтоДалее тот же BOL говорит, что
Таким образом, вы можете видеть, что это не свободное место на страницах, выделенных для Heap, а различная последовательность страниц, которая создает фрагментацию.
Это можно продемонстрировать с помощью небольшого теста. Давайте создадим таблицу кучи и вставим в нее несколько записей, а затем проверим фрагментацию.
Таким образом, таблица кучи создается с 50 записями. Ниже показано, как выглядит фрагментация после запроса DMV sys.dm_db_index_physical stats
Вы можете увидеть
avg_fragmentation_in_percent
значение столбца 33%. Теперь давайте посмотрим, как устроены страницы. Это можно сделать с помощью недокументированного запроса%%lockres%%
. Запрос будетИ ниже, как выглядит вывод. Прикрепление только соответствующей части. Запрос выдал 50 строк, так как мы вставили 50 строк в нашу таблицу dbo.HeapTest.
Он говорит, что у первой страницы есть идентификатор,
197
у следующей страницы - идентификатор, у242
последующих страниц - непрерывный идентификатор, пока мы не достигнем идентификатора страницы,264
потому что после этого мы получаем идентификатор страницы280
. Таким образом, этот скачок в числах идентификаторов страниц на самом деле вызывает фрагментацию.Теперь, чтобы не перестроить кучу и снова запустить команду, чтобы увидеть фрагментацию и порядок расположения страниц. Мы получаем фрагментацию, как
Вы можете увидеть фрагментацию сейчас
14%
.Давайте посмотрим номера страниц, выделенных
У нас есть только один прыжок, все страницы последовательно распределяются по идентификатору страницы. Так как только один скачок фрагментация значительно уменьшилась.
Я снова перестраиваю кучу, и теперь, когда я проверял фрагментацию, она полностью исчезла. И распределение идентификаторов страниц как
Почему фрагментация увеличилась
Теперь относительно того, что могло вызвать рост фрагментации, мы можем подтвердить это тем фактом, что, когда страницы выделяются в куче, они не будут непрерывными, как вы видели выше, что вызвало увеличение значения фрагментации - это скачок идентификатора PAGE, выделенного страницам.
В конце вы также должны иметь в виду, что фрагментация слова для HEAP не имеет никакого значения, как бы вы определили фрагментацию для группы неупорядоченных страниц.
Действительно беспокоюсь о фрагментации
Если вы действительно сталкиваетесь со сценарием, в котором таблица кучи фрагментируется и замедляет запросы, лучше создать кластерный индекс для таблицы, чем перестраивать его. Причина в том, что при перестройке кучи все базовые некластеризованные индексы также перестраиваются, в результате чего процесс перестройки занимает гораздо больше времени, используя много ресурсов и раздувая журнал транзакций. В производственной системе всегда старались бы избежать этого. Павел рассказал об этом в своем разделе «Мифы о куче» .
PS: Пожалуйста, не используйте недокументированную команду в производственной системе. Это было просто для демонстрации.
источник
Heaptest
и давал результат. Я уверен, что вы могли что-то пропустить. Просто убедитесь, что уровень совместимости не равен 80, в этом случае функция db_id не работает