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

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Кластеризованные индексы для таблиц можно создать с помощью SQL Server Management StudioSQL Server Management Studio или Transact-SQLTransact-SQL.You can create clustered indexes on tables by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. За некоторыми исключениями, каждая таблица должна иметь кластеризованный индекс.With few exceptions, every table should have a clustered index. Кроме того, что кластеризованный индекс повышает производительность запросов, его можно перестраивать или переорганизовывать по запросу, управляя фрагментацией таблицы.Besides improving query performance, a clustered index can be rebuilt or reorganized on demand to control table fragmentation. Кластеризованный индекс может быть также создан для представления.A clustered index can also be created on a view. (Кластеризованные индексы определены в разделе Описания кластеризованных и некластеризованных индексов.)(Clustered indexes are defined in the topic Clustered and Nonclustered Indexes Described.)

В этом разделеIn This Topic

Перед началомBefore You Begin

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

Кластеризованные индексы реализуются следующими методами.Clustered indexes are implemented in the following ways:

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

    Если кластеризованный индекс в таблице еще не создан, а уникальный некластеризованный индекс еще не указан, то при создании ограничения PRIMARY KEY в одном или нескольких столбцах автоматически создается уникальный кластеризованный индекс.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. В первичном ключевом столбце недопустимы значения NULL.The primary key column cannot allow NULL values.

    При создании ограничения UNIQUE создается уникальный некластеризованный индекс. Он нужен, чтобы принудительно применять ограничение UNIQUE по умолчанию.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. Если кластеризованный индекс в таблице еще не создан, то можно указать уникальный кластеризованный индекс.You can specify a unique clustered index if a clustered index on the table does not already exist.

    Индексу, создаваемому в составе ограничения, автоматически присваивается то же имя, что и имя ограничения.An index created as part of the constraint is automatically given the same name as the constraint name. Дополнительные сведения см. в разделах Primary and Foreign Key Constraints и Unique Constraints and Check Constraints.For more information, see Primary and Foreign Key Constraints and Unique Constraints and Check Constraints.

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

    Можно создать кластеризованный индекс в столбце, отличном от первичного ключевого столбца, если задано ограничение некластеризованного первичного ключа.You can create a clustered index on a column other than primary key column if a nonclustered primary key constraint was specified.

ОграниченияLimitations and Restrictions

  • При создании кластеризованного индекса в соответствующих файлах и файловых группах требуется столько места на диске, сколько суммарно занимают старые (исходные) и новые (целевые) структуры.When a clustered index structure is created, disk space for both the old (source) and new (target) structures is required in their respective files and filegroups. Старая структура не освобождается до тех пор, пока не зафиксирована вся транзакция создания индекса.The old structure is not deallocated until the complete transaction commits. Кроме того, для сортировки может временно потребоваться дополнительное место на диске.Additional temporary disk space for sorting may also be required. Дополнительные сведения см. в статье Disk Space Requirements for Index DDL Operations.For more information, see Disk Space Requirements for Index DDL Operations.

  • Если кластеризованный индекс создается в куче с несколькими существующими некластеризованными индексами, все некластеризованные индексы необходимо перестроить, чтобы они содержали значение ключа кластеризации, а не идентификатор строки (RID).If a clustered index is created on a heap with several existing nonclustered indexes, all the nonclustered indexes must be rebuilt so that they contain the clustering key value instead of the row identifier (RID). Точно так же, если кластеризованный индекс удаляется из таблицы с несколькими некластеризованными индексами, некластеризованные индексы перестраиваются в ходе операции DROP.Similarly, if a clustered index is dropped on a table that has several nonclustered indexes, the nonclustered indexes are all rebuilt as part of the DROP operation. Для больших таблиц это может занять значительное время.This may take significant time on large tables.

    Предпочтительный способ построения индекса в больших таблицах — это начать с кластеризованного индекса, а затем построить некластеризованные.The preferred way to build indexes on large tables is to start with the clustered index and then build any nonclustered indexes. При создании индексов для существующих таблиц рассмотрите целесообразность присвоения параметру ONLINE значения ON.Consider setting the ONLINE option to ON when you create indexes on existing tables. В этом случае длительные блокировки таблиц удерживаться не будут.When set to ON, long-term table locks are not held. Это позволит продолжить выполнение запросов или обновление базовых таблиц.This enables queries or updates to the underlying table to continue. Дополнительные сведения см. в статье Выполнение операции с индексами в сети.For more information, see Perform Index Operations Online.

  • Ключ кластеризованного индекса не может включать в себя столбцы varchar , для которых существуют данные в единице размещения ROW_OVERFLOW_DATA.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Если кластеризованный индекс создается для столбца типа varchar и существующие данные располагаются в единице размещения IN_ROW_DATA, то все последующие операции вставки или обновления для данного столбца, выталкивающие данные за пределы строки, будут завершаться ошибкой.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail. Для получения сведений о таблицах, которые могут содержать превышающие размер страницы данные строки, используется функция динамического управления sys.dm_db_index_physical_stats (Transact-SQL).To obtain information about tables that might contain row-overflow data, use the sys.dm_db_index_physical_stats (Transact-SQL) dynamic management function.

