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

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

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

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

  • Ограничениями 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 при создании таблицы

CREATE TABLE (Transact-SQL)

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

ALTER TABLE (Transact-SQL)

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

CREATE INDEX (Transact-SQL)

См. также

Основные понятия

Структуры кластеризованного индекса
Создание индексов (компонент Database Engine)

Справка и поддержка

Получение помощи по SQL Server 2005