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

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Кластеризованные индексы можно создавать в таблицах с помощью SQL Server Management Studio или Transact-SQL. За некоторыми исключениями, каждая таблица должна иметь кластеризованный индекс. Кроме того, что кластеризованный индекс повышает производительность запросов, его можно перестраивать или переорганизовывать по запросу, управляя фрагментацией таблицы. Кластеризованный индекс может быть также создан для представления. (Кластеризованные индексы определены в статье Кластеризованные и некластеризованные индексы.)

Типичные реализации

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

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

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

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

    Индексу, создаваемому в составе ограничения, автоматически присваивается то же имя, что и имя ограничения. Дополнительные сведения см. в разделе "Ограничения первичного и внешнего ключа" и "Уникальные ограничения" и проверка ограничений.

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

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

Ограничения

  • При создании кластеризованного индекса в соответствующих файлах и файловых группах требуется столько места на диске, сколько суммарно занимают старые (исходные) и новые (целевые) структуры. Старая структура не будет освобождена до завершения фиксации транзакции. Также может потребоваться дополнительное временное место на диске для сортировки. Дополнительные сведения см. в статье Disk Space Requirements for Index DDL Operations.

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

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

  • Ключ индекса кластеризованного индекса не может содержать столбцы varchar , имеющие существующие данные в единице ROW_OVERFLOW_DATA выделения. Если кластеризованный индекс создается в столбце varchar и существующие данные находится в IN_ROW_DATA единице выделения, последующие действия вставки или обновления в столбце, который приведет к сбою данных вне строки. Чтобы получить сведения о таблицах, которые могут содержать данные о переполнении строк, используйте динамическую функцию управления sys.dm_db_index_physical_stats (Transact-SQL ).

Разрешения

Необходимо разрешение ALTER для таблицы или представления. Пользователь должен быть членом предопределенной роли сервера sysadmin или предопределенных ролей базы данных db_ddladmin и db_owner.

Использование SQL Server Management Studio

Создание кластеризованного индекса из обозреватель объектов

  1. В обозревателе объектов разверните таблицу, в которой необходимо создать кластеризованный индекс.

  2. Щелкните правой кнопкой мыши папку Индексы, наведите указатель на пункт Создать индекс и выберите пункт Кластеризованный индекс.

  3. В диалоговом окне Создание индекса на странице Общие введите имя нового индекса в поле Имя индекса .

  4. В разделе Ключевые столбцы индекса выберите Добавить….

  5. В диалоговом окне Выбор столбцов изимя_таблицы установите флажок для столбца таблицы, который следует добавить в кластеризованный индекс.

  6. Нажмите ОК.

  7. В диалоговом окне "Создать индекс" нажмите кнопку "ОК".

Создание кластеризованного индекса с помощью конструктора таблиц

  1. В обозревателе объектов разверните базу данных, в которой необходимо создать таблицу с кластеризованным индексом.

  2. Щелкните правой кнопкой мыши папку "Таблицы " и выберите "Создать таблицу...".

  3. Создайте новую таблицу обычным способом. Дополнительные сведения см. в разделе "Создание таблиц" (ядро СУБД).

  4. Щелкните правой кнопкой мыши созданную ранее таблицу и выберите "Конструктор".

  5. В меню Конструктор таблиц выберите пункт Индексы и ключи.

  6. В диалоговом окне Индексы и ключи нажмите Добавить.

  7. Выберите новый индекс в текстовом поле Выбранный первичный/уникальный ключ или индекс .

  8. Выберите в сетке Создать как кластеризованныйи из раскрывающегося списка справа от свойства выберите Да .

  9. Выберите Закрыть.

  10. В меню Файл выберите пункт Сохранитьимя_таблицы.

Использование Transact-SQL

  1. В обозревателе объектов подключитесь к экземпляру ядра СУБД.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить.

    USE AdventureWorks2022;
    GO
    
    -- Create a new table with three columns.
    CREATE TABLE dbo.TestTable (
        TestCol1 INT NOT NULL,
        TestCol2 NCHAR(10) NULL,
        TestCol3 NVARCHAR(50) NULL
    );
    GO
    
    -- Create a clustered index called IX_TestTable_TestCol1
    -- on the dbo.TestTable table using the TestCol1 column.
    CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1);
    GO
    

Дополнительные сведения см. в статье CREATE INDEX (Transact-SQL).