Поделиться через


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

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

Кластеризованные индексы можно создавать в таблицах с помощью 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. В диалоговом окне "Выбор столбцов" изtable_name установите флажок столбца таблицы, который будет добавлен в кластеризованный индекс.

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

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

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

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

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

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

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

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

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

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

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

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

  10. В меню "Файл" выберите "Сохранитьtable_name".

Использование 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).