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

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

Типичные методы реализации

Кластеризованные индексы реализуются следующими методами.

  • Ограничениями PRIMARY KEY и UNIQUE

    Если кластеризованный индекс в таблице еще не создан, а уникальный некластеризованный индекс еще не указан, то при создании ограничения PRIMARY KEY в одном или нескольких столбцах автоматически создается уникальный кластеризованный индекс. В столбце первичного ключа значения NULL не допускаются.

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

    Индексу, создаваемому в составе ограничения, автоматически присваивается то же имя, что и имя ограничения. Дополнительные сведения см. в разделах Ограничения PRIMARY KEY и Ограничения UNIQUE.

  • Индекс, не зависящий от ограничения

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

  • Индексированное представление

    Чтобы создать индексированное представление, по одному или нескольким столбцам представления определяется уникальный кластеризованный индекс. Представление материализуется, а результирующий набор хранится на конечном уровне индекса точно так же, как данные таблицы хранятся в кластеризованном индексе. Дополнительные сведения см. в разделе Создание индексированных представлений.

Выбор ключевого столбца

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

Ключ индекса кластеризованного индекса не может содержать столбцы типа varchar, в которых имеются данные в единице распределения ROW_OVERFLOW_DATA. Если кластеризованный индекс создается для столбца типа varchar и существующие данные располагаются в единице распределения IN_ROW_DATA, то все последующие операции вставки или обновления для данного столбца, выталкивающие данные за пределы строки, будут завершаться ошибкой. Дополнительные сведения о единицах распределения см. в разделе Организация таблиц и индексов.

Требования к свободному месту на диске

При создании кластеризованного индекса в соответствующих файлах и файловых группах требуется столько места на диске, сколько суммарно занимают старые (исходные) и новые (целевые) структуры. Старая структура не освобождается до тех пор, пока не зафиксирована вся транзакция создания индекса. Кроме того, для сортировки может временно потребоваться дополнительное место на диске. Дополнительные сведения см. в разделе Определение требований к месту на диске для индексов.

Вопросы производительности

Если кластеризованный индекс создается в куче с несколькими существующими некластеризованными индексами, все некластеризованные индексы необходимо перестроить, чтобы они содержали значение ключа кластеризации, а не идентификатор строки (RID). Точно так же, если кластеризованный индекс удаляется из таблицы с несколькими некластеризованными индексами, некластеризованные индексы перестраиваются в ходе операции DROP. Для больших таблиц это может занять значительное время.

Предпочтительный способ построения индекса в больших таблицах — это начать с кластеризованного индекса, а затем построить некластеризованные. При создании индексов для существующих таблиц рассмотрите целесообразность присвоения параметру ONLINE значения ON. В этом случае длительные блокировки таблиц удерживаться не будут. Это позволит продолжить выполнение запросов или обновление базовых таблиц. Дополнительные сведения см. в разделе Выполнение операции с индексами в сети.

Создание ограничения PRIMARY KEY или UNIQUE при создании таблицы

Создание ограничения PRIMARY KEY или UNIQUE для существующей таблицы

Создание индекса