CREATE INDEX (Transact-SQL)CREATE INDEX (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Создает реляционный индекс для таблицы или представления.Creates a relational index on a table or view. Он также называется индексом rowstore, так как является кластеризованным или некластеризованным индексом сбалансированного дерева.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. Индекс rowstore можно создать до заполнения таблицы данными.You can create a rowstore index before there is data in the table. Индекс rowstore позволяет повысить производительность запросов, особенно в том случае, если запросы выбирают определенные столбцы или им требуются значения, которые должны быть отсортированы в определенном порядке.Use a rowstore index to improve query performance, especially when the queries select from specific columns or require values to be sorted in a particular order.

Примечание

Хранилище данных SQLSQL Data Warehouse и Параллельное хранилище данныхParallel Data Warehouse в настоящее время не поддерживает ограничения уникальности.and Параллельное хранилище данныхParallel Data Warehouse currently do not support Unique constraints. Примеры, ссылающиеся на ограничения уникальности применимы только к SQL ServerSQL Server и База данных SQLSQL Database.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and База данных SQLSQL Database.

Совет

Дополнительные сведения о правилах проектирования индексов см. в статье Руководство по проектированию индексов SQL Server.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Простые примеры:Simple examples:

-- Create a nonclustered index on a table or view
CREATE INDEX i1 ON t1 (col1);
--Create a clustered index on a table and use a 3-part name for the table
CREATE CLUSTERED INDEX i1 ON d1.s1.t1 (col1);
-- Syntax for SQL Server and Azure SQL Database
-- Create a nonclustered index with a unique constraint
-- on 3 columns and specify the sort order for each column
CREATE UNIQUE INDEX i1 ON t1 (col1 DESC, col2 ASC, col3 DESC);

Основной сценарий.Key scenario:

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) и База данных SQLSQL Database, некластеризованный индекс используется в индексе columnstore для повышения производительности запросов хранилища данных.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and База данных SQLSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. Дополнительные сведения см. в статье Хранилище данных для индексов columnstore.For more information, see Columnstore Indexes - Data Warehouse.

Дополнительные типы индексов описаны в следующих статьях:For additional types of indexes, see:

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

Синтаксис для SQL Server и базы данных SQL AzureSyntax for SQL Server and Azure SQL Database

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
  
[ ; ]
  
<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON | OFF }
  | RESUMABLE = {ON | OF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF}
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE}
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
}

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Реляционный индекс с обратной совместимостьюBackward Compatible Relational Index

Важно!

Структура синтаксиса реляционного индекса с обратной совместимостью будет исключена из следующей версии SQL ServerSQL Server.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. Избегайте ее использования в новых разработках и запланируйте изменение приложений, которые пользуются ею сейчас.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Вместо нее используйте структуру синтаксиса, указанную в <relational_index_option>.Use the syntax structure specified in <relational_index_option> instead.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Синтаксис для хранилища данных SQL Azure и Parallel Data WarehouseSyntax for Azure SQL Data Warehouse and Parallel Data Warehouse

CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
        ( { column [ ASC | DESC ] } [ ,...n ] )
    WITH ( DROP_EXISTING = { ON | OFF } )
[;]

АргументыArguments

UNIQUEUNIQUE
Создает уникальный индекс для таблицы или представления.Creates a unique index on a table or view. Уникальным является индекс, в котором не может быть двух строк с одним и тем же значением ключа индекса.A unique index is one in which no two rows are permitted to have the same index key value. Кластеризованный индекс представления должен быть уникальным.A clustered index on a view must be unique.

Компонент Компонент Database EngineDatabase Engine не позволяет создать уникальный индекс по столбцам, уже содержащим повторяющиеся значения, даже если параметру IGNORE_DUP_KEY присвоено значение ON.The Компонент Database EngineDatabase Engine does not allow creating a unique index on columns that already include duplicate values, whether or not IGNORE_DUP_KEY is set to ON. При попытке создания такого индекса компонент Компонент Database EngineDatabase Engine выдает сообщение об ошибке.If this is tried, the Компонент Database EngineDatabase Engine displays an error message. Прежде чем создавать уникальный индекс по такому столбцу или столбцам, необходимо удалить все повторяющиеся значения.Duplicate values must be removed before a unique index can be created on the column or columns. Столбцы, используемые в уникальном индексе, должны иметь свойство NOT NULL, т. к. при создании индекса значения NULL рассматриваются как повторяющиеся.Columns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created.

CLUSTEREDCLUSTERED
Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице.Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. На нижнем (конечном) уровне кластеризованного индекса хранятся действительные строки данных таблицы.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. Для таблицы или представления в каждый момент времени может существовать только один кластеризованный индекс.A table or view is allowed one clustered index at a time.

Представление с уникальным кластеризованным индексом называется индексированным.A view with a unique clustered index is called an indexed view. Создание уникального кластеризованного индекса физически материализует представление.Creating a unique clustered index on a view physically materializes the view. Уникальный кластеризованный индекс для представления должен быть создан до того, как для этого же представления будут определены какие-либо другие индексы.A unique clustered index must be created on a view before any other indexes can be defined on the same view. Дополнительные сведения см. в разделе Создание индексированных представлений.For more information, see Create Indexed Views.

Создавайте кластеризованные индексы до создания любых некластеризованных.Create the clustered index before creating any nonclustered indexes. При создании кластеризованного индекса все существующие некластеризованные индексы таблицы перестраиваются.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

Если аргумент CLUSTERED не указан, создается некластеризованный индекс.If CLUSTERED is not specified, a nonclustered index is created.

Примечание

Поскольку конечный уровень кластеризованного индекса и страницы данных — это по определению одно и то же, создание кластеризованного индекса и использование предложения ON partition_scheme_name или ON filegroup_name приводят к перемещению таблицы из файловой группы, в которой она была создана, в новую схему секционирования или файловую группу.Because the leaf level of a clustered index and the data pages are the same by definition, creating a clustered index and using the ON partition_scheme_name or ON filegroup_name clause effectively moves a table from the filegroup on which the table was created to the new partition scheme or filegroup. Прежде чем создавать таблицы или индексы в определенных файловых группах, проверьте, какие группы доступны, и убедитесь в том, что в этих группах достаточно свободного места для индекса.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

В некоторых случаях создание кластеризованного индекса может привести к включению ранее отключенных индексов.In some cases creating a clustered index can enable previously disabled indexes. Дополнительные сведения см. в разделах Включение индексов и ограничений и Отключение индексов и ограничений.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTEREDNONCLUSTERED
Создает индекс, задающий логическое упорядочение для таблицы.Creates an index that specifies the logical ordering of a table. Логический порядок строк в некластеризованном индексе не влияет на их физический порядок.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

Каждая таблица может содержать до 999 некластеризованных индексов независимо от способа их создания: неявно с помощью ограничений PRIMARY KEY и UNIQUE или явно с помощью инструкции CREATE INDEX.Each table can have up to 999 nonclustered indexes, regardless of how the indexes are created: either implicitly with PRIMARY KEY and UNIQUE constraints, or explicitly with CREATE INDEX.

Для индексированных представлений некластеризованные индексы могут создаваться только в случае, если уже определен уникальный кластеризованный индекс.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

Если не указано иное, типом индекса по умолчанию является NONCLUSTERED.If not otherwise specified, the default index type is NONCLUSTERED.

index_name index_name
Имя индекса.Is the name of the index. Имена индексов должны быть уникальными в пределах таблицы или представления, но необязательно должны быть уникальными в пределах базы данных.Index names must be unique within a table or view, but do not have to be unique within a database. Имена индексов должны удовлетворять правилам для идентификаторов.Index names must follow the rules of identifiers.

column column
Столбец или столбцы, на которых основан индекс.Is the column or columns on which the index is based. Имена одного или нескольких столбцов для создания комбинированного индекса.Specify two or more column names to create a composite index on the combined values in the specified columns. Столбцы, которые должны быть включены в составной индекс, указываются в скобках за аргументом table_or_view_name в порядке сортировки.List the columns to be included in the composite index, in sort-priority order, inside the parentheses after table_or_view_name.

В один ключ составного индекса могут входить до 32 столбцов.Up to 32 columns can be combined into a single composite index key. Все столбцы ключа составного индекса должны находиться в одной таблице или одном и том же представлении.All the columns in a composite index key must be in the same table or view. Максимально допустимый размер значений составного индекса составляет 900 байтов для кластеризованного индекса или 1700 для некластеризованного индекса.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. Ограничениями являются 16 столбцов и 900 байт для версий до База данных SQLSQL Database и SQL Server 2016 (13.x)SQL Server 2016 (13.x).The limits are 16 columns and 900 bytes for versions before База данных SQLSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x).

Столбцы с типами данных LOB ntext, text, varchar(max) , nvarchar(max) , varbinary(max) , xml или image нельзя указать в качестве столбцов для индекса.Columns that are of the large object (LOB) data types ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image cannot be specified as key columns for an index. Кроме того, определение представления не может включать столбцы типов ntext, text или image, даже если они не указаны в инструкции CREATE INDEX.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

Можно создавать индексы на столбцах с определяемым пользователем типом данных CLR, если этот тип поддерживает двоичное упорядочение.You can create indexes on CLR user-defined type columns if the type supports binary ordering. Можно также создавать индексы на вычисляемых столбцах, определенных как вызовы методов для столбцов с определяемыми пользователем типами данных, если эти методы помечены как детерминированные и не выполняют операции доступа к данным.You can also create indexes on computed columns that are defined as method invocations off a user-defined type column, as long as the methods are marked deterministic and do not perform data access operations. Дополнительные сведения об индексировании столбцов с определяемыми пользователем типами данных CLR см. в разделе Определяемые пользователем типы данных CLR.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ][ ASC | DESC ]
Определяет сортировку значений заданного столбца индекса: по возрастанию или по убыванию.Determines the ascending or descending sort direction for the particular index column. Значение по умолчанию — ASC.The default is ASC.

1INCLUDE ( column [ , ... n ] ) INCLUDE (column [ ,... n ] )
Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного индекса.Specifies the non-key columns to be added to the leaf level of the nonclustered index. Некластеризованный индекс может быть уникальным или неуникальным.The nonclustered index can be unique or non-unique.

Имена столбцов в списке INCLUDE не могут повторяться и не могут использоваться одновременно как ключевые и неключевые.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. Некластеризованные индексы всегда содержат столбцы кластеризованного индекса, если для таблицы определен кластеризованный индекс.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. Дополнительные сведения см. в статье Создание индексов с включенными столбцами.For more information, see Create Indexes with Included Columns.

Допускаются данные всех типов, за исключением text, ntextи image.All data types are allowed except text, ntext, and image. Индекс должен создаваться или перестраиваться в режиме "вне сети" (ONLINE = OFF), если любой из заданных неключевых столбцов имеет тип данных varchar(max) , nvarchar(max) или varbinary(max) .The index must be created or rebuilt offline (ONLINE = OFF) if any one of the specified non-key columns are varchar(max), nvarchar(max), or varbinary(max) data types.

Вычисляемые столбцы, являющиеся детерминированными и точными или неточными, могут быть включенными столбцами.Computed columns that are deterministic and either precise or imprecise can be included columns. Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) и xml, могут быть включены в неключевые столбцы, если типы данных вычисляемого столбца допускаются в качестве столбца для включения.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be included in non-key columns as long as the computed column data types is allowable as an included column. Дополнительные сведения см. в разделе Индексы вычисляемых столбцов.For more information, see Indexes on Computed Columns.

Сведения о создании XML-индекса см. в описании CREATE XML INDEX.For information on creating an XML index, see CREATE XML INDEX.

WHERE <filter_predicate>WHERE <filter_predicate>
Создает отфильтрованный индекс путем указания строк для включения в индекс.Creates a filtered index by specifying which rows to include in the index. Отфильтрованный индекс должен быть некластеризованным индексом для таблицы.The filtered index must be a nonclustered index on a table. Создается отфильтрованная статистика для строк данных отфильтрованного индекса.Creates filtered statistics for the data rows in the filtered index.

Предикат фильтра использует простую логику сравнения и не может ссылаться на вычисляемый столбец, столбец определяемого пользователем типа, столбец типа пространственных данных или столбец типа hierarchyID.The filter predicate uses simple comparison logic and cannot reference a computed column, a UDT column, a spatial data type column, or a hierarchyID data type column. Сравнения с помощью литералов NULL с операторами сравнения недопустимы.Comparisons using NULL literals are not allowed with the comparison operators. Вместо этого используются операторы IS NULL и IS NOT NULL.Use the IS NULL and IS NOT NULL operators instead.

Далее приведено несколько примеров использования предикатов фильтра для таблицы Production.BillOfMaterials:Here are some examples of filter predicates for the Production.BillOfMaterials table:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Отфильтрованные индексы не применяются к XML-индексам и полнотекстовым индексам.Filtered indexes do not apply to XML indexes and full-text indexes. Для индексов UNIQUE только выбранные строки должны иметь уникальные значения индексов.For UNIQUE indexes, only the selected rows must have unique index values. Отфильтрованные индексы не поддерживают параметр IGNORE_DUP_KEY.Filtered indexes do not allow the IGNORE_DUP_KEY option.

ON partition_scheme_name ( column_name ) ON partition_scheme_name ( column_name )
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Задает схему секционирования, которая определяет файловые группы, соответствующие секциям секционированного индекса.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. Схема секционирования должна быть создана в базе данных путем выполнения инструкции CREATE PARTITION SCHEME или ALTER PARTITION SCHEME.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name указывает столбец, по которому будет секционирован индекс.column_name specifies the column against which a partitioned index will be partitioned. Столбец должен соответствовать по типу данных, длине и точности аргументу функции секционирования, используемой аргументом partition_scheme_name.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using. Аргумент column_name необязательно должен соответствовать столбцам из определения индекса.column_name is not restricted to the columns in the index definition. Можно указать любой столбец базовой таблицы, за исключением случая секционирования индекса UNIQUE, когда аргумент column_name должен быть выбран из используемых в качестве уникального ключа.Any column in the base table can be specified, except when partitioning a UNIQUE index, column_name must be chosen from among those used as the unique key. Это ограничение дает возможность компоненту Компонент Database EngineDatabase Engine проверять уникальность значений ключа только в одной секции.This restriction allows the Компонент Database EngineDatabase Engine to verify uniqueness of key values within a single partition only.

Примечание

При секционировании неуникального кластеризованного индекса компонент Компонент Database EngineDatabase Engine по умолчанию добавляет столбец секционирования в список ключей кластеризованного индекса, если этого столбца еще нет в списке.When you partition a non-unique, clustered index, the Компонент Database EngineDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. При секционировании неуникального некластеризованного индекса компонент Компонент Database EngineDatabase Engine добавляет столбец секционирования как неключевой (включенный) столбец индекса, если этого столбца еще нет в списке.When partitioning a non-unique, nonclustered index, the Компонент Database EngineDatabase Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

Если аргумент partition_scheme_name или filegroup не задан и таблица секционирована, индекс помещается в ту же схему секционирования и с тем же столбцом секционирования, что и для базовой таблицы.If partition_scheme_name or filegroup is not specified and the table is partitioned, the index is placed in the same partition scheme, using the same partitioning column, as the underlying table.

Примечание

Для XML-индекса задать схему секционирования невозможно.You cannot specify a partitioning scheme on an XML index. Если базовая таблица секционирована, XML-индекс использует ту же схему секционирования, что и таблица.If the base table is partitioned, the XML index uses the same partition scheme as the table.

Дополнительные сведения об индексах секционирования см. в разделе Секционированные таблицы и индексы.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_name ON filegroup_name
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017)Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017)

Создает заданный индекс в указанной файловой группе.Creates the specified index on the specified filegroup. Если местоположение не указано и таблица или представление не секционированы, индекс использует ту же файловую группу, что и базовая таблица или базовое представление.If no location is specified and the table or view is not partitioned, the index uses the same filegroup as the underlying table or view. Файловая группа должна существовать.The filegroup must already exist.

ON " default " ON " default "
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Создает указанный индекс для той же файловой группы или схемы секционирования, к которой относится таблица или представление.Creates the specified index on the same filegroup or partition scheme as the table or view.

Слово "default" в этом контексте не является ключевым.The term default, in this context, is not a keyword. Это идентификатор установленной по умолчанию файловой группы, который должен иметь разделители, как в выражениях ON " default " или ON [ default ] .It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Если указано значение "default" (по умолчанию), параметр QUOTED_IDENTIFIER должен иметь значение ON для текущего сеанса.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Это параметр по умолчанию.This is the default setting. Дополнительные сведения см. в описании SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

Примечание

"default" не указывает файловую группу по умолчанию для базы данных в контексте CREATE INDEX."default" does not indicate the database default filegroup in the context of CREATE INDEX. В случае с инструкцией CREATE TABLE поведение иное: значение "default" указывает расположение таблицы в файловой группе по умолчанию для базы данных.This differs from CREATE TABLE, where "default" locates the table on the database default filegroup.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017)Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017)

Указывает размещение данных FILESTREAM для таблицы при создании кластеризованного индекса.Specifies the placement of FILESTREAM data for the table when a clustered index is created. Предложение FILESTREAM_ON позволяет перемещать данные FILESTREAM в другую файловую группу FILESTREAM или схему секционирования.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

Аргумент filestream_filegroup_name указывает имя файловой группы FILESTREAM.filestream_filegroup_name is the name of a FILESTREAM filegroup. В файловой группе должен быть определен один файл для файловой группы с помощью инструкции CREATE DATABASE или ALTER DATABASE, иначе возникает ошибка.The filegroup must have one file defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement; otherwise, an error is raised.

Если таблица секционирована, должно быть включено предложение FILESTREAM_ON и указана схема секционирования файловых групп FILESTREAM, использующая те же функции и столбцы секционирования, что и схема секционирования для таблицы.If the table is partitioned, the FILESTREAM_ON clause must be included and must specify a partition scheme of FILESTREAM filegroups that uses the same partition function and partition columns as the partition scheme for the table. В противном случае произойдет ошибка.Otherwise, an error is raised.

Если таблица не секционирована, столбец FILESTREAM не может быть секционирован.If the table is not partitioned, the FILESTREAM column cannot be partitioned. Данные FILESTREAM для этой таблицы необходимо хранить в отдельной файловой группе, указанной в предложении FILESTREAM_ON.FILESTREAM data for the table must be stored in a single filegroup that is specified in the FILESTREAM_ON clause.

Предложение FILESTREAM_ON NULL можно указать в инструкции CREATE INDEX, если создается кластеризованный индекс и таблица не содержит столбец FILESTREAM.FILESTREAM_ON NULL can be specified in a CREATE INDEX statement if a clustered index is being created and the table does not contain a FILESTREAM column.

Дополнительные сведения см. в разделе FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

<object>::=<object>::=

Полное или неполное имя индексируемого объекта.Is the fully qualified or nonfully qualified object to be indexed.

database_name database_name
Имя базы данных.Is the name of the database.

schema_name schema_name
Имя схемы, которой принадлежит таблица или представление.Is the name of the schema to which the table or view belongs.

table_or_view_name table_or_view_name
Имя индексируемой таблицы или представления.Is the name of the table or view to be indexed.

Чтобы создать индекс для представления, это представление оно должно быть определено с параметром SCHEMABINDING.The view must be defined with SCHEMABINDING to create an index on it. Прежде чем создавать любой некластеризованный индекс для представления, необходимо создать уникальный кластеризованный индекс.A unique clustered index must be created on a view before any nonclustered index is created. Дополнительные сведения об индексированных представлениях см. в разделе "Примечания".For more information about indexed views, see the Remarks section.

Начиная с версии SQL Server 2016 (13.x)SQL Server 2016 (13.x), объект может быть таблицей, хранящейся в кластеризованном индексе.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

База данных SQL AzureAzure SQL Database поддерживает формат трехкомпонентного имени database_name.[schema_name].object_name, если database_name обозначает текущую базу данных или database_name имеет значение tempdb и object_name начинается с символа #.supports the three-part name format database_name.[schema_name].object_name when the database_name is the current database or the database_name is tempdb and the object_name starts with #.

<relational_index_option>::= <relational_index_option>::=
Указывает параметры, которые должны использоваться при создании индекса.Specifies the options to use when you create the index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Определяет разреженность индекса.Specifies index padding. Значение по умолчанию — OFF.The default is OFF.

ONON
Процент свободного места, определяемый параметром fillfactor, применяется к страницам индекса промежуточного уровня.The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF или fillfactor не указанOFF or fillfactor is not specified
Страницы промежуточного уровня заполняются почти полностью, при этом остается достаточно места по крайней мере для одной строки максимального размера, возможного в этом индексе при заданном наборе ключей на промежуточных страницах.The intermediate-level pages are filled to near capacity, leaving sufficient space for at least one row of the maximum size the index can have, considering the set of keys on the intermediate pages.

Параметр PAD_INDEX имеет смысл только в случае, если указан параметр FILLFACTOR, так как использует процентное значение, указанное в нем.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. Если процент, заданный аргументом FILLFACTOR, недостаточно велик для размещения одной строки, компонент Компонент Database EngineDatabase Engine внутренне переопределит это значение, чтобы обеспечить минимум.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the Компонент Database EngineDatabase Engine internally overrides the percentage to allow for the minimum. Количество строк на странице индекса промежуточного уровня никогда не бывает менее двух даже при самых малых значениях аргумента fillfactor.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

Для обратной совместимости синтаксиса аргумент WITH PAD_INDEX эквивалентен аргументу WITH PAD_INDEX = ON.In backward compatible syntax, WITH PAD_INDEX is equivalent to WITH PAD_INDEX = ON.

FILLFACTOR = fillfactor FILLFACTOR =fillfactor
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Определяет величину в процентах, показывающую, насколько компонент Компонент Database EngineDatabase Engine должен заполнять конечный уровень каждой страницы индекса во время его создания или перестроения.Specifies a percentage that indicates how full the Компонент Database EngineDatabase Engine should make the leaf level of each index page during index creation or rebuild. Значение fillfactor должно быть целым числом от 1 до 100.fillfactor must be an integer value from 1 to 100. Если параметр fillfactor равен 100, компонент Компонент Database EngineDatabase Engine создает индексы с полностью заполненными страницами конечного уровня.If fillfactor is 100, the Компонент Database EngineDatabase Engine creates indexes with leaf pages filled to capacity.

Аргумент FILLFACTOR действует только при создании или перестройке индекса.The FILLFACTOR setting applies only when the index is created or rebuilt. Компонент Компонент Database EngineDatabase Engine не сохраняет динамически указанный процентный объем свободного места на страницах.The Компонент Database EngineDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Значение коэффициента заполнения можно увидеть в представлении каталога sys.indexes.To view the fill factor setting, use the sys.indexes catalog view.

Важно!

Создание кластеризованного индекса с аргументом FILLFACTOR меньше 100 влияет на объем пространства хранения, занимаемого данными, т. к. компонент Компонент Database EngineDatabase Engine перераспределяет данные, когда создает кластеризованный индекс.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the Компонент Database EngineDatabase Engine redistributes the data when it creates the clustered index.

Дополнительные сведения см. в статье Указание коэффициента заполнения для индекса.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Указывает, сохранять ли временные результаты сортировки в базе данных tempdb.Specifies whether to store temporary sort results in tempdb. Значение по умолчанию — OFF.The default is OFF.

ONON
Промежуточные результаты сортировки, которые используются при индексировании, хранятся в базе данных tempdb.The intermediate sort results that are used to build the index are stored in tempdb. Это может уменьшить время, необходимое для создания индекса, если база данных tempdb и база данных пользователя находятся на разных наборах дисков.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. Однако это увеличивает использование места на диске, которое используется при индексировании.However, this increases the amount of disk space that is used during the index build.

OFFOFF
Промежуточные результаты сортировки хранятся в той же базе данных, где и индекс.The intermediate sort results are stored in the same database as the index.

Кроме места в базе данных пользователя, необходимого для создания индекса, требуется примерно столько же дополнительного места в базе данных tempdb для хранения промежуточных результатов сортировки.In addition to the space required in the user database to create the index, tempdb must have about the same amount of additional space to hold the intermediate sort results. Дополнительные сведения см. в разделе Параметр SORT_IN_TEMPDB для индексов.For more information, see SORT_IN_TEMPDB Option For Indexes.

Для обратной совместимости синтаксиса аргумент WITH SORT_IN_TEMPDB эквивалентен аргументу WITH SORT_IN_TEMPDB = ON.In backward compatible syntax, WITH SORT_IN_TEMPDB is equivalent to WITH SORT_IN_TEMPDB = ON.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. Параметр не работает во время выполнения инструкции CREATE INDEX, ALTER INDEX или UPDATE.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. Значение по умолчанию — OFF.The default is OFF.

ONON
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится предупреждающее сообщение.A warning message will occur when duplicate key values are inserted into a unique index. С ошибкой завершаются только строки, нарушающие ограничение уникальности.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится сообщение об ошибке.An error message will occur when duplicate key values are inserted into a unique index. Будет выполнен откат всей операции INSERT.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY нельзя установить в значение ON для индексов, создаваемых для представлений, неуникальных индексов, XML-индексов, пространственных индексов и фильтруемых индексов.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Для просмотра значения IGNORE_DUP_KEY используйте sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Для обратной совместимости синтаксиса аргумент WITH IGNORE_DUP_KEY эквивалентен аргументу WITH IGNORE_DUP_KEY = ON.In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF}STATISTICS_NORECOMPUTE = { ON | OFF}
Указывает, выполнялся ли перерасчет статистики распределения.Specifies whether distribution statistics are recomputed. Значение по умолчанию — OFF.The default is OFF.

ONON
Устаревшие статистики не пересчитываются автоматически.Out-of-date statistics are not automatically recomputed.

OFFOFF
Автоматическое обновление статистических данных включено.Automatic statistics updating are enabled.

Чтобы восстановить автоматическое обновление статистики, следует установить STATISTICS_NORECOMPUTE в значение OFF или выполнить UPDATE STATISTICS без предложения NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Важно!

Отключение автоматического пересчета статистики распределения может помешать оптимизатору запросов выбрать оптимальные планы выполнения запросов, обращенных к таблице.Disabling automatic recomputation of distribution statistics may prevent the query optimizer from picking optimal execution plans for queries involving the table.

Для обратной совместимости синтаксиса аргумент WITH STATISTICS_NORECOMPUTE эквивалентен аргументу WITH STATISTICS_NORECOMPUTE = ON.In backward compatible syntax, WITH STATISTICS_NORECOMPUTE is equivalent to WITH STATISTICS_NORECOMPUTE = ON.

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }
При значении ON статистики создаются как статистики отдельно по секциям.When ON, the statistics created are per partition statistics. При значении OFF дерево статистик удаляется и SQL ServerSQL Server повторно вычисляет статистики.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Значение по умолчанию — OFF.The default is OFF.

Если статистики по секциям не поддерживаются, параметр пропускается и выводится предупреждение.If per partition statistics are not supported the option is ignored and a warning is generated. Добавочные статистики не поддерживаются для следующих типов статистических данных.Incremental stats are not supported for following statistics types:

  • Статистики, созданные с индексами, не выровненными по секциям для базовой таблицы.Statistics created with indexes that are not partition-aligned with the base table.
  • Статистики, созданные в доступных для чтения базах данных-получателях AlwaysOn.Statistics created on Always On readable secondary databases.
  • Статистики, созданные в базах данных, доступных только для чтения.Statistics created on read-only databases.
  • Статистики, созданные по фильтрованным индексам.Statistics created on filtered indexes.
  • Статистика, созданная по представлениям.Statistics created on views.
  • Статистики, созданные по внутренним таблицам.Statistics created on internal tables.
  • Статистики, созданные с пространственными индексами или XML-индексами.Statistics created with spatial indexes or XML indexes.

DROP_EXISTING = { ON | OFF }DROP_EXISTING = { ON | OFF }
Параметр для удаления и перестроения существующего кластеризованного или некластеризованного индекса с измененными спецификациями столбцов и сохранения того же имени для индекса.Is an option to drop and rebuild the existing clustered or nonclustered index with modified column specifications, and keep the same name for the index. Значение по умолчанию — OFF.The default is OFF.

ONON
Указывает удалить и перестроить существующий индекс, который должен иметь имя, совпадающее с именем параметра index_name.Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFFOFF
Указывает не удалять и перестраивать существующий индекс.Specifies not to drop and rebuild the existing index. SQL Server отображает ошибку, если индекс с указанным именем уже существует.SQL Server displays an error if the specified index name already exists.

С помощью инструкции DROP_EXISTING можно изменить:With DROP_EXISTING, you can change:

  • некластеризованный индекс rowstore на кластеризованный индекс rowstore.A nonclustered rowstore index to a clustered rowstore index.

С помощью инструкции DROP_EXISTING нельзя изменить:With DROP_EXISTING, you cannot change:

  • кластеризованный индекс rowstore на некластеризованный индекс rowstore;A clustered rowstore index to a nonclustered rowstore index.
  • кластеризованный индекс columnstore на индекс rowstore любого типа.A clustered columnstore index to any type of rowstore index.

Для обратной совместимости синтаксиса аргумент WITH DROP_EXISTING эквивалентен аргументу WITH DROP_EXISTING = ON.In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

ONLINE = { ON | OFF }ONLINE = { ON | OFF }
Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Значение по умолчанию — OFF.The default is OFF.

Примечание

Операции с индексами в режиме "в сети" доступны не во всех выпусках MicrosoftMicrosoftSQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статье Возможности, поддерживаемые различными выпусками SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016.

ONON
Долгосрочные блокировки таблицы не поддерживаются во время операций с индексами.Long-term table locks are not held for the duration of the index operation. Во время главной фазы операций с индексами только блокировка с намерением совмещаемого доступа (IS) удерживается в исходной таблице.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Это включает запросы или обновления применительно к обрабатываемой базовой таблице и индексам.This enables queries or updates to the underlying table and indexes to proceed. В начале операции совмещаемая блокировка (S) удерживается на исходном объекте в течение очень короткого времени.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. В конце операции на источнике на короткое время удерживается совмещаемая блокировка (S), если создается некластеризованный индекс. Если в режиме в сети создается или удаляется кластеризованный индекс и, если перестраивается кластеризованный или некластеризованный индекс, удерживается блокировка SCH-M (изменения схемы).At the end of the operation, for a short period of time, an S (Shared) lock is acquired on the source if a nonclustered index is being created; or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. При создании индекса для временной локальной таблицы параметр ONLINE не может принимать значение ON.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
Блокировки таблиц применяются во время выполнения операций с индексами.Table locks are applied for the duration of the index operation. Блокировку изменения схемы (Sch-M) в таблице получает операция с индексами вне сети, которая создает, перестраивает или удаляет кластеризованный индекс либо перестраивает или удаляет некластеризованный индекс.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Это предотвращает доступ к базовой таблице всех пользователей во время операции.This prevents all user access to the underlying table for the duration of the operation. Операция с индексами вне сети, создающая некластеризованный индекс, получает совмещаемую блокировку (S) в таблице.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Это запрещает проводить обновления базовой таблицы, но разрешает проводить операции чтения, например инструкции SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Дополнительные сведения см. в разделе Об операциях с индексами в режиме "в сети".For more information, see How Online Index Operations Work.

RESUMABLE = { ON | OFF}RESUMABLE = { ON | OFF}

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database (общедоступная предварительная версия)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database (public preview)

Указывает, является ли операция с индексами в режиме "в сети" возобновляемой.Specifies whether an online index operation is resumable.

ONON
Операция с индексами является возобновляемой.Index operation is resumable.

OFFOFF
Операция с индексами является невозобновляемой.Index operation is not resumable.

MAX_DURATION = time [MINUTES] используется с RESUMABLE = ON (требуется ONLINE = ON)MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON)

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database (общедоступная предварительная версия)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database (public preview)

Указывает время (целочисленное значение минутах), в течение которого выполняется возобновляемая операция с индексами в сети до приостановки.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Предупреждение

Более подробные сведения об операциях с индексами, которые можно выполнить в сети, см. в разделе Рекомендации по операциям с индексами в сети.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Индексы, включая индексы глобальных временных таблиц, могут создаваться в режиме в сети со следующими исключениями:Indexes, including indexes on global temp tables, can be created online with the following exceptions:

  • XML-индексXML index
  • Индекс локальной временной таблицы.Index on a local temp table.
  • Исходные уникальные кластеризованные индексы представлений.Initial unique clustered index on a view.
  • Отключенные кластеризованные индексы.Disabled clustered indexes.
  • Кластеризованные индексы, если базовая таблица содержит типы данных LOB: image, ntext, text и пространственные типы.Clustered index if the underlying table contains LOB data types: image, ntext, text, and spatial types.
  • Столбцы varchar(max) и varbinary(max) не могут быть частью индекса.varchar(max) and varbinary(max) columns cannot be part of an index. В SQL ServerSQL Server (начиная с версии SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и в База данных SQLSQL Database, если таблица содержит столбец varchar(max) или varbinary(max) , кластеризованный индекс, содержащий другие столбцы, можно построить или перестроить с использованием параметра ONLINE.In SQL ServerSQL Server (beginning with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and in База данных SQLSQL Database, when a table contains varchar(max) or varbinary(max) columns, a clustered index containing other columns, can be built or rebuilt using the ONLINE option. База данных SQLSQL Database не разрешает использование параметра ONLINE, если базовая таблица содержит столбец varchar(max) или varbinary(max) .does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns.

Дополнительные сведения см. в статье Выполнение операции с индексами в сети.For more information, see Perform Index Operations Online.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Указывает, разрешена ли блокировка строк.Specifies whether row locks are allowed. Значение по умолчанию — ON.The default is ON.

ONON
Блокировки строк допустимы при доступе к индексу.Row locks are allowed when accessing the index. Компонент Компонент Database EngineDatabase Engine определяет, когда используются блокировки строки.The Компонент Database EngineDatabase Engine determines when row locks are used.

OFFOFF
Блокировки строк не используются.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Указывает, разрешена ли блокировка страниц.Specifies whether page locks are allowed. Значение по умолчанию — ON.The default is ON.

ONON
Блокировки страниц возможны при доступе к индексу.Page locks are allowed when accessing the index. Компонент Компонент Database EngineDatabase Engine определяет, когда используются блокировки страниц.The Компонент Database EngineDatabase Engine determines when page locks are used.

OFFOFF
Блокировки страниц не используются.Page locks are not used.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview)

Определяет, следует ли выполнять оптимизацию, связанную с состязанием при операциях вставки на последнюю страницу.Specifies whether or not to optimize for last-page insert contention. Значение по умолчанию — OFF.The default is OFF. См. подробнее раздел о последовательных ключах.See the Sequential Keys section for more information.

MAXDOP = max_degree_of_parallelism MAXDOP = max_degree_of_parallelism
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Переопределяет параметр конфигурации max degree of parallelism на время выполнения операции с индексами.Overrides the max degree of parallelism configuration option for the duration of the index operation. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов.Use MAXDOP to limit the number of processors used in a parallel plan execution. Максимальное число процессоров — 64.The maximum is 64 processors.

Параметр max_degree_of_parallelism может иметь одно из следующих значений:max_degree_of_parallelism can be:

11
Подавляет формирование параллельных планов.Suppresses parallel plan generation.

>1>1
Ограничивает максимальное количество процессоров, используемых в параллельных операциях с индексами, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы.Restricts the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload.

0 (по умолчанию)0 (default)
В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.Uses the actual number of processors or fewer based on the current system workload.

Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Примечание

Параллельные операции с индексами доступны не во всех выпусках MicrosoftMicrosoftSQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статьях Возможности, поддерживаемые различными выпусками SQL Server 2016 и Возможности, поддерживаемые различными выпусками SQL Server 2017.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016 and Editions and Supported Features for SQL Server 2017.

DATA_COMPRESSIONDATA_COMPRESSION
Задает режим сжатия данных для указанного индекса, номера секции или диапазона секций.Specifies the data compression option for the specified index, partition number, or range of partitions. Существуют следующие варианты выбора.The options are as follows:

NoneNONE
Индекс или заданные секции не сжимаются.Index or specified partitions are not compressed.

ROWROW
Для индекса или заданных секций производится сжатие строк.Index or specified partitions are compressed by using row compression.

PAGEPAGE
Для индекса или заданных секций производится сжатие страниц.Index or specified partitions are compressed by using page compression.

Дополнительные сведения о сжатии см. в разделе Сжатие данных.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

Указывает секции, к которым применяется параметр DATA_COMPRESSION.Specifies the partitions to which the DATA_COMPRESSION setting applies. Если индекс не секционирован, аргумент ON PARTITIONS создаст ошибку.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Если не указано предложение ON PARTITIONS, то параметр DATA_COMPRESSION применяется ко всем секциям секционированного индекса.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> можно указать одним из следующих способов.<partition_number_expression> can be specified in the following ways:

  • Указав номер секции, например ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).
  • Указав номера нескольких секций, разделив их запятыми, например ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • Указав диапазоны секций и отдельные секции, например ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions, for example: ON PARTITIONS (2, 4, 6 TO 8).

<range> можно указать номерами секций, разделенными ключевым словом TO, например: ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

Чтобы для разных секций задать разные типы сжатия данных, укажите параметр DATA_COMPRESSION несколько раз, например следующим образом.To set different types of data compression for different partitions, specify the DATA_COMPRESSION option more than once, for example:

REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

ПримечанияRemarks

Инструкция CREATE INDEX оптимизируется, как и любой другой запрос.The CREATE INDEX statement is optimized like any other query. Для уменьшения числа операций ввода-вывода обработчик запросов может вместо таблицы просматривать другой индекс.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. В некоторых ситуациях можно отказаться от операций сортировки.The sort operation may be eliminated in some situations. На многопроцессорных компьютерах инструкция CREATE INDEX, как и другие запросы, может использовать больше процессоров для операций просмотра и сортировки, связанных с созданием индекса.On multiprocessor computers CREATE INDEX can use more processors to perform the scan and sort operations associated with creating the index, in the same way as other queries do. Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Если в качестве модели восстановления базы данных используется модель с неполным протоколированием или простая модель, операция создания индекса может выполняться с минимальным протоколированием.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Индексы могут создаваться для временной таблицы.Indexes can be created on a temporary table. При удалении таблицы или в конце сеанса такие индексы удаляются.When the table is dropped or the session ends, the indexes are dropped.

Кластеризованный индекс можно создать на основе табличной переменной при создании первичного ключа.A clustered index can be built on a table variable when a Primary Key is created. После завершения выполнения запроса или окончания сеанса индекс уничтожается.When the query completes or the session ends, the index is dropped.

Индексы поддерживают расширенные свойства.Indexes support extended properties.

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

Чтобы создать кластеризованный индекс для таблицы (кучи) или удалить и повторно создать существующий кластеризованный индекс, требуется дополнительная рабочая область в базе данных для сортировки и временного копирования данных исходной таблицы или существующего кластеризованного индекса.Creating a clustered index on a table (heap) or dropping and re-creating an existing clustered index requires additional workspace to be available in the database to accommodate data sorting and a temporary copy of the original table or existing clustered index data. Дополнительные сведения о кластеризованных индексах см. в статьях Создание кластеризованных индексов и Руководство по архитектуре и разработке индексов SQL Server.For more information about clustered indexes, see Create Clustered Indexes and the SQL Server Index Architecture and Design Guide.

Некластеризованные индексыNonclustered Indexes

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) и База данных SQL AzureAzure SQL Database, вы можете создавать некластеризованный индекс в таблице, сохраненной в виде кластеризованного индекса columnstore.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in База данных SQL AzureAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. Если сначала создать некластеризованный индекс в таблице, сохраненной в виде кучи или кластеризованного индекса, индекс сохранится после дальнейшего преобразования таблицы в кластеризованный индекс columnstore.If you first create a nonclustered index on a table stored as a heap or clustered index, the index will persist if you later convert the table to a clustered columnstore index. Кроме того, необязательно удалять некластеризованный индекс при перестройке кластеризованного индекса columnstore.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

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

  • Параметр FILESTREAM_ON является недопустимым при создании некластеризованного индекса в таблице, сохраненной в виде кластеризованного индекса columnstore.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

Уникальные индексыUnique Indexes

Если существует уникальный индекс, то каждый раз при добавлении данных с помощью операции вставки компонент Компонент Database EngineDatabase Engine делает проверку на появление повторяющихся значений.When a unique index exists, the Компонент Database EngineDatabase Engine checks for duplicate values each time data is added by a insert operations. Производится откат операций вставки, которые могли бы создать повторяющиеся значения ключей, и компонент Компонент Database EngineDatabase Engine выдает сообщение об ошибке.Insert operations that would generate duplicate key values are rolled back, and the Компонент Database EngineDatabase Engine displays an error message. Это происходит даже в случае, если операция вставки изменяет несколько строк, а повторяющееся значение может появиться всего одно.This is true even if the insert operation changes many rows but causes only one duplicate. Если делается попытка ввести данные, для которых существует уникальный индекс, и предложение IGNORE_DUP_KEY имеет значение ON, сбоем завершаются операции только с теми строками, где нарушается свойство уникальности индекса.If an attempt is made to enter data for which there is a unique index and the IGNORE_DUP_KEY clause is set to ON, only the rows violating the UNIQUE index fail.

Секционированные индексыPartitioned Indexes

Секционированные индексы создаются и поддерживаются так же, как и секционированные таблицы, но обрабатываются как отдельные объекты базы данных подобно обычным индексам.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. Можно создать секционированный индекс для несекционированной таблицы и несекционированный индекс для секционированной таблицы.You can have a partitioned index on a table that is not partitioned, and you can have a nonpartitioned index on a table that is partitioned.

Если создается индекс для секционированной таблицы и не указывается файловая группа, в которую должен быть помещен индекс, индекс секционируется так же, как и базовая таблица.If you are creating an index on a partitioned table, and do not specify a filegroup on which to place the index, the index is partitioned in the same manner as the underlying table. Дело в том, что по умолчанию индексы помещаются в те же файловые группы, что и их базовые таблицы, а в случае секционированной таблицы — в схему секционирования, использующую те же самые столбцы секционирования.This is because indexes, by default, are placed on the same filegroups as their underlying tables, and for a partitioned table in the same partition scheme that uses the same partitioning columns. Когда индекс использует ту же схему и столбец секционирования, что и таблица, индекс выравнивается с таблицей.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

Предупреждение

Создание и перестройка невыровненных индексов для таблицы, количество секций в которой превышает 1000, возможны, но не поддерживаются.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Это может привести к снижению производительности или чрезмерному потреблению памяти во время таких операций.Doing so may cause degraded performance or excessive memory consumption during these operations. Если количество секций превышает 1000, рекомендуется использовать только выровненные индексы.We recommend using only aligned indexes when the number of partitions exceed 1,000.

Если секционируется неуникальный кластеризованный индекс, компонент Компонент Database EngineDatabase Engine по умолчанию добавляет столбцы секционирования в список кластеризованных ключей индекса, если они еще не заданы.When partitioning a non-unique, clustered index, the Компонент Database EngineDatabase Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

Индексированные представления могут создаваться для секционированных таблиц таким же образом, как и индексы для таблиц.Indexed views can be created on partitioned tables in the same manner as indexes on tables. Дополнительные сведения о секционированных индексах см. в статьях Секционированные таблицы и индексы и Руководство по архитектуре и разработке индексов SQL Server.For more information about partitioned indexes, see Partitioned Tables and Indexes and the SQL Server Index Architecture and Design Guide.

Статистические данные в SQL Server 2017SQL Server 2017 не создаются путем сканирования всех строк таблицы при создании или перестроении секционированного индекса.In SQL Server 2017SQL Server 2017, statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Вместо этого оптимизатор запросов использует для создания статистики алгоритм выборки по умолчанию.Instead, the query optimizer uses the default sampling algorithm to generate statistics. Для получения статистики по секционированным индексам путем сканирования всех строк таблицы используйте инструкции CREATE STATISTICS или UPDATE STATISTICS с предложением FULLSCAN.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

Отфильтрованные индексыFiltered Indexes

Отфильтрованный индекс является оптимизированным некластеризованным индексом, предназначенным для запросов, выбирающих небольшой процент строк таблицы.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Чтобы проиндексировать часть данных таблицы, в нем используется предикат фильтра.It uses a filter predicate to index a portion of the data in the table. Правильно составленный отфильтрованный индекс может увеличить скорость выполнения запроса, уменьшить стоимость хранения и обслуживания.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Обязательные параметры SET для отфильтрованных индексовRequired SET Options for Filtered Indexes

Параметры SET в столбце Required Value необходимы при возникновении любого из следующих условий.The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Создание отфильтрованного индекса.Create a filtered index.

  • Операция INSERT, UPDATE, DELETE или MERGE изменяет данные в отфильтрованном индексе.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.

  • Отфильтрованный индекс используется оптимизатором запросов для создания плана запроса.The filtered index is used by the query optimizer to produce the query plan.

    Параметры SETSET options Обязательное значениеRequired value Значение сервера по умолчаниюDefault server value По умолчаниюDefault

    Значение OLE DB и ODBCOLE DB and ODBC value
    По умолчаниюDefault

    Значение DB-LibraryDB-Library value
    ANSI_NULLSANSI_NULLS ONON ONON ONON OFFOFF
    ANSI_PADDINGANSI_PADDING ONON ONON ONON OFFOFF
    ANSI_WARNINGS*ANSI_WARNINGS* ONON ONON ONON OFFOFF
    ARITHABORTARITHABORT ONON ONON OFFOFF OFFOFF
    CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON ONON ONON OFFOFF
    NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
    QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON ONON ONON OFFOFF
    • Если уровень совместимости базы данных равен 90 или более, при установке параметра ANSI_WARNINGS в состояние ON параметр ARITHABORT также устанавливается в состояние ON.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Если уровень совместимости базы данных установлен в состояние 80 или более раннее, то параметр ARITHABORT необходимо явным образом установить в состояние ON.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

Если параметры SET неверны, может произойти следующее.If the SET options are incorrect, the following conditions can occur:

  • Отфильтрованный индекс не будет создан.The filtered index is not created.
  • Компонент Компонент Database EngineDatabase Engine сформирует ошибку и выполнит откат любой инструкции INSERT, UPDATE, DELETE или MERGE, которая изменила значения данных в индексе.The Компонент Database EngineDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • Оптимизатор запросов не учтет индекс в плане выполнения любой инструкции Transact-SQL.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

Дополнительные сведения об отфильтрованных индексах см. в статьях Создание отфильтрованных индексов и Руководство по архитектуре и разработке индексов SQL Server.For more information about Filtered Indexes, see Create Filtered Indexes and the SQL Server Index Architecture and Design Guide.

Пространственные индексыSpatial Indexes

Сведения о пространственных индексах см. в описании CREATE SPATIAL INDEX и статье Общие сведения о пространственных индексах.For information about spatial indexes, see CREATE SPATIAL INDEX and Spatial Indexes Overview.

XML-индексыXML Indexes

Сведения об XML-индексах см. в описании CREATE XML INDEX и статье XML-индексы (SQL Server).For information about XML indexes see, CREATE XML INDEX and XML Indexes (SQL Server).

Размер ключа индексаIndex Key Size

Максимальный размер ключа индекса составляет 900 байт для кластеризованного индекса и 1700 байт для некластеризованного индекса.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. (До База данных SQLSQL Database и SQL Server 2016 (13.x)SQL Server 2016 (13.x) это ограничение всегда составляло 900 байт.) Индексы в столбцах varchar, размер которых превышает максимальный, могут быть созданы, если в момент создания индекса объем существующих данных в столбцах не превышает максимальный, но последующие операции вставки или обновления, вызывающие превышение общего максимального размера, будут заканчиваться ошибкой.(Before База данных SQLSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x) the limit was always 900 bytes.) Indexes on varchar columns that exceed the byte limit can be created if the existing data in the columns do not exceed the limit at the time the index is created; however, subsequent insert or update actions on the columns that cause the total size to be greater than the limit will fail. Ключ кластеризованного индекса не может включать в себя столбцы 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.

Некластеризованные индексы могут включать неключевые столбцы на конечном уровне индекса.Nonclustered indexes can include non-key columns in the leaf level of the index. При вычислении размера ключа индекса компонент Компонент Database EngineDatabase Engine эти столбцы не рассматривает.These columns are not considered by the Компонент Database EngineDatabase Engine when calculating the index key size . Дополнительные сведения см. в статьях Создание индексов с включенными столбцами и Руководство по архитектуре и разработке индексов SQL Server.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Примечание

Если ключевые столбцы секционирования не представлены в неуникальном кластеризованном индексе при секционировании таблиц, то они добавляются в индекс службами Компонент Database EngineDatabase Engine.When tables are partitioned, if the partitioning key columns are not already present in a non-unique clustered index, they are added to the index by the Компонент Database EngineDatabase Engine. Объединенный размер индексированных столбцов (без учета включенных столбцов) и любых добавленных столбцов секционирования в неуникальном кластеризованном индексе не может превышать 1800 байт.The combined size of the indexed columns (not counting included columns), plus any added partitioning columns cannot exceed 1800 bytes in a non-unique clustered index.

Вычисляемые столбцыComputed Columns

Индексы могут создаваться в вычисляемых столбцах.Indexes can be created on computed columns. Кроме того, вычисляемые столбцы могут иметь свойство PERSISTED.In addition, computed columns can have the property PERSISTED. Это значит, что компонент Компонент Database EngineDatabase Engine хранит вычисляемые значения в таблице и обновляет их при изменении любого столбца, от которого зависит вычисляемый столбец.This means that the Компонент Database EngineDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. Компонент Компонент Database EngineDatabase Engine использует эти сохраненные значения при создании индекса столбца и при появлении ссылки на этот столбец в запросе.The Компонент Database EngineDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

Для индексации вычисляемого столбца этот вычисляемый столбец должен быть детерминированным и точным.To index a computed column, the computed column must deterministic and precise. Если используется свойство PERSISTED, список типов индексируемых вычисляемых столбцов расширяется и включает следующее.However, using the PERSISTED property expands the type of indexable computed columns to include:

  • Вычисляемые столбцы, основанные на выражениях языка Transact-SQLTransact-SQL, функциях CLR и методах определяемых пользователем типов данных CLR, помеченных пользователем как детерминированные.Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • Вычисляемые столбцы, основанные на выражениях, которые определены компонентом Компонент Database EngineDatabase Engine как детерминированные, но не являются точными.Computed columns based on expressions that are deterministic as defined by the Компонент Database EngineDatabase Engine but imprecise.

Для материализованных вычисляемых столбцов необходимо, чтобы следующие параметры SET имели значения, указанные выше в разделе Обязательные параметры SET для отфильтрованных индексов.Persisted computed columns require the following SET options to be set as shown in the previous section Required SET Options for Filtered Indexes.

Ограничения UNIQUE или PRIMARY KEY могут содержать вычисляемый столбец, если он удовлетворяет всем условиям для индексирования.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. Вычисляемый столбец должен быть детерминированным и точным или детерминированным и сохраняемым.Specifically, the computed column must be deterministic and precise or deterministic and persisted. Дополнительные сведения о детерминизме см. в статье Детерминированные и недетерминированные функции.For more information about determinism, see Deterministic and Nondeterministic Functions.

Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) и xml, могут индексироваться как ключевой или неключевой столбец, если тип данных вычисляемого столбца допускается в качестве ключевого или неключевого столбца индекса.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed either as a key or included non-key column as long as the computed column data type is allowable as an index key column or non-key column. Например, нельзя создать первичный XML-индекс для вычисляемого столбца типа xml.For example, you cannot create a primary XML index on a computed xml column. Если размер ключа индекса превышает 900 байт, выдается предупреждение.If the index key size exceeds 900 bytes, a warning message is displayed.

Создание индекса на вычисляемом столбце может привести к ошибке в операциях вставки или обновления, которые до этого успешно выполнялись.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. Такое неуспешное завершение возможно, если вычисляемый столбец вызывает арифметическую ошибку.Such a failure may take place when the computed column results in arithmetic error. Например, вычисляемый столбец c в следующей таблице приводит к арифметической ошибке, но инструкция INSERT работает нормально.For example, in the following table, although computed column c results in an arithmetic error, the INSERT statement works.

CREATE TABLE t1 (a int, b int, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

Если же после создания таблицы создать индекс на вычисляемом столбце c, та же инструкция INSERT будет заканчиваться ошибкой.If, instead, after creating the table, you create an index on computed column c, the same INSERT statement will now fail.

CREATE TABLE t1 (a int, b int, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

Дополнительные сведения см. в разделе Индексы вычисляемых столбцов.For more information, see Indexes on Computed Columns.

Включенные столбцы в индексахIncluded Columns in Indexes

Неключевые столбцы, называемые "включенными столбцами", могут добавляться на конечный уровень некластеризованного индекса для повышения производительности запроса благодаря тому, что индекс включает все необходимые данные для запроса.Non-key columns, called included columns, can be added to the leaf level of a nonclustered index to improve query performance by covering the query. Т. е. все столбцы, указанные в запросе, включаются в индекс в качестве ключевых или неключевых столбцов.That is, all columns referenced in the query are included in the index as either key or non-key columns. Таким образом, оптимизатор запросов может найти все необходимые данные путем просмотра индекса, не обращаясь к данным таблицы или кластеризованного индекса.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. Дополнительные сведения см. в статьях Создание индексов с включенными столбцами и Руководство по архитектуре и разработке индексов SQL Server.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Установка параметров индексаSpecifying Index Options

На сервере SQL Server 2005 (9.x)SQL Server 2005 (9.x) представлены новые параметры индексов и изменен способ установки параметров.SQL Server 2005 (9.x)SQL Server 2005 (9.x) introduced new index options and also modifies the way in which options are specified. Для обратной совместимости синтаксиса аргумент WITH option_name эквивалентен аргументу WITH ( <option_name> = ON ) .In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). Устанавливая параметры индекса, необходимо соблюдать следующие правила.When you set index options, the following rules apply:

  • Новые параметры индекса могут быть заданы только с помощью аргумента WITH ( option_name = ON | OFF).New index options can only be specified by using WITH (option_name = ON | OFF).
  • Нельзя задавать параметры с помощью нового синтаксиса и совместимого старого в одной и той же инструкции.Options cannot be specified by using both the backward compatible and new syntax in the same statement. Например, инструкция с WITH (DROP_EXISTING, ONLINE = ON) вызовет ошибку.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • При создании XML-индекса параметры должны указываться с помощью аргумента WITH ( option_name= ON | OFF).When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

Предложение DROP_EXISTINGDROP_EXISTING Clause

Предложение DROP_EXISTING может использоваться для перестроения индекса, добавления или удаления столбцов, изменения параметров, изменения порядка сортировки столбцов, а также изменения схемы секционирования или файловой группы.You can use the DROP_EXISTING clause to rebuild the index, add or drop columns, modify options, modify column sort order, or change the partition scheme or filegroup.

Если индекс принудительно налагает ограничение PRIMARY KEY или UNIQUE и его определение никак не меняется, он удаляется и создается вновь с сохранением существующих ограничений.If the index enforces a PRIMARY KEY or UNIQUE constraint and the index definition is not altered in any way, the index is dropped and re-created preserving the existing constraint. Но если изменить определение индекса, инструкция вызовет ошибку.However, if the index definition is altered the statement fails. Чтобы изменить ограничение PRIMARY KEY или UNIQUE, удалите ограничение и добавьте ограничение вместе с новым определением.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

Предложение DROP_EXISTING повышает производительность, если повторно создается кластеризованный индекс с тем же самым или другим набором ключей на таблице, имеющей также некластеризованные индексы.DROP_EXISTING enhances performance when you re-create a clustered index, with either the same or different set of keys, on a table that also has nonclustered indexes. Предложение DROP_EXISTING заменяет удаление старого кластеризованного индекса с помощью инструкции DROP INDEX и последующее создание нового кластеризованного индекса с помощью инструкции CREATE INDEX.DROP_EXISTING replaces the execution of a DROP INDEX statement on the old clustered index followed by the execution of a CREATE INDEX statement for the new clustered index. Некластеризованные индексы перестраиваются один раз, а после этого только в случае, если меняется определение индекса.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. Предложение DROP_EXISTING не перестраивает некластеризованные индексы, если определение индекса содержит то же самое имя индекса, ключевые столбцы, столбцы секционирования, атрибут уникальности и порядок сортировки, что и исходный индекс.The DROP_EXISTING clause does not rebuild the nonclustered indexes when the index definition has the same index name, key and partition columns, uniqueness attribute, and sort order as the original index.

Независимо от того, перестраиваются ли некластеризованные индексы, они всегда остаются в своих исходных файловых группах или схемах секционирования и используют исходные функции секционирования.Whether the nonclustered indexes are rebuilt or not, they always remain in their original filegroups or partition schemes and use the original partition functions. Если кластеризованный индекс перестраивается в другой файловой группе или схеме секционирования, некластеризованные индексы не перемещаются вместе с кластеризованным индексом.If a clustered index is rebuilt to a different filegroup or partition scheme, the nonclustered indexes are not moved to coincide with the new location of the clustered index. Поэтому даже если некластеризованные индексы раньше были выровнены по кластеризованному, теперь это может быть не так.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. Дополнительные сведения о выравнивании секционированных индексов см. в разделе Секционированные таблицы и индексы.For more information about partitioned index alignment, see Partitioned Tables and Indexes.

Предложение DROP_EXISTING не сортирует данные заново, если те же ключевые столбцы индекса используются в том же порядке с тем же порядком сортировки по возрастанию или убыванию, за исключением случаев, когда инструкция индекса задает некластеризованный индекс и параметр ONLINE равен OFF.The DROP_EXISTING clause will not sort the data again if the same index key columns are used in the same order and with the same ascending or descending order, unless the index statement specifies a nonclustered index and the ONLINE option is set to OFF. Если кластеризованный индекс отключен, операция CREATE INDEX WITH DROP_EXISTING должна выполняться с параметром ONLINE в значении OFF.If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. Если некластеризованный индекс отключен и не связан с отключенным кластеризованным индексом, операция CREATE INDEX WITH DROP_EXISTING может выполняться с параметром ONLINE в значении OFF или ON.If a nonclustered index is disabled and is not associated with a disabled clustered index, the CREATE INDEX WITH DROP_EXISTING operation can be performed with ONLINE set to OFF or ON.

Примечание

Если удаляются или перестраиваются индексы со 128 или более экстентами, компонент Компонент Database EngineDatabase Engine откладывает фактическое освобождение страниц и связанных с ними блокировок до фиксации транзакции.When indexes with 128 extents or more are dropped or rebuilt, the Компонент Database EngineDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Параметр ONLINEONLINE Option

Следующие правила применяются к операциям с индексами в режиме в сети.The following guidelines apply for performing index operations online:

  • Во время выполнения операций с индексами в сети базовая таблица не может изменяться, усекаться или удаляться.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • Для операций с индексами требуется дополнительное временное место на диске.Additional temporary disk space is required during the index operation.
  • Обработка индексов в сети может выполняться для секционированных индексов, содержащих материализованные вычисляемые столбцы или включенные столбцы.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

Дополнительные сведения см. в статье Выполнение операции с индексами в сети.For more information, see Perform Index Operations Online.

Возобновляемые операции с индексамиResumable index operations

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database (общедоступная предварительная версия)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database (public preview)

Следующие правила применяются к операциям с возобновляемыми индексами.The following guidelines apply for resumable index operations:

  • Операция создания индексов в подключенном режиме указывается как возобновляемая с помощью параметра RESUMABLE = ON.Online index create is specified as resumable using the RESUMABLE = ON option.
  • Параметр RESUMABLE не сохраняется в метаданных для указанного индекса и применяется только на время выполнения текущей инструкции DDL.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Таким образом, для включения возобновляемости предложение RESUMABLE = ON должно быть указано явным образом.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • Параметр MAX_DURATION поддерживается только в том случае, если RESUMABLE = ON.MAX_DURATION option is only supported for RESUMABLE = ON option.
  • Параметр MAX_DURATION при включенном параметре RESUMABLE задает интервал времени для создания индекса.MAX_DURATION for RESUMABLE option specifies the time interval for an index being built. По истечении этого времени операция создания индекса приостанавливается или завершается.Once this time is used the index build is either paused or it completes its execution. Пользователь решает, когда можно будет возобновить создание приостановленного индекса.User decides when a build for a paused index can be resumed. Значение time в минутах для MAX_DURATION должно быть больше 0 минут и меньше или равно 1 неделе (7 * 24 * 60 = 10 080 минут).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Длинная пауза в операции с индексами может повлиять на производительность DML в конкретной таблице, а также на емкость диска базы данных, поскольку они оба индексируют исходное и только что созданное требуемое место на диске и должны быть обновлены во время операций DML.Having a long pause for an index operation may impact the DML performance on a specific table as well as the database disk capacity since both indexes the original one and the newly created one require disk space and need to be updated during DML operations. Если параметр MAX_DURATION пропускается, операция с индексами будет продолжаться вплоть до ее завершения или до момента возникновения сбоя.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
  • Чтобы немедленно приостановить операцию создания индекса, можно остановить текущую команду сочетанием клавиш CTRL+C либо выполнить команду ALTER INDEX PAUSE или команду KILL <session_id>.To pause immediately the index operation, you can stop (Ctrl-C) the ongoing command, execute the ALTER INDEX PAUSE command, or execute the KILL <session_id> command. Приостановленную команду можно возобновить командой ALTER INDEX.Once the command is paused, it can be resumed using ALTER INDEX command.
  • Повторное выполнение исходной инструкции CREATE INDEX для возобновляемого индекса автоматически возобновляет приостановленную операцию создания индекса.Re-executing the original CREATE INDEX statement for resumable index, automatically resumes a paused index create operation.
  • Параметр SORT_IN_TEMPDB = ON не поддерживается для возобновляемых индексов.The SORT_IN_TEMPDB = ON option is not supported for resumable index.
  • Команду DDL с параметром RESUMABLE = ON невозможно выполнить внутри явной транзакции (она не может быть частью блока BEGIN TRAN… COMMIT).The DDL command with RESUMABLE = ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN ... COMMIT block).
  • Чтобы прервать или возобновить создание либо перестроение индекса, используйте синтаксис T-SQL ALTER INDEX.To resume/abort an index create/rebuild, use the ALTER INDEX T-SQL syntax

Примечание

Команда DDL выполняется вплоть до завершения, приостанавливается или завершается ошибкой.The DDL command runs until it completes, pauses or fails. Если команда приостанавливается, возникнет ошибка, указывающая на приостановку операции и невозможность завершения создания индекса.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Дополнительные сведения о текущем состоянии индекса можно получить из sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Как и в случае выше, при сбое также будет выведено сообщение об ошибке.As before in case of a failure an error will be issued as well.

Чтобы указать, что создание индекса выполняется как возобновляемая операция, и проверить текущее состояние выполнения, см. статью index_resumable_operations (Transact-SQL).To indicate that an index create is executed as resumable operation and to check its current execution state, see sys.index_resumable_operations.

РесурсыResources

Для операции создания возобновляемого индекса в сети необходимы следующие ресурсы.The following resources are required for resumable online index create operation:

  • Дополнительное место для хранения создаваемого индекса, включая время, когда индекс будет приостановлен.Additional space required to keep the index being built, including the time when index is being paused
  • Дополнительная пропускная способность для журналов на период сортировки.Additional log throughput during the sorting phase. Общее потребление пространства для журналов у возобновляемого индекса меньше по сравнению с обычной операцией создания индекса в сети. Кроме того, эта операция поддерживает усечение журнала во время выполнения.The overall log space usage for resumable index is less compared to regular online index create and allows log truncation during this operation.
  • Состояние DDL, запрещающее изменения DDL.A DDL state preventing any DDL modification
  • Очистка фантомных записей блокируется для встроенных индексов на весь период операции, в том числе пока она приостановлена.Ghost cleanup is blocked on the in-build index for the duration of the operation both while paused and while the operation is running.

Существующие функциональные ограниченияCurrent functional limitations

Для возобновляемых операций создания индексов отключены следующие функциональные возможности.The following functionality is disabled for resumable index create operations:

  • После приостановки возобновляемой операции создания индекса в сети нельзя изменить исходное значение MAXDOP.After a resumable online index create operation is paused, the initial value of MAXDOP cannot be changed

  • Создание индекса, который содержит следующее:Create an index that contains:

    • вычисляемые столбцы или столбцы TIMESTAMP в качестве ключевых столбцов;Computed or TIMESTAMP column(s) as key columns
    • столбец LOB в качестве включенного столбца для создания возобновляемого индекса.LOB column as included column for resumable index create
    • Фильтруемый индексFiltered index

Параметры блокировок строк и страницRow and Page Locks Options

Когда присвоены значения ALLOW_ROW_LOCKS = ON и ALLOW_PAGE_LOCK = ON, при доступе к индексу допустимы блокировки на уровне строк, страниц и таблиц.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing the index. Компонент Компонент Database EngineDatabase Engine выбирает соответствующую блокировку и может повышать уровень с блокировки строки или страницы до блокировки таблицы.The Компонент Database EngineDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Если присвоены значения ALLOW_ROW_LOCKS = OFF и ALLOW_PAGE_LOCK = OFF, при доступе к индексу допустима только блокировка на уровне таблиц.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when accessing the index.

Последовательные ключиSequential Keys

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview)

Состязание операций вставки на последнюю страницу — это распространенная проблема, влияющая на производительность. Она возникает, когда множество параллельных запросов пытается вставить строки в индекс с последовательным ключом.Last-page insert contention is a common performance problem that occurs when a large number of concurrent threads attempt to insert rows into an index with a sequential key. Индекс считается последовательным, если ведущий ключевой столбец содержит значения, которые всегда увеличиваются (или уменьшаются), например столбец идентификаторов или даты, в котором по умолчанию используется текущее значение даты и времени.An index is considered sequential when the leading key column contains values that are always increasing (or decreasing), such as an identity column or a date that defaults to the current date/time. Так как ключи вставляются последовательно, все новые строки будут вставляться в конце структуры индекса, т. е. на одной и той же странице.Because the keys being inserted are sequential, all new rows will be inserted at the end of the index structure - in other words, on the same page. Это приводит к состязанию за страницы в памяти. В этой ситуации несколько потоков ожидают PAGELATCH_EX для указанной страницы.This leads to contention for the page in memory which can be observed as several threads waiting on PAGELATCH_EX for the page in question.

Включение параметра OPTIMIZE_FOR_SEQUENTIAL_KEY для индекса оптимизирует ядро СУБД, позволяя повысить пропускную способность для операций вставки в индекс с высокой степенью параллелизма.Turning on the OPTIMIZE_FOR_SEQUENTIAL_KEY index option enables an optimization within the database engine that helps improve throughput for high-concurrency inserts into the index. Этот параметр предназначен для индексов с последовательным ключом, из-за которого возникает состояние состязания при операциях вставки на последнюю страницу. Но его также можно применять для индексов с критическими участками в других областях структуры индекса в виде сбалансированного дерева.It is intended for indexes that have a sequential key and thus are prone to last-page insert contention, but it may also help with indexes that have hot spots in other areas of the B-Tree index structure.

Просмотр сведений об индексахViewing Index Information

Получить данные об индексах можно с помощью представлений каталогов, системных функций и системных хранимых процедур.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

Сжатие данныхData Compression

Сжатие данных описывается в разделе Сжатие данных.Data compression is described in the topic Data Compression. Необходимо учесть следующие основные моменты.The following are key points to consider:

  • С помощью сжатия можно хранить больше строк в странице, максимальный размер строки при этом не изменяется.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • Неконечные страницы индекса не сжаты на уровне страниц, но могут быть сжаты на уровне строк.Non-leaf pages of an index are not page compressed but can be row compressed.
  • У каждого некластеризованного индекса индивидуальные настройки сжатия, которые не наследуются от базовой таблицы.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • При создании кластеризованного индекса в куче кластеризованный индекс наследует состояние сжатия кучи, если не указано другое состояние сжатия.When a clustered index is created on a heap, the clustered index inherits the compression state of the heap unless an alternative compression state is specified.

На секционированные индексы налагаются следующие ограничения.The following restrictions apply to partitioned indexes:

  • Если у таблицы есть невыровненные индексы, изменить настройку сжатия отдельной секции невозможно.You cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • Инструкция ALTER INDEX <index> ... REBUILD PARTITION ... производит перестроение указанной секции индекса.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • Инструкция ALTER INDEX <index> ... REBUILD WITH ... производит перестроение всех секций индекса.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

Оценить состояние сжатия таблицы, индекса или секции можно с помощью хранимой процедуры sp_estimate_data_compression_savings.To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

РазрешенияPermissions

Необходимо разрешение 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.

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

В Хранилище данных SQLSQL Data Warehouse и Параллельное хранилище данныхParallel Data Warehouse невозможно создать:In Хранилище данных SQLSQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse, you cannot create:

  • кластеризованный или некластеризованный индекс rowstore в таблице хранилища данных, если индекс columnstore уже существует.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. Это поведение отличается от SMP SQL ServerSQL Server, разрешающее сосуществование индексов rowstore и columnstore в одной таблице.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • невозможно создать индекс для представления.You cannot create an index on a view.

МетаданныеMetadata

Чтобы просмотреть сведения о существующих индексах, можно выполнить запрос к представлению каталога sys.indexes.To view information on existing indexes, you can query the sys.indexes catalog view.

Заметки о версииVersion Notes

База данных SQLSQL Database не поддерживает параметры файловой группы и файлового потока.does not support filegroup and filestream options.

Примеры: все версииExamples: All versions. Используется база данных AdventureWorksUses the AdventureWorks database

A.A. Создание простого некластеризованного индекса rowstoreCreate a simple nonclustered rowstore index

В следующем примере создается некластеризованный индекс для столбца VendorID таблицы Purchasing.ProductVendor.The following examples create a nonclustered index on the VendorID column of the Purchasing.ProductVendor table.

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);

Б.B. Создание простого некластеризованного составного индекса rowstoreCreate a simple nonclustered rowstore composite index

В следующем примере создается некластеризованный составной индекс в столбцах SalesQuota и SalesYTD таблицы Sales.SalesPerson.The following example creates a nonclustered composite index on the SalesQuota and SalesYTD columns of the Sales.SalesPerson table.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

В.C. Создание индекса в таблице из другой базы данныхCreate an index on a table in another database

В следующем примере создается кластеризованный индекс для столбца VendorID таблицы ProductVendor в базе данных Purchasing.The following example creates a clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);

Г.D. Добавление столбца в индексAdd a column to an index

В следующем примере создается индекс IX_FF с двумя столбцами из таблицы dbo.FactFinance.The following example creates index IX_FF with two columns from the dbo.FactFinance table. Следующая инструкция перестраивает индекс с еще одним столбцом и сохраняет существующее имя.The next statement rebuilds the index with one more column and keeps the existing name.

CREATE INDEX IX_FF ON dbo.FactFinance ( FinanceKey ASC, DateKey ASC );

--Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance ( FinanceKey, DateKey, OrganizationKey DESC)
WITH ( DROP_EXISTING = ON );

Примеры: SQL Server, база данных SQL AzureExamples: SQL Server, Azure SQL Database

Д.E. Создание уникального некластеризованного индексаCreate a unique nonclustered index

В следующем примере создается уникальный некластеризованный индекс в столбце Name таблицы Production.UnitMeasure в базе данных AdventureWorks2012AdventureWorks2012.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Индекс требует уникальности данных, вставляемых в столбец Name.The index will enforce uniqueness on the data inserted into the Name column.

CREATE UNIQUE INDEX AK_UnitMeasure_Name
  ON Production.UnitMeasure(Name);

Следующий запрос проверяет ограничение уникальности данных при попытке вставить строку с тем же значением, что и в уже существующей строке.The following query tests the uniqueness constraint by attempting to insert a row with the same value as that in an existing row.

--Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
  VALUES ('OC', 'Ounces', GetDate());

В результате выдается сообщение об ошибке:The resulting error message is:

Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

Е.F. Использование параметра IGNORE_DUP_KEYUse the IGNORE_DUP_KEY option

В следующем примере демонстрируется влияние параметра IGNORE_DUP_KEY со значениями ON и OFF на операцию вставки нескольких строк во временную таблицу.The following example demonstrates the effect of the IGNORE_DUP_KEY option by inserting multiple rows into a temporary table first with the option set to ON and again with the option set to OFF. В таблицу #Test вставляется одна строка, которая намеренно приведет к появлению повторяющихся значений при выполнении второй многострочной операции вставки INSERT.A single row is inserted into the #Test table that will intentionally cause a duplicate value when the second multiple-row INSERT statement is executed. Счетчик строк таблицы возвращает количество вставленных строк.A count of rows in the table returns the number of rows inserted.

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = ON);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO

Ниже приведены результаты второй инструкции INSERT.Here are the results of the second INSERT statement.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows
--------------
38

Обратите внимание, что строки из таблицы Production.UnitMeasure, не нарушающие ограничение уникальности, были успешно вставлены.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. Было выдано предупреждение, и строка с повторяющимся значением не была вставлена, но отката всей транзакции не произошло.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

Те же инструкции выполняются вновь, но теперь с аргументом IGNORE_DUP_KEY, равным OFF.The same statements are executed again, but with IGNORE_DUP_KEY set to OFF.

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = OFF);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO

Ниже приведены результаты второй инструкции INSERT.Here are the results of the second INSERT statement.

Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.

Number of rows
--------------
1

Обратите внимание, что ни одна из строк таблицы Production.UnitMeasure не была вставлена, хотя ограничение индекса UNIQUE было нарушено только одной строкой.Notice that none of the rows from the Production.UnitMeasure table were inserted into the table even though only one row in the table violated the UNIQUE index constraint.

Ж.G. Использование предложения DROP_EXISTING для удаления и повторного создания индексаUsing DROP_EXISTING to drop and re-create an index

В следующем примере удаляется и создается повторно существующий индекс для столбца ProductID таблицы Production.WorkOrder в базе данных AdventureWorks2012AdventureWorks2012 с использованием параметра DROP_EXISTING.The following example drops and re-creates an existing index on the ProductID column of the Production.WorkOrder table in the AdventureWorks2012AdventureWorks2012 database by using the DROP_EXISTING option. Указываются также параметры FILLFACTOR и PAD_INDEX.The options FILLFACTOR and PAD_INDEX are also set.

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
  ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
      PAD_INDEX = ON,
      DROP_EXISTING = ON);
GO

З.H. Создание индекса для представленияCreate an index on a view

В следующем примере создаются представление и индекс этого представления.The following example creates a view and an index on that view. Включено два запроса, использующих созданное индексированное представление.Two queries are included that use the indexed view.

-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
  QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
DROP VIEW Sales.vOrders ;
GO
CREATE VIEW Sales.vOrders
WITH SCHEMABINDING
AS
  SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,
    OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
  WHERE od.SalesOrderID = o.SalesOrderID
  GROUP BY OrderDate, ProductID;
GO
-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
  ON Sales.vOrders (OrderDate, ProductID);
GO
-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev,
  OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID
    AND ProductID BETWEEN 700 and 800
    AND OrderDate >= CONVERT(datetime,'05/01/2002',101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO
-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID
    AND DATEPART(mm,OrderDate)= 3
  AND DATEPART(yy,OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

И.I. Создание индекса с включенными (неключевыми) столбцамиCreate an index with included (non-key) columns

В следующем примере создается некластеризованный индекс с одним ключевым столбцом (PostalCode) и четырьмя неключевыми столбцами (AddressLine1, AddressLine2, City, StateProvinceID).The following example creates a nonclustered index with one key column (PostalCode) and four non-key columns (AddressLine1, AddressLine2, City, StateProvinceID). Далее следует запрос, все данные для которого есть в индексе.A query that is covered by the index follows. Прежде чем выводить индекс, выбранный оптимизатором запросов, выберите в меню Запрос среды SQL Server Management StudioSQL Server Management Studio команду Показать действительный план выполнения.To display the index that is selected by the query optimizer, on the Query menu in SQL Server Management StudioSQL Server Management Studio, select Display Actual Execution Plan before executing the query.

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
  ON Person.Address (PostalCode)
  INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

К.J. Создание секционированного индексаCreate a partitioned index

В следующем примере создается некластеризованный секционированный индекс для TransactionsPS1, существующей схемы секционирования в базе данных AdventureWorks2012AdventureWorks2012.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. В данном примере подразумевается, что образец секционированного индекса установлен.This example assumes the partitioned index sample has been installed.

Область применения: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 по SQL Server 2017SQL Server 2017) и База данных SQL AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and База данных SQL AzureAzure SQL Database

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
  ON Production.TransactionHistory (ReferenceOrderID)
  ON TransactionsPS1 (TransactionDate);
GO

Л.K. Создание отфильтрованного индексаCreating a filtered index

В следующем примере создается фильтрованный индекс для таблицы Production.BillOfMaterials в базе данных AdventureWorks2012AdventureWorks2012.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. Предикат фильтра может включать столбцы, не являющиеся ключевыми в отфильтрованном индексе.The filter predicate can include columns that are not key columns in the filtered index. Предикат в примере выбирает только те строки, где EndDate не равно NULL.The predicate in this example selects only the rows where EndDate is non-NULL.

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
  ON Production.BillOfMaterials (ComponentID, StartDate)
  WHERE EndDate IS NOT NULL;

М.L. Создание сжатого индексаCreate a compressed index

Следующий пример демонстрирует создание индекса для несекционированной таблицы с помощью сжатия строк.The following example creates an index on a nonpartitioned table by using row compression.

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
WITH ( DATA_COMPRESSION = ROW );
GO

Следующий пример демонстрирует создание индекса для секционированной таблицы с помощью сжатия строк во всех секциях индекса.The following example creates an index on a partitioned table by using row compression on all partitions of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH ( DATA_COMPRESSION = ROW );
GO

Следующий пример демонстрирует создание индекса для секционированной таблицы с помощью сжатия страниц для секции 1 индекса и сжатия строк для секций индекса со 2 по 4.The following example creates an index on a partitioned table by using page compression on partition 1 of the index and row compression on partitions 2 through 4 of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1),
  DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4 ) ) ;
GO

Н.M. Создание, возобновление, приостановка и прерывание операций с возобновляемыми индексамиCreate, resume, pause, and abort resumable index operations

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database (общедоступная предварительная версия)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database (public preview)

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 on test_table (col1) WITH (ONLINE=ON, MAXDOP=1, RESUMABLE=ON)

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 on test_table (col2) WITH (ONLINE=ON, RESUMABLE=ON, MAX_DURATION=240)

-- Pause a running resumable online index creation
ALTER INDEX test_idx1 on test_table PAUSE
ALTER INDEX test_idx2 on test_table PAUSE

-- Resume a paused online index creation
ALTER INDEX test_idx1 on test_table RESUME
ALTER INDEX test_idx2 on test_table RESUME

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 on test_table ABORT
ALTER INDEX test_idx2 on test_table ABORT

Примеры: Хранилище данных SQL AzureAzure SQL Data Warehouse и Параллельное хранилище данныхParallel Data WarehouseExamples: Хранилище данных SQL AzureAzure SQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse

О.N. Базовый синтаксисBasic syntax

Создание, возобновление, приостановка и прерывание операций с возобновляемыми индексамиCreate, resume, pause, and abort resumable index operations

Область применения: SQL ServerSQL Server (начиная с Предварительная версия SQL Server 2019SQL Server 2019 preview) и База данных SQL AzureAzure SQL Database (общедоступная предварительная версия)Applies to: SQL ServerSQL Server (Starting with Предварительная версия SQL Server 2019SQL Server 2019 preview) and База данных SQL AzureAzure SQL Database (public preview)

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx on test_table WITH (ONLINE=ON, MAXDOP=1, RESUMABLE=ON)

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx on test_table WITH (ONLINE=ON, RESUMABLE=ON, MAX_DURATION=240)

-- Pause a running resumable online index creation
ALTER INDEX test_idx on test_table PAUSE

-- Resume a paused online index creation
ALTER INDEX test_idx on test_table RESUME

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx on test_table ABORT

П.O. Создание некластеризованного индекса для таблицы в текущей базе данныхCreate a nonclustered index on a table in the current database

В приведенном ниже примере создается некластеризованный индекс по столбцу VendorID таблицы ProductVendor.The following example creates a nonclustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

Т.P. Создание индекса для таблицы из другой базы данныхCreate a clustered index on a table in another database

В приведенном ниже примере создается некластеризованный индекс по столбцу VendorID таблицы ProductVendor в базе данных Purchasing.The following example creates a nonclustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
  ON Purchasing..ProductVendor (VendorID);

См. также:See Also

Руководство по архитектуре и разработке индексов SQL Server SQL Server Index Architecture and Design Guide
Индексы и инструкция ALTER TABLE Indexes and ALTER TABLE
ALTER INDEX ALTER INDEX
CREATE PARTITION FUNCTION CREATE PARTITION FUNCTION
CREATE PARTITION SCHEME CREATE PARTITION SCHEME
CREATE SPATIAL INDEX CREATE SPATIAL INDEX
CREATE STATISTICS CREATE STATISTICS
CREATE TABLE CREATE TABLE
CREATE XML INDEX CREATE XML INDEX
Data Types Data Types
DBCC SHOW_STATISTICS DBCC SHOW_STATISTICS
DROP INDEX DROP INDEX
XML-индексы (SQL Server) XML Indexes (SQL Server)
sys.indexes sys.indexes
sys.index_columns sys.index_columns
sys.xml_indexes sys.xml_indexes
EVENTDATAEVENTDATA