Построение индексов – часть 6: построение секционированного индекса (Partitioned Index)
Существуют две основных категории секционированных индексов:
- Выровненные (когда базовая таблица и индекс используют одинаковые функции секционирования)
- Невыровненные (когда базовая таблица и индекс используют разные функции секционирования (включая случай, когда базовая таблица вообще не секционирована, а индекс секционирован).
Построение выровненных секционированных индексов
Последовательное построение выровненных секционированных индексов
NL
/ \
ПТС Построитель
\
[Сортировка]
\
Сканирование
ПТС: Постоянный табличный скан (the purpose of CTS is to provide partition IDs for index builder)
NL: Nested Loop (вложенный цикл)
ПТС предоставляет ID секций внутренней стороне Nested Loop-а, который строит индекс для каждой секции. Промежуточные структуры сортировки создаются для каждой секции, но так как мы создаем их последовательно (одна за одной) и окончательное дерево индекса мы строим последовательно для каждой секции, нам не нужно держать все эти промежуточные структуры сортировки одновременно.
Как это влияет на требования к свободному дисковому пространству:
- В случае сортировки в пользовательской базе данных (установка по умолчанию) сортировка происходит в каждой filegroup для каждой соответствующей секции. Это означает, что каждая файловая группа должна иметь те же 2.2*(Размер секции) свободного дискового пространства для того, чтобы можно было построить индекс.
Пример:
Имеются 3 секции расположенные в файловых группах FG1, FG2, FG3. Размер индексных данных (соответственно для каждой секции) – 1Gb, 2Gb и 3Gb. В этом случае потребуется: 2.2*1 = 2.2Gb свободного пространства в FG1; 2.2*2 = 4.4Gb свободного пространства в FG2, 2.2*3 = 6.6Gb свободного пространства в FG3. Таким образом, общий размер свободного дискового пространства, необходимого в этом случае - 9.9Gb.
- В случае сортировки в tempdb (SORT_IN_TEMPDB = ON) свободное пространство в tempdb будет переиспользоваться для сортировки каждой секцию Так как сортировка секций происходит последовательно одна за одной, потребуется только 2.2*(Размер наибольшей секции) свободного дискового пространства в tempdb.
Пример:
Возьмем пример рассмотренный выше: имеются 3 секции расположенные в файловых группах FG1, FG2, FG3. Размер индексных данных (соответственно для каждой секции) – 1Gb, 2Gb и 3Gb. В этом случае потребуется: 3.3Gb свободного дискового пространства в tempdb.
Некоторые соображения об использовании памяти:
Так как в одно и тоже время существует только одна промежуточная структура сортировки, потребуется 40 страниц памяти (необходимая память), чтобы начать построение индекса. 40 страниц – это минимальное требование.
Общее объем памяти = минимально требуемая память + дополнительная память*.
* дополнительная память высчитывается как размер calculated as строки умноженный на предполагаемое количество строк, предоставленное оптимизатором запросов.
Читайте в следующих постах о параллельном построении выровненного секционированного индекса J