Это вопрос, который всплыл на нашем курсе IE1, и я решил оформить ответ в виде статьи в блоге, потому что в нём есть пара тонкостей.
Первые 8 страниц, выделяемые для единицы распределения, — это смешанные страницы из смешанных экстентов, если не включён флаг трассировки 1118.
Подробнее — в следующих публикациях:
- Страницы IAM, цепочки IAM и единицы распределения
- Анатомия экстента
- Заблуждения вокруг флага трассировки TF1118
Предположим, что смешанные страницы не отключены флагом трассировки 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).
Для параллельных и однопоточных онлайн‑операций с индексами наблюдаются те же два паттерна, что и при офлайн‑перестроении, хотя алгоритм немного отличается.

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