Дополнительные рекомендации по секционированным индексам

Хотя секционированные индексы могут существовать отдельно от своих базовых таблиц, обычно имеет смысл спроектировать секционированную таблицу, а уже затем создать индекс для нее. В таком случае сервер SQL Server автоматически разбивает индекс на секции на основе той же схемы и столбца секционирования, что используются для таблицы. В результате индекс секционируется в основном таким же образом, как и таблица, что делает его выровненным относительно таблицы.

SQL Server не выравнивает индекс с таблицей, если во время его создания была указана другая схема секционирования, или индекс был помещен в отдельную файловую группу.

Выравнивание индекса с секционированной таблицей особенно важно в случаях, когда предполагается его расширение путем добавления дополнительных секций или когда индекс будет подвергаться частому их переключению. Дополнительные сведения см. в разделе Проектирование секций для управления вложенными наборами данных. Когда таблица и ее индексы выровнены, SQL Server может при обслуживании структуры секционирования как таблицы, так и индексов быстро и эффективно переключать секции.

ПримечаниеПримечание

Для выравнивания с базовой таблицей индексу необязательно использовать функцию секционирования с тем же именем. Однако функции секционирования индекса и базовой таблицы не должны существенно различаться, то есть: 1) аргументы функции секционирования должны иметь один и тот же тип данных, 2) функции должны определять одинаковое количество секций и 3) функции должны определять для секций одинаковые граничные значения.

На вкладке Параметры настройки помощника по настройке ядра СУБД есть параметр Выровненное секционирование, который указывает, что новые рекомендуемые индексы будут выравниваться со своими базовыми таблицами. То же самое можно выполнить с помощью настройки Хранить выровненное секционирование, которая может быть использована еще и для удаления существующих невыровненных индексов. Дополнительные сведения см. в разделе Помощник по настройке ядра СУБД (вкладка «Параметры настройки»). Обычно для выработки рекомендаций по использованию индексов для повышения производительности используется помощник по настройке ядра СУБД, и это могут быть одновременно и выровненные, и невыровненные индексы. Дополнительные сведения см. в разделе Обзор помощника по настройке ядра СУБД.

Создание невыровненного (независимо от базовой таблицы) секционированного индекса может оказаться эффективным в следующих случаях:

  • Базовая таблица не секционирована.

  • Ключ индекса является уникальным и не содержит столбца секционирования таблицы.

  • Требуется участие базовой таблицы в выровненных соединениях с таблицами, использующими другие столбцы соединения.

ПримечаниеПримечание

Чтобы разрешить переключение секций, все индексы таблицы должны быть выровнены.

При создании секционированного индекса следует учитывать сведения, приведенные в следующих разделах.

Секционирование уникальных индексов

При секционировании уникального индекса (кластеризованного или некластеризованного) столбец секционирования необходимо выбирать из столбцов, участвующих в ключе уникального индекса.

ПримечаниеПримечание

Данное ограничение позволяет SQL Server проверить всего одну секцию, чтобы убедиться в отсутствии дубликатов для нового значения ключа.

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

Секционирование кластеризованных индексов

При секционировании кластеризованного индекса столбец секционирования должен содержаться в ключе кластеризации. При секционировании неуникального кластеризованного индекса, если столбец секционирования не указан явно в ключе кластеризации, SQL Server по умолчанию добавляет столбец секционирования в список ключей кластеризованного индекса. Если кластеризованный индекс является уникальным, для него следует явным образом задать наличие столбца секционирования в ключе кластеризованного индекса.

Секционирование некластеризованных индексов

При секционировании уникального некластеризованного индекса столбец секционирования должен содержаться в ключе индекса. При секционировании неуникального некластеризованного индекса SQL Server по умолчанию добавляет столбец секционирования как неключевой (включенный) столбец индекса, чтобы обеспечить выравнивание индекса с базовой таблицей. Если столбец секционирования уже присутствует в индексе, SQL Server его не добавляет.

Ограничения оперативной памяти и секционированные индексы

Ограничения оперативной памяти могут повлиять на производительность SQL Server при построении секционированного индекса и даже на саму возможность его построения. Такое случается, например, когда индекс не выровнен со своей базовой таблицей или со своим кластеризованным индексом, если такой существует в таблице.

При сортировке, выполняемой при построении секционированных индексов, SQL Server сначала создает для каждой секции по одной таблице сортировки. Затем, либо в соответствующей файловой группе каждой секции, либо в tempdb, если задан параметр индекса SORT_IN_TEMPDB, производится построение таблиц сортировки.

Для всех таблиц сортировки требуется минимальный объем оперативной памяти. При построении секционированного индекса, выровненного со своей базовой таблицей, таблицы сортировки создаются по одной за раз, экономно расходуя оперативную память. Однако при построении невыровненного секционированного индекса таблицы сортировки создаются одновременно.

В результате необходим достаточный объем оперативной памяти, чтобы параллельно их обрабатывать. Чем больше число секций, тем больше требуется оперативной памяти. Для каждой из секций размер таблицы сортировки составляет не менее 40 страниц, по 8 килобайт каждая. Например, для невыровненного секционированного индекса, разбитого на 100 секций, потребуется объем оперативной памяти для одновременной сортировки 4 000 страниц (40*100). Если такой объем памяти доступен, операция создания будет выполнена успешно, но может пострадать производительность. Если же такой объем памяти недоступен, операция построения завершится ошибкой. Для выровненного секционированного индекса, разбитого на 100 секций, для сортировки потребуется всего 40 страниц, поскольку сортировки осуществляются не одновременно.

Как для выровненных, так и для невыровненных индексов может потребоваться больший объем оперативной памяти, если SQL Server применяет степени параллелизма для выполнения данной операции на многопроцессорном компьютере. Чем больше степень параллелизма, тем больше требуется оперативной памяти. Например, если для SQL Server определена степень параллелизма 4, то невыровненному секционированному индексу, содержащему 100 секций, потребуется такой объем памяти, чтобы четыре процессора могли одновременно отсортировать по 4 000 страниц, то есть 16 000 страниц. Если секционированный индекс выровнен, требования оперативной памяти снижаются до 40 страниц для каждого из четырех процессоров, то есть 160 страниц (4*40). С помощью параметра индекса MAXDOP можно вручную снизить степень параллелизма. Дополнительные сведения см. в разделе Настройка параллельных операций с индексами.

Дополнительные сведения о том, как сервер SQL Server осуществляет операции сортировки при построении индексов, см. в разделе База данных tempdb и создание индекса.