В SQL Server 2005 и более ранних версиях
дефрагментация куч была непростой задачей. Для этих целей данные таблиц
копировали в новые или же добавляли, затем удаляли кластерный индекс.
В SQL Server 2008, задача
дефрагментации значительно упростилась. Разработчики добавили команде
ALTER TABLE ... REBUILD поддержку куч.
В следующем
примере будет создана простая таблица (куча) и вставлено небольшое количество
данных. В последствии, каждая запись новой таблицы будет обновлена значениями,
которые значительно превышают размеры изначальных. Результатом станет в меньшей мере
фрагментация, но и большое количество указателей (forwarding pointers). Причина
появления большого количества указателей кроется в том, что текущие записи
больше не могут помещаться на тех же страницах кучи и вынуждены переместится на
другие страницы, но оставив указатели на старых страницах. Указатели на записи
остаются не изменны в индексах.
Как видите, дефрагментация куч очень упрощена:
create table heapDemo
(
value varchar(1000)
)
GO
set nocount on
insert into heapDemo
select 'hi'
go 10000
--Увеличим размер строки в 500 раз
update heapDemo
set value = replicate('hi',500)Далее следует
проверка фрагментации таблицы:
select index_type_desc, fragment_count, page_count, forwarded_record_count
from sys.dm_db_index_physical_stats(db_id(),default,default,default,'DETAILED')
where object_id = object_id('heapDemo')
Что вернет:
index_type_desc
fragment_count
page_count
forwarded_record_count
--------------------- -------------------- --------------------
----------------------
HEAP
6
1443
9961
Далее, дефрагментация кучи и проверка фрагментации:
alter table heapDemo rebuild
select index_type_desc, fragment_count, page_count, forwarded_record_count
from sys.dm_db_index_physical_stats(db_id(),default,default,default,'DETAILED')
where object_id = object_id('heapDemo')
Результатом стала
куча, в которой отсуствуют указатели –
желаемый результат.
index_type_desc
fragment_count
page_count
forwarded_record_count
--------------------- -------------------- --------------------
----------------------
HEAP
3
1440
0