Опубліковані 31-03-2008 10:23 від Александр Волок
Зареєстрований як , ,

SQL Server 2008: Дефрагментация куч

В  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

Коментарі

Немає коментарів
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.