Запоздалое вступление - Типы построения индексов - Часть 2 (секционированные индексы)
- Построение секционированных или построение несекционированных индексов:
Данные секционированных таблиц и индексов подразделяются на блоки, которые могут быть распределены по нескольким файловым группам в базе данных. Данные секционируются горизонтально, поэтому группы строк сопоставляются с отдельными секциями. Таблица или индекс рассматриваются как единая логическая сущность при выполнении над данными запросов или обновлений. Все секции одного индекса или таблицы должны находиться в одной и той же базе данных.
Выровненные секционированные индексы:
Хотя секционированные индексы могут существовать отдельно от своих базовых таблиц, обычно имеет смысл спроектировать секционированную таблицу, а уже затем создать индекс для нее. В таком случае сервер SQL Server автоматически разбивает индекс на секции на основе той же схемы и столбца секционирования, что используются для таблицы. В результате индекс секционируется в основном таким же образом, как и таблица, что делает его выровненным относительно таблицы.
Для выравнивания с базовой таблицей индексу необязательно использовать функцию секционирования с тем же именем. Однако функции секционирования индекса и базовой таблицы не должны существенно различаться, то есть:
1) аргументы функции секционирования должны иметь один и тот же тип данных,
2) функции должны определять одинаковое количество секций и
3) функции должны определять для секций одинаковые граничные значения.
Если вы строите некластерный индекс на секционированной таблице и не указываете функцию секционирования, то этот некластерный индекс будет секционированным и выровненным (см. пример).
Пример:
Create Partition Function pf (int)
as range right for values (NULL, 1, 100)
Create Partition Scheme ps
as Partition pf
TO ([PRIMARY], [FileGroup1], [FileGroup1], [FileGroup1])
Create table t (c1 int, c2 int)
on ps(c1)
Create Index idx_t on t(c1)
Невыровненные секционированные индексы:
SQL Server не выравнивает индекс с таблицей, если во время его создания была указана другая схема секционирования, или индекс был помещен в отдельную файловую группу.
Вы можете превратить несекционированную таблицу в секционированную построив на ней секционированный кластерный индекс – это также будет невыровненное построение индекса (см. пример).
Пример:
Create Partition Function pf (int)
as range right for values (NULL, 1, 100)
Create Partition Scheme ps
as Partition pf
TO ([PRIMARY], [FileGroup1], [FileGroup1], [FileGroup1])
Create table t (c1 int, c2 int)
Create clustered Index idx_t on t(c1)
on ps(c1)
Замечание: Если имеется секционированный кластерный индекс (пример выше) и вы его удаляете, то таблица останется секционированной в соответствии с той же схемой секционирования. Исключение составляет случай, когда вы указываете опцию MOVE TO во время удаления индекса.
Пример:
Drop Index idx_t on t
WITH(MOVE TO new_ps(c1))
В этом примере таблица переносится на другую схему секционирования, но некластерные индексы не переносятся вместе с ней. Таким образом, даже если некластерные индексы были до этого выровнены с кластерным индексом, они могут теперь оказаться невыровненными с таблицей.