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

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○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. クラスター化または非クラスター化 B ツリー インデックスであるため、行ストア インデックスとも呼ばれます。Also called a rowstore index because it is either a clustered or nonclustered B-tree index. 行ストア インデックスは、テーブルにデータが設定される前に作成することができます。You can create a rowstore index before there is data in the table. クエリが特定の列から選択するか、特定の順序での値の並べ替えを要求する場合は特に、クエリのパフォーマンスを向上させるために行ストア インデックスを使用します。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.

注意

SQL データ ウェアハウスSQL Data Warehouse および Parallel Data WarehouseParallel Data Warehouse は、現在一意制約をサポートしていません。and Parallel Data WarehouseParallel Data Warehouse currently do not support Unique constraints. 一意制約を参照している例は、SQL ServerSQL ServerSQL DatabaseSQL Database にのみ適用されます。Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and SQL DatabaseSQL 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) および SQL DatabaseSQL Database 以降では、列ストア インデックスに非クラスター化インデックスを使用して、データ ウェアハウスのクエリのパフォーマンスを向上させます。Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and SQL DatabaseSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. 詳しくは、「列ストア インデックス - データ ウェアハウス」をご覧ください。For more information, see Columnstore Indexes - Data Warehouse.

その他の種類のインデックスについては、以下を参照してください。For additional types of indexes, see:

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

SQL Server と Azure SQL Database の構文Syntax 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
}

Azure SQL Data Warehouse と Parallel Data Warehouse の構文Syntax 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. 一意のインデックスとは、どの 2 つの行にも同じインデックス キー値が設定されていないインデックスです。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 Engineでは、IGNORE_DUP_KEY が ON に設定されているかどうかに関係なく、重複する値が既に含まれている列に対して一意のインデックスを作成できません。The データベース エンジンDatabase 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 Engineではエラー メッセージが表示されます。If this is tried, the データベース エンジンDatabase Engine displays an error message. 1 行または複数行に対して一意のインデックスを作成するには、先に重複する値を削除しておく必要があります。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. 1 つのテーブルまたはビューに、同時に複数のクラスター化インデックスを定義することはできません。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.

インデックスの作成方法に関係なく、PRIMARY KEY および UNIQUE 制約で暗黙的に作成する場合も、CREATE INDEX で明示的に作成する場合も、各テーブルには 999 個までの非クラスター化インデックスを作成できます。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
インデックスの基準となる 1 列または複数列を指定します。Is the column or columns on which the index is based. 指定した列を組み合わせた値で複合インデックスを作成するには、2 つ以上の列名を指定します。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.

1 つの複合インデックス キーには、最大 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 バイトまたは非クラスター化インデックスの 1,700 です。The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. SQL DatabaseSQL Database および SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以前のバージョンの場合、制限は列数が 16、サイズが 900 バイトになります。The limits are 16 columns and 900 bytes for versions before SQL DatabaseSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x).

