24.11.25

Удаляются ли смешанные страницы при перестроении индекса?

Автор: Paul Randal, Are mixed pages removed by an index rebuild?

Это вопрос, который всплыл на нашем курсе IE1, и я решил оформить ответ в виде статьи в блоге, потому что в нём есть пара тонкостей.

Первые 8 страниц, выделяемые для единицы распределения, — это смешанные страницы из смешанных экстентов, если не включён флаг трассировки 1118.

Подробнее — в следующих публикациях:

Предположим, что смешанные страницы не отключены флагом трассировки 1118: удалит ли перестроение индекса все смешанные страницы или нет?

Разберёмся. Сначала я создам кластерный индекс с 1 000 страниц данных:

CREATE TABLE [MixedTest] ([c1] BIGINT IDENTITY, [c2] CHAR (8000) DEFAULT 'a');
CREATE CLUSTERED INDEX [MixedTest_CL] ON [MixedTest] ([c1]);
SET NOCOUNT ON;
GO
INSERT INTO [MixedTest] DEFAULT VALUES;
GO 1000

А затем убедимся, что действительно есть смешанные страницы, изучив первую страницу IAM в цепочке IAM кластерного индекса. Хранимую процедуру sp_AllocationMetadata можно взять здесь.

EXEC [sp_AllocationMetadata] N'MixedTest';
GO
Object Name   Index ID   Alloc Unit ID       Alloc Unit Type   First Page   Root Page   First IAM Page
------------  ---------  ------------------  ----------------  -----------  ----------  ---------------
MixedTest     1          72057594046185472   IN_ROW_DATA       (1:987)      (1:1732)    (1:988)

DBCC TRACEON (3604);
DBCC PAGE (N'master', 1, 988, 3);
GO

(Я привожу только соответствующий фрагмент вывода DBCC PAGE…)

<snip>IAM: Single Page Allocations @0x00000000227EA08E
Slot 0 = (1:987)                    Slot 1 = (1:989)                    Slot 2 = (1:990)
Slot 3 = (1:991)                    Slot 4 = (1:1816)                   Slot 5 = (1:1817)
Slot 6 = (1:1818)                   Slot 7 = (1:1819)
<snip>

Теперь выполню офлайн‑перестроение кластерного индекса и снова посмотрю содержимое страницы IAM (предположим, что я запускаю процедуру и DBCC PAGE уже после перестроения):

ALTER INDEX [MixedTest_CL] ON [MixedTest] REBUILD;
GO

<snip>
IAM: Single Page Allocations @0x0000000023B0A08E
Slot 0 = (1:1820)                   Slot 1 = (1:446)                    Slot 2 = (1:1032)
Slot 3 = (0:0)                      Slot 4 = (1:1035)                   Slot 5 = (1:1034)
Slot 6 = (1:1037)                   Slot 7 = (1:1036)
<snip>

Итак, ответ: нет, перестроение индекса не удаляет размещения на смешанных страницах. Это делает только флаг трассировки 1118.

Но тут есть любопытная деталь: в массиве слотов одиночных страниц выше — лишь 7 смешанных страниц. Что произошло? Дело в том, что офлайн‑перестроение выполнялось параллельно: каждый поток строил часть индекса, а затем эти части сшиваются вместе. Операция «сшивания» приводит к тому, что некоторые нелиствовые страницы индекса освобождаются, поскольку их содержимое объединяется. Этим объясняется освобождённая страница, которая изначально отслеживалась элементом 3 в массиве слотов.

Попробуем офлайн‑перестроение с принудительно сериализованным планом.

ALTER INDEX [MixedTest_CL] ON [MixedTest] REBUILD WITH (MAXDOP = 1);
GO

<snip>
IAM: Single Page Allocations @0x0000000023B0A08E
Slot 0 = (1:1822)                   Slot 1 = (1:1823)                   Slot 2 = (1:291)
Slot 3 = (1:292)                    Slot 4 = (0:0)                      Slot 5 = (0:0)
Slot 6 = (0:0)                      Slot 7 = (0:0)
<snip>

В этом случае строится один‑единственный индекс (то есть нет параллельных «мини‑индексов»), поэтому в новом индексе ничего не освобождается — «сшивания» не происходит. Но почему не 8 смешанных страниц? Потому что в фазе построения нового индекса страницы листового уровня берутся из однородных экстентов, выделенных пакетным способом, независимо от используемой модели восстановления. Смешанные страницы — это нелиствовые страницы индекса (вы легко убедитесь в этом с помощью DBCC PAGE).

Для параллельных и однопоточных онлайн‑операций с индексами наблюдаются те же два паттерна, что и при офлайн‑перестроении, хотя алгоритм немного отличается.



Комментариев нет:

Отправить комментарий