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


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

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

В этом разделе

Перед началом

Стандартные реализации

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

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

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

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

    Индексу, создаваемому в составе ограничения, автоматически присваивается то же имя, что и имя ограничения. Дополнительные сведения см. в разделах Primary and Foreign Key Constraints и Unique Constraints and Check Constraints.

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

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

Ограничения

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

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

    Предпочтительный способ построения индекса в больших таблицах — это начать с кластеризованного индекса, а затем построить некластеризованные. При создании индексов для существующих таблиц рассмотрите целесообразность присвоения параметру ONLINE значения 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. В меню Файл выберите пункт Сохранитьимя_таблицы.

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

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

  1. В обозревателе объектовподключитесь к экземпляру компонента Компонент Database Engine.

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

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

    USE AdventureWorks2012;  
    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).

См. также:

Создание первичных ключей
Создание ограничений уникальности