ラージ オブジェクト (LOB) データ型の列 ntexttextvarchar(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. また、ビュー定義に含めることはできませんntexttext、または 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.

INCLUDE ( 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.

textntext、および 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. 派生した計算列 imagentexttextvarchar(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.

フィルター述語には単純な比較ロジックを使用するので、計算列、UDT 列、空間データ型列、または 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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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 Engineでは、単一のパーティション内だけでキー値の一意性を確認できます。This restriction allows the データベース エンジンDatabase Engine to verify uniqueness of key values within a single partition only.

注意

一意でないクラスター化インデックスをパーティション分割するとき、データベース エンジンDatabase Engineでは既定により、まだ指定されていない場合、パーティション分割列がクラスター化インデックス キーのリストに追加されます。When you partition a non-unique, clustered index, the データベース エンジンDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. 一意でない非クラスター化インデックスをパーティション分割するとき、データベース エンジンDatabase Engineでは、まだ指定されていない場合、パーティション分割列がインデックスの非キー列 (付加列) として追加されます。When partitioning a non-unique, nonclustered index, the データベース エンジンDatabase 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 Server (SQL 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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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. default は、既定ファイル グループの識別子なので、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. これは、"default" でデータベースの既定のファイルグループに対してテーブルを検索する CREATE TABLE とは異なります。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 Server (SQL 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 ステートメントを使用してファイルが 1 つ定義されている必要があります。それ以外の場合は、エラーが発生します。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 列が含まれていないときは、CREATE INDEX ステートメントに FILESTREAM_ON NULL を指定できます。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.

Azure SQL データベースAzure SQL Database では、database_name が現在のデータベースの場合、または database_nametempdb で、object_name が # で始まる場合に、3 つの要素で構成された名前形式 database_name.[schema_name].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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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
中間レベルのページはほぼ全容量が使用されます。ただし、中間ページにあるキーのセットを考慮して、インデックスに割り当てることのできる、少なくとも 1 行の最大サイズが収まる分の領域は残されます。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 で指定されるパーセンテージが使用されるので、PAD_INDEX オプションは、FILLFACTOR が指定されている場合にのみ有効です。The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. FILLFACTOR で指定されるパーセンテージで 1 行分のデータを格納できない場合、データベース エンジンDatabase Engine では内部的に、最小サイズを格納できるパーセンテージにオーバーライドします。If the percentage specified for FILLFACTOR is not large enough to allow for one row, the データベース エンジンDatabase Engine internally overrides the percentage to allow for the minimum. 中間インデックス ページの行数は、fillfactor の値がどれだけ小さくなっても 2 未満にはなりません。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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database

インデックスの作成時または再構築時に、データベース エンジンDatabase Engine が各インデックス ページのリーフ レベルをどの程度まで埋めるかを、パーセント値で指定します。Specifies a percentage that indicates how full the データベース エンジンDatabase 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 Engine では全容量を使用するリーフ ページでインデックスが作成されます。If fillfactor is 100, the データベース エンジンDatabase Engine creates indexes with leaf pages filled to capacity.

FILLFACTOR 設定は、インデックスが作成または再構築されるときのみ適用されます。The FILLFACTOR setting applies only when the index is created or rebuilt. データベース エンジンDatabase Engine では、ページ内で指定されたパーセント分の空き領域は動的に保持されません。The データベース エンジンDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. FILL FACTOR 設定を表示するには、sys.indexes カタログ ビューを使用します。To view the fill factor setting, use the sys.indexes catalog view.

重要

データベース エンジンDatabase Engineでは、クラスター化インデックスの作成時にデータが再分配されるため、100 未満の FILLFACTOR 値を使ってクラスター化インデックスを作成すると、データ用のストレージ領域のサイズに影響が生じます。Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the データベース エンジンDatabase Engine redistributes the data when it creates the clustered index.

詳細については、「 インデックスの FILL FACTOR の指定」を参照してください。For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }
適用対象: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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 INDEXALTER 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.

ビューに作成されたインデックス、一意でないインデックス、XML インデックス、空間インデックス、およびフィルター選択されたインデックスの IGNORE_DUP_KEY を ON に設定することはできません。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 に設定するか、NORECOMPUTE 句を指定せずに UPDATE STATISTICS を実行します。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.
  • Always On の読み取り可能なセカンダリ データベースに対して作成された統計。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:

  • 非クラスター化行ストア インデックスからクラスター化行ストア インデックスへの変更。A nonclustered rowstore index to a clustered rowstore index.

DROP_EXISTING では、以下を変更できません。With DROP_EXISTING, you cannot change:

  • クラスター化行ストア インデックスから非クラスター化行ストア インデックスへの変更。A clustered rowstore index to a nonclustered rowstore index.
  • クラスター化列ストア インデックスから任意の種類の行ストア インデックスへの変更。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 の各エディションでサポートされる機能の一覧については、「Editions and Supported Features for SQL Server 2016」 (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 2019 プレビューSQL Server 2019 preview 以降) と Azure SQL データベースAzure SQL Database (パブリック プレビュー)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL Server 2019 preview) and Azure SQL データベースAzure 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 2019 プレビューSQL Server 2019 preview 以降) と Azure SQL データベースAzure SQL Database (パブリック プレビュー)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL Server 2019 preview) and Azure SQL データベースAzure 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 データ型 (imagentexttext、および空間型) が含まれる場合のクラスター化インデックス。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) で始まる) および SQL DatabaseSQL Database では、テーブルに varchar(max) 列または varbinary(max) 列が含まれている場合、他の列を含むクラスター化インデックスは、ONLINE オプションを使用して作成または再作成できます。In SQL ServerSQL Server (beginning with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and in SQL DatabaseSQL 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. ベース テーブルに varchar(max) 列または varbinary(max) 列が含まれている場合、SQL DatabaseSQL Database では ONLINE オプションが許可されません。SQL DatabaseSQL Database does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns.

詳しくは、「 Perform Index Operations Online」をご覧ください。For more information, see Perform Index Operations Online.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
適用対象: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database

行ロックを許可するかどうかを指定します。Specifies whether row locks are allowed. 既定値は ON です。The default is ON.

ONON
インデックスにアクセスするとき、行ロックが許可されます。Row locks are allowed when accessing the index. いつ行ロックを使用するかは、データベース エンジンDatabase Engineによって決定されます。The データベース エンジンDatabase 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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database

ページ ロックを許可するかどうかを指定します。Specifies whether page locks are allowed. 既定値は ON です。The default is ON.

ONON
ページにアクセスするとき、行ロックが許可されます。Page locks are allowed when accessing the index. いつページ ロックを使用するかは、データベース エンジンDatabase Engine によって決定されます。The データベース エンジンDatabase 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 2019 プレビューSQL Server 2019 preview 以降)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL 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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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.