безопасностьSecurity

PermissionsPermissions

Необходимо разрешение ALTER для таблицы или представления.Requires ALTER permission on the table or view. Пользователь должен быть членом предопределенной роли сервера sysadmin или предопределенных ролей базы данных db_ddladmin и db_owner.User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

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

Создание кластеризованного индекса в обозревателе объектовTo create a clustered index by using Object Explorer

  1. В обозревателе объектов разверните таблицу, в которой необходимо создать кластеризованный индекс.In Object Explorer, expand the table on which you want to create a clustered index.

  2. Щелкните правой кнопкой мыши папку Индексы, наведите указатель на пункт Создать индекс и выберите пункт Кластеризованный индекс.Right-click the Indexes folder, point to New Index, and select Clustered Index....

  3. В диалоговом окне Создание индекса на странице Общие введите имя нового индекса в поле Имя индекса .In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  4. В разделе Ключевые столбцы индекса щелкните Добавить… .Under Index key columns, click Add....

  5. В диалоговом окне Выбор столбцов изимя_таблицы установите флажок для столбца таблицы, который следует добавить в кластеризованный индекс.In the Select Columns fromtable_name dialog box, select the check box of the table column to be added to the clustered index.

  6. Нажмите кнопку ОК.Click OK.

  7. В диалоговом окне Создание индекса нажмите кнопку ОК.In the New Index dialog box, click OK.

Создание кластеризованного индекса с помощью конструктора таблицTo create a clustered index by using the Table Designer

  1. В обозревателе объектов разверните базу данных, в которой необходимо создать таблицу с кластеризованным индексом.In Object Explorer, expand the database on which you want to create a table with a clustered index.

  2. Щелкните правой кнопкой мыши папку Таблицы и выберите команду Создать таблицу....Right-click the Tables folder and click New Table....

  3. Создайте новую таблицу обычным способом.Create a new table as you normally would. Дополнительные сведения см. в статье Создание таблиц (компонент Database Engine).For more information, see Create Tables (Database Engine).

  4. Щелкните правой кнопкой мыши созданную таблицу и выберите пункт Конструктор.Right-click the new table created above and click Design.

  5. В меню Конструктор таблиц выберите пункт Индексы и ключи.On the Table Designer menu, click Indexes/Keys.

  6. В диалоговом окне Индексы и ключи нажмите Добавить.In the Indexes/Keys dialog box, click Add.

  7. Выберите новый индекс в текстовом поле Выбранный первичный/уникальный ключ или индекс .Select the new index in the Selected Primary/Unique Key or Index text box.

  8. Выберите в сетке Создать как кластеризованный и из раскрывающегося списка справа от свойства выберите Да .In the grid, select Create as Clustered, and choose Yes from the drop-down list to the right of the property.

  9. Щелкните Закрыть.Click Close.

  10. В меню Файл выберите Сохранитьимя_таблицы.On the File menu, click Savetable_name.

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

Создание кластеризованного индексаTo create a clustered index

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент Database EngineDatabase Engine.In Object Explorer, connect to an instance of Компонент Database EngineDatabase Engine.

  2. На стандартной панели выберите пункт Создать запрос.On the Standard bar, click New Query.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.Copy and paste the following example into the query window and click Execute.

    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).For more information, see CREATE INDEX (Transact-SQL).

См. такжеSee Also

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