注意

並列インデックス操作は、MicrosoftMicrosoft SQL 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:

なしNONE
インデックスまたは指定したパーティションが圧縮されません。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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure 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).

<範囲> はパーティション番号として、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)
);

RemarksRemarks

CREATE INDEX ステートメントは、他のクエリと同じように最適化されます。The CREATE INDEX statement is optimized like any other query. クエリ プロセッサでは I/O 操作を減らすため、テーブル スキャンの代わりに別のインデックスがスキャンされる場合があります。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) 以降および Azure SQL データベースAzure SQL Database では、クラスター化列ストア インデックスとして格納されたテーブルに非クラスター化インデックスを作成できます。Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Azure SQL データベースAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. 最初に保存されているテーブルに非クラスター化インデックスを作成するかどうかは後で、テーブルをクラスター化列ストア インデックスに変換する場合は、ヒープまたはクラスター化インデックスに適用する場合は、インデックスが永続化されます。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. クラスター化列ストア インデックスを再構築するときに、非クラスター化インデックスを削除する必要がではありません。It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

制限事項と制約事項:Limitations and Restrictions:

  • クラスター化列ストア インデックスとして格納されたテーブルに非クラスター化インデックスを作成する場合、FILESTREAM_ON オプションが無効です。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 Engineは、挿入操作によってデータが追加されるたびに、重複した値がないかをチェックします。When a unique index exists, the データベース エンジンDatabase Engine checks for duplicate values each time data is added by a insert operations. 重複キー値を生成する挿入操作はロールバックされ、データベース エンジンDatabase Engineはエラー メッセージを表示します。Insert operations that would generate duplicate key values are rolled back, and the データベース エンジンDatabase Engine displays an error message. 挿入操作で多くの行が変更された場合でも、重複が 1 つでもあれば、ロールバックが行われます。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.

警告

固定されていないインデックスをパーティションが 1, 000 個以上あるテーブルに作成または再構築することは可能ですが、サポートされていません。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. パーティションの数が 1,000 個を超えた場合は、固定されたインデックスのみを使用することをお勧めします。We recommend using only aligned indexes when the number of partitions exceed 1,000.

一意でないクラスター化インデックスをパーティション分割するとき、データベース エンジンDatabase Engine は既定では、まだ指定されていないパーティション分割列をクラスター化インデックス キーのリストに追加します。When partitioning a non-unique, clustered index, the データベース エンジンDatabase 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. テーブル内のすべての行をスキャンしてパーティション インデックスの統計を作成するには、FULLSCAN 句で CREATE STATISTICS または UPDATE STATISTICS を使用します。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 オプションが必要となります。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.

    SET オプションSET options 必要な値Required value 既定のサーバー値Default server value 既定Default

    OLE DB および ODBC 値OLE DB and ODBC value
    既定Default

    DB-Library 値DB-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
    • ANSI_WARNINGS を ON に設定すると、データベース互換性レベルが 90 以上に設定されている場合、暗黙的に 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 Engine によりエラーが生成され、インデックスのデータを変更していた INSERT ステートメント、UPDATE ステートメント、DELETE ステートメント、または MERGE ステートメントがロールバックされます。The データベース エンジンDatabase 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 バイトをクラスター化インデックスと非クラスター化インデックスの 1,700 バイトです。The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. (SQL DatabaseSQL Database および SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以前では、制限は常に 900 バイトでした)。インデックス varchar 既存のデータ列には、インデックスの作成時の制限を超えない場合をバイトの制限を超える列を作成することができます。 ただし、後続の挿入や更新操作を、制限を超える合計サイズとなる列には失敗します。(Before SQL DatabaseSQL 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. クラスター化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータを持つ varchar 列を含めることはできません。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 Engineではこれらの列は考慮されません。These columns are not considered by the データベース エンジンDatabase 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 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 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 Engine によってテーブルに計算値が格納され、計算列が依存している他の列が更新されるとその計算値も更新されます。This means that the データベース エンジンDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. データベース エンジンDatabase Engine は、列にインデックスを作成するとき、およびインデックスがクエリで参照されるときに、これらの保存値を使用します。The データベース エンジンDatabase 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 Engineの定義によると決定的であるが、正確でない式に基づく計算列。Computed columns based on expressions that are deterministic as defined by the データベース エンジンDatabase 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.

派生した計算列 imagentexttextvarchar(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) では新しいインデックス オプションが導入され、オプションの指定方法も変更になりました。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_EXISTING 句DROP_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.

インデックス ステートメントで非クラスター化インデックスが指定され、かつ ONLINE オプションが OFF に設定されている場合を除き、同じインデックス キー列が同じ順序 (昇順または降順も同じ) で使用される場合、DROP_EXISTING 句では再度データの並べ替えは行われません。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 Engineは、トランザクションがコミットされるまで実際のページの割り当て解除とそれに関連するロックを延期します。When indexes with 128 extents or more are dropped or rebuilt, the データベース エンジンDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

ONLINE オプションONLINE 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.

詳しくは、「 Perform Index Operations Online」をご覧ください。For more information, see Perform Index Operations Online.

再開可能なインデックス操作Resumable index operations

適用対象:SQL ServerSQL Server (SQL Server 2019 プレビューSQL Server 2019 preview 以降) と Azure SQL データベースAzure SQL Database (パブリック プレビュー)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL Server 2019 preview) and Azure SQL データベースAzure 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 for 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. MAX_DURATION の時間 (分単位) は、0 分より長く、かつ 1 週間 (7 * 24 * 60 = 10080 分) 以下とする必要があります。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.
  • RESUMABLE = ON を指定した DDL コマンドを、明示的なトランザクション内で実行することはできません (BEGIN TRAN ...COMMIT ブロックの一部にすることはできません)。The DDL command with RESUMABLE = ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN ... COMMIT block).
  • インデックスの作成/再構築を再開/中止するには、ALTER INDEX T-SQL 構文を使用します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.

インデックス作成が再開可能な操作として実行されることを示し、現在の実行状態を確認する方法については、「sys.index_resumable_operations」をご覧ください。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 = ONALLOW_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 Engineは適切なロックを選択し、行ロックまたはページ ロックをテーブル ロックにエスカレートすることができます。The データベース エンジンDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

ALLOW_ROW_LOCKS = OFFALLOW_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 2019 プレビューSQL Server 2019 preview 以降)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL 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. 先頭のキー列に、ID 列や現在の日付/時刻が既定値である日付など、常に増加 (または減少) する値が含まれている場合、インデックスはシーケンシャルと見なされます。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. それは、シーケンシャル キーを使用していて最終ページ挿入競合が発生しやすいインデックスを対象とするものですが、B ツリー インデックス構造の他の領域でホット スポットが発生するインデックスでも役に立つ場合があります。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 CompressionData Compression

データの圧縮については、「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

SQL データ ウェアハウスSQL Data Warehouse および Parallel Data WarehouseParallel Data Warehouse では、以下を作成することはできません。In SQL データ ウェアハウスSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, you cannot create:

  • 列ストア インデックスが既に存在する場合に、データ ウェアハウス テーブル上のクラスター化または非クラスター化行ストア インデックス。A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. この動作は、行ストアと列ストアの両方のインデックスが同じテーブル上に共存できる SMP SQL ServerSQL Server とは異なります。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

SQL DatabaseSQL Database では、filegroup オプションおよび filestream オプションはサポートされません。does not support filegroup and filestream options.

例 :すべてのバージョン。Examples: All versions. AdventureWorks データベースを使用します。Uses the AdventureWorks database

A.A. 単純な非クラスター化行ストア インデックスを作成するCreate a simple nonclustered rowstore index

次の例では、Purchasing.ProductVendor テーブルの VendorID 列に非クラスター化インデックスを作成します。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.B. 単純な非クラスター化行ストア複合インデックスを作成するCreate a simple nonclustered rowstore composite index

次の例では、Sales.SalesPerson テーブルの SalesQuota 列および SalesYTD 列に非クラスター化複合インデックスを作成します。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.C. 他のデータベースのテーブルにインデックスを作成するCreate an index on a table in another database

次の例では、Purchasing データベースにある VendorID テーブルの ProductVendor 列に非クラスター化インデックスを作成します。The following example creates a non-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.D. インデックスに列を追加するAdd a column to an index

次の例では、dbo.FactFinance テーブルの 2 つの列でインデックス IX_FF を作成します。The following example creates index IX_FF with two columns from the dbo.FactFinance table. 次のステートメントでは、1 つ以上の列でインデックスを再構築し、既存の名前を保持します。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、Azure SQL DatabaseExamples: SQL Server, Azure SQL Database

E.E. 一意の非クラスター化インデックスを作成するCreate a unique nonclustered index

次の例では、AdventureWorks2012AdventureWorks2012 データベースにある Name テーブルの Production.UnitMeasure 列に一意の非クラスター化インデックスを作成します。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.F. IGNORE_DUP_KEY オプションを使用するUse 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. 2 番目の複数行の #Test ステートメントを実行するときには、INSERT テーブルに、重複する値となる 1 行を意図的に挿入します。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

次は 2 番目の 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_KEYOFF に設定して同じステートメントを実行します。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

次は 2 番目の 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 インデックス制約に違反した行は 1 行だけでしたが、このテーブルから行は挿入されませんでした。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.G. DROP_EXISTING を使ってインデックスを削除し再作成するUsing DROP_EXISTING to drop and re-create an index

次の例では、ProductID オプションを使って、AdventureWorks2012AdventureWorks2012 データベースにあるProduction.WorkOrder テーブルの 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.H. ビューにインデックスを作成するCreate an index on a view

次の例では、ビューとそのビューのインデックスを作成します。The following example creates a view and an index on that view. ここでは、インデックス付きビューを使用する 2 つのクエリを実行します。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.I. 非キー列 (付加列) を使用してインデックスを作成するCreate an index with included (non-key) columns

次の例では、1 つのキー列 (PostalCode) と 4 つの非キー列 (AddressLine1AddressLine2CityStateProvinceID) を使って非クラクタ化インデックスを作成します。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.J. パーティション インデックスを作成するCreate a partitioned index

次の例では、AdventureWorks2012AdventureWorks2012 データベースの既存のパーティション構成 TransactionsPS1 に非クラスター化パーティション インデックスを作成します。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 Server (SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database

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

K.K. フィルター選択されたインデックスを作成するCreating a filtered index

次の例では、AdventureWorks2012AdventureWorks2012 データベースの Production.BillOfMaterials テーブルにフィルター選択されたインデックスを作成します。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.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.M. 再開可能なインデックス操作を作成、再開、一時停止、中止するCreate, resume, pause, and abort resumable index operations

適用対象:SQL ServerSQL Server (SQL Server 2019 プレビューSQL Server 2019 preview 以降) と Azure SQL データベースAzure SQL Database (パブリック プレビュー)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL Server 2019 preview) and Azure SQL データベースAzure 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

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. 基本構文Basic syntax

再開可能なインデックス操作を作成、再開、一時停止、中止するCreate, resume, pause, and abort resumable index operations

適用対象:SQL ServerSQL Server (SQL Server 2019 プレビューSQL Server 2019 preview 以降) と Azure SQL データベースAzure SQL Database (パブリック プレビュー)Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 プレビューSQL Server 2019 preview) and Azure SQL データベースAzure 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.O. 現在のデータベース内のテーブルに非クラスター化インデックスを作成するCreate a non-clustered index on a table in the current database

次の例では、ProductVendor テーブルの VendorID 列に非クラスター化インデックスを作成します。The following example creates a non-clustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

P.P. 他のデータベースのテーブルにクラスター化インデックスを作成するCreate a clustered index on a table in another database

次の例では、Purchasing データベースにある VendorID テーブルの ProductVendor 列に非クラスター化インデックスを作成します。The following example creates a non-clustered 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
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