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

適用対象:○SQL Server (2012 以降)○Azure SQL Database○Azure SQL Data Warehouse ○Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2012)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

行ストア テーブルをクラスター化された列ストア インデックスに変換するか、クラスター化されていない列ストア インデックスを作成します。Convert a rowstore table to a clustered columnstore index or create a nonclustered columnstore index. OLTP ワークロードに効率的にリアルタイムの経営分析を実行する、またはデータ ウェアハウスのワークロードのデータの圧縮とクエリのパフォーマンスを向上させるためには、列ストア インデックスを使用します。Use a columnstore index to efficiently run real-time operational analytics on an OLTP workload or to improve data compression and query performance for data warehousing workloads.

注意

SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降、テーブルをクラスター化列ストア インデックスとして作成できます。Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create the table as a clustered columnstore index. 最初に行ストア テーブルを作成し、それをクラスター化列ストア インデックスに変換する作業は不要になりました。It is no longer necessary to first create a rowstore table and then convert it to a clustered columnstore index.

ヒント

インデックスの設計のガイドラインについては、「SQL Server インデックス デザイン ガイド」をご覧ください。For information on index design guidelines, refer to the SQL Server Index Design Guide.

例に進みます。Skip to examples:

シナリオに移動:Go to scenarios:

詳細情報:Learn more:

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

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  

-- Create a clustered columnstore index on disk-based table.  
CREATE CLUSTERED COLUMNSTORE INDEX index_name  
    ON [database_name. [schema_name ] . | schema_name . ] table_name  
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ]  
[ ; ]  

--Create a non-clustered columnstore index on a disk-based table.  
CREATE [NONCLUSTERED]  COLUMNSTORE INDEX index_name   
    ON [database_name. [schema_name ] . | schema_name . ] table_name   
        ( column  [ ,...n ] )  
    [ WHERE <filter_expression> [ AND <filter_expression> ] ]
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ]   
[ ; ]  

<with_option> ::=  
      DROP_EXISTING = { ON | OFF } -- default is OFF  
    | MAXDOP = max_degree_of_parallelism 
    | ONLINE = { ON | OFF } 
    | COMPRESSION_DELAY  = { 0 | delay [ Minutes ] }  
    | DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
      [ ON PARTITIONS ( { partition_number_expression | range } [ ,...n ] ) ]  

<on_option>::=  
      partition_scheme_name ( column_name )   
    | filegroup_name   
    | "default"   

<filter_expression> ::=  
      column_name IN ( constant [ ,...n ]  
    | column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

CREATE CLUSTERED COLUMNSTORE INDEX index_name   
    ON [ database_name . [ schema_name ] . | schema_name . ] table_name  
    [ WITH ( DROP_EXISTING = { ON | OFF } ) ] --default is OFF  
[;]  

引数Arguments

CREATE CLUSTERED COLUMNSTORE INDEXCREATE CLUSTERED COLUMNSTORE INDEX
すべてのデータが列ごとに圧縮されて格納されるクラスター化列ストア インデックスを作成します。Create a clustered columnstore index in which all of the data is compressed and stored by column. インデックスにはテーブル内の列がすべて含まれ、テーブル全体が格納されます。The index includes all of the columns in the table, and stores the entire table. 既存のテーブルがヒープまたはクラスター化インデックスである場合、そのテーブルはクラスター化列ストア インデックスに変換されます。If the existing table is a heap or clustered index, the table is converted to a clustered columnstore index. テーブルが既にクラスター化列ストア インデックスとして格納されている場合、既存のインデックスは削除され、再構築されます。If the table is already stored as a clustered columnstore index, the existing index is dropped and rebuilt.

index_nameindex_name
新しいインデックスの名前を指定します。Specifies the name for the new index.

テーブルは、クラスター化列ストア インデックスを既に持っている場合、既存のインデックスと同じ名前を指定できます。 または DROP EXISTING オプションを使用するには新しい名前を指定します。If the table already has a clustered columnstore index, you can specify the same name as the existing index, or you can use the DROP EXISTING option to specify a new name.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | schema_name . | schema_name . ] table_name] table_name
クラスター化列ストア インデックスとして格納するテーブルの 1 部、2 部、または 3 部構成の名前を指定します。Specifies the one-, two-, or three-part name of the table to be stored as a clustered columnstore index. テーブルがヒープかクラスター化インデックスの場合、テーブルは行ストアから列ストアに変換されます。If the table is a heap or clustered index the table is converted from rowstore to a columnstore. テーブルが既に列ストアである場合、このステートメントでクラスター化列ストア インデックスが再構築されます。If the table is already a columnstore, this statement rebuilds the clustered columnstore index.

のすべてのメンションをWITH
DROP_EXISTING = [オフ] |ONDROP_EXISTING = [OFF] | ON
DROP_EXISTING = ON を使用する既存のクラスター化列ストア インデックスを削除して、新しい列ストア インデックスを作成します。DROP_EXISTING = ON specifies to drop the existing clustered columnstore index, and create a new columnstore index.

既定では、DROP_EXISTING = OFF インデックス名は、既存の名前と同じが必要です。The default, DROP_EXISTING = OFF expects the index name is the same as the existing name. 指定したインデックス名が既に存在するは、エラーが発生します。An error occurs is the specified index name already exists.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
インデックス操作の間、既存の "並列処理の最大限度" サーバー構成をオーバーライドします。Overrides the existing maximum degree of parallelism server configuration for the duration of the index operation. 並列プランの実行で使用されるプロセッサ数を制限するには、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 values can be:

  • 1 - 並列プラン生成を抑制します。1 - Suppress parallel plan generation.
  • >1 - 現在のシステム ワークロードに基づいて、並列インデックス操作で使用される最大プロセッサ数を指定の数以下に制限します。>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. たとえば、MAXDOP が 4 の場合、使用されるプロセッサの数は 4 以下になります。For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (既定) - 現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。0 (default) - Use the actual number of processors or fewer based on the current system workload.

    詳細については、「max degree of parallelism サーバー構成オプションの構成 」と「 並列インデックス操作の構成」を参照してください。For more information, see Configure the max degree of parallelism Server Configuration Option, and Configure Parallel Index Operations.

COMPRESSION_DELAY = 0 | delay [ Minutes ]COMPRESSION_DELAY = 0 | delay [ Minutes ]
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

ディスク ベースのテーブルの場合は、CLOSED 状態のデルタ行グループがそのデルタ行グループに留まる必要がある最低限の分数が遅延によって指定され、その時間が経過すると、SQL Server は行グループを、圧縮された行グループに圧縮できるようになります。For a disk-based table, delay specifies the minimum number of minutes a delta rowgroup in the CLOSED state must remain in the delta rowgroup before SQL Server can compress it into the compressed rowgroup. ディスク ベース テーブルでは個々の行において挿入時間と更新時間が追跡されないため、SQL Server は CLOSED 状態のデルタ行グループに遅延を適用します。Since disk-based tables don't track insert and update times on individual rows, SQL Server applies the delay to delta rowgroups in the CLOSED state.
既定値は、0 分です。The default is 0 minutes.
COMPRESSION_DELAY を使用する場合の推奨事項については、「列ストアを使用したリアルタイム運用分析の概要」をご覧ください。For recommendations on when to use COMPRESSION_DELAY, see Get started with Columnstore for real time operational analytics.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVEDATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017. 指定したテーブル、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。Specifies the data compression option for the specified table, partition number, or range of partitions. 次のオプションがあります。The options are as follows:
COLUMNSTORECOLUMNSTORE
列ストアでは、既定値は、し、ほとんどのパフォーマンスの高い列ストア圧縮で圧縮することを指定します。COLUMNSTORE is the default and specifies to compress with the most performant columnstore compression. これは、一般的な選択肢です。This is the typical choice.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
COLUMNSTORE_ARCHIVE は、テーブルまたはパーティション サイズをより小さなサイズに圧縮します。COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. などの状況をこのオプションを使用してアーカイブを記憶域のサイズを必要とし、保存と取得に多くの時間に余裕があることができます。Use this option for situations such as archival that require a smaller storage size and can afford more time for storage and retrieval.

圧縮の詳細については、「データ圧縮」を参照してください。For more information about compression, see Data Compression.

ONON
ON オプションを使用すると、パーティション構成、特定のファイル グループ、既定のファイル グループなど、データ ストレージのオプションを指定できます。With the ON options you can specify options for data storage, such as a partition scheme, a specific filegroup, or the default filegroup. ON オプションを指定しない場合、インデックスでは、既存のテーブルの設定パーティションまたはファイル グループ設定が使用されます。If the ON option is not specified, the index uses the settings partition or filegroup settings of the existing table.

partition_scheme_name ( column_name )partition_scheme_name ( column_name )
テーブルのパーティション構成を指定します。Specifies the partition scheme for the table. パーティション構成は既にデータベースに存在している必要があります。The partition scheme must already exist in the database. パーティション構成を作成するには、「CREATE PARTITION SCHEME」をご覧ください。To create the partition scheme, see CREATE PARTITION SCHEME.

column_name には、パーティション インデックスがパーティション分割される対象の列を指定します。column_name specifies the column against which a partitioned index is 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.

filegroup_namefilegroup_name
クラスター化列ストア インデックスを格納するファイル グループを指定します。Specifies the filegroup for storing the clustered columnstore index. 位置の指定がなく、テーブルがパーティション分割されていない場合は、基になるテーブルまたはビューと同じファイル グループが使用されます。If no location is specified and the table is not partitioned, the index uses the same filegroup as the underlying table or view. ファイル グループは既に存在している必要があります。The filegroup must already exist.

" default "" default "
既定のファイル グループにインデックスを作成するには、"default" または [ default ] を使用します。To create the index on the default filegroup, use "default" or [ default ].

"default" を指定する場合は、現在のセッションに対して QUOTED_IDENTIFIER オプションが ON である必要があります。If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. QUOTED_IDENTIFIER は既定で ON です。QUOTED_IDENTIFIER is ON by default. 詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」をご覧ください。For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEXCREATE [NONCLUSTERED] COLUMNSTORE INDEX
行ストア テーブルにメモリ内の非クラスター化列ストア インデックスを作成、ヒープまたはクラスター化インデックスとして格納します。Create an in-memory nonclustered columnstore index on a rowstore table stored as a heap or clustered index. インデックスでは、フィルター選択された条件し、基になるテーブルの列のすべてを含める必要はありません。The index can have a filtered condition and does not need to include all of the columns of the underlying table. 列ストア インデックスでは、データのコピーを保存するには、十分な領域が必要です。The columnstore index requires enough space to store a copy of the data. 更新可能であり、基になるテーブルが変更されると更新されます。It is updateable and is updated as the underlying table is changed. クラスター化インデックスに非クラスター化列ストア インデックスでは、リアルタイム分析の機能を使用できます。The nonclustered columnstore index on a clustered index enables real-time analytics.

index_nameindex_name
インデックスの名前を指定します。Specifies the name of the index. index_name はテーブル内で一意にする必要がありますが、データベース内で一意である必要はありません。index_name must be unique within the table, but does not have to be unique within the database. インデックス名は、識別子の規則に従っている必要があります。Index names must follow the rules of identifiers.

( column [ ,...n ] )( column [ ,...n ] )
格納する列を指定します。Specifies the columns to store. 非クラスター化列ストア インデックスは、1,024年列に制限されます。A nonclustered columnstore index is limited to 1024 columns.
各列は、列ストア インデックスでサポートされているデータ型である必要があります。Each column must be of a supported data type for columnstore indexes. サポートされるデータ型の一覧については、「制限事項と制約事項」を参照してください。See Limitations and Restrictions for a list of the supported data types.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | schema_name . | schema_name . ] table_name] table_name
インデックスが含まれているテーブルの 1 部、2 部、または 3 部構成の名前を指定します。Specifies the one-, two-, or three-part name of the table that contains the index.

WITH DROP_EXISTING = [OFF] | ONWITH DROP_EXISTING = [OFF] | ON
DROP_EXISTING = ON 既存のインデックスは削除され、再構築されます。DROP_EXISTING = ON The existing index is dropped and rebuilt. 指定するインデックス名は、現在存在するインデックスと同じにする必要がありますが、インデックス定義は変更できます。The index name specified must be the same as a currently existing index; however, the index definition can be modified. たとえば、異なる列またはインデックス オプションを指定できます。For example, you can specify different columns, or index options.

DROP_EXISTING = OFF 指定するインデックス名が既に存在する場合、エラーが表示されます。DROP_EXISTING = OFF An error is displayed if the specified index name already exists. DROP_EXISTING を使用してインデックスの種類を変更することはできません。The index type cannot be changed by using DROP_EXISTING. 旧バージョンと互換性のある構文では、WITH DROP_EXISTING は WITH DROP_EXISTING = ON と同じです。In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
インデックス操作の間、max degree of parallelism サーバー構成オプション更新オプションをオーバーライドします。Overrides the Configure the max degree of parallelism Server Configuration Option configuration option for the duration of the index operation. 並列プランの実行で使用されるプロセッサ数を制限するには、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 values can be:

  • 1 - 並列プラン生成を抑制します。1 - Suppress parallel plan generation.
  • >1 - 現在のシステム ワークロードに基づいて、並列インデックス操作で使用される最大プロセッサ数を指定の数以下に制限します。>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. たとえば、MAXDOP が 4 の場合、使用されるプロセッサの数は 4 以下になります。For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (既定) - 現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。0 (default) - Use 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 MicrosoftMicrosoft SQL 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.

ONLINE = [ON | OFF]ONLINE = [ON | OFF]
適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x)、非クラスター化インデックスのみ。Applies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x), in nonclustered columnstore indexes only. ON の場合、インデックスの新しいコピーが構築されている間、非クラスター化インデックスはオンラインの状態を維持し、利用できます。ON specifies that the nonclustered columnstore index remains online and available while the new copy of the index is being built.

OFF の場合、新しいコピーが構築されている間、インデックスは使用できません。OFF specifies that the index is not available for use while the new copy is being built. これは非クラスター化インデックスのみであり、ベース テーブルは利用できます。新しいインデックスが完成するまで、非クラスター化インデックスのみクエリの応答に利用されません。As this is a nonclustered index only, the base table remains available, only the nonclustered columnstore index is not used to satisfy queries until the new index is complete.

COMPRESSION_DELAY = 0 | <delay>[Minutes]COMPRESSION_DELAY = 0 | <delay>[Minutes]
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

行がデルタ行グループに残る期間の下限を指定します。この下限までは、圧縮された行グループに移行できます。Specifies a lower bound on how long a row should stay in delta rowgroup before it is eligible for migration to compressed rowgroup. たとえば、行が 120 分間変更されない場合、単票格納形式に圧縮するという顧客がいるかもしれません。For example, a customer can say that if a row is unchanged for 120 minutes, make it eligible for compressing into columnar storage format. ディスクベース テーブルの列ストア インデックスの場合、行が挿入または更新された時刻は追跡しません。代わりに、行のプロキシとして、デルタ行グループの終了時刻を利用します。For columnstore index on disk-based tables, we don’t track the time when a row was inserted or updated, we use the delta rowgroup closed time as a proxy for the row instead. 既定の継続時間は 0 分です。The default duration is 0 minutes. 100 万行がデルタ行グループに累積されると、1 行が単票格納に移行されます。その行に終了の印が付きます。A row is migrated to columnar storage once 1 million rows have been accumulated in delta rowgroup and it has been marked closed.

DATA_COMPRESSIONDATA_COMPRESSION
指定したテーブル、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。Specifies the data compression option for the specified table, partition number, or range of partitions. 次のオプションがあります。The options are as follows:
COLUMNSTORECOLUMNSTORE
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017. 非クラスター化列ストア インデックスとクラスター化列ストア インデックスの両方を含む列ストア インデックスにのみ適用されます。Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. 列ストアでは、既定値は、し、ほとんどのパフォーマンスの高い列ストア圧縮で圧縮することを指定します。COLUMNSTORE is the default and specifies to compress with the most performant columnstore compression. これは、一般的な選択肢です。This is the typical choice.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017. 非クラスター化列ストア インデックスとクラスター化列ストア インデックスの両方を含む列ストア インデックスにのみ適用されます。Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE_ARCHIVE は、テーブルまたはパーティション サイズをより小さなサイズに圧縮します。COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. これは、保存用や、ストレージのサイズを減らす必要があり、しかも保存と取得に時間をかける余裕があるその他の状況で使用できます。This can be used for archival, or for other situations that require a smaller storage size and can afford more time for storage and retrieval.

圧縮の詳細については、「データ圧縮」を参照してください。For more information about compression, see Data Compression.

WHERE <filter_expression> [ AND <filter_expression> ] 適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017.WHERE <filter_expression> [ AND <filter_expression> ] Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

フィルター述語が呼び出されると、インデックスに含める行を指定します。Called a filter predicate, this specifies which rows to include in the index. SQL ServerSQL Server は、フィルター選択されたインデックスのデータ行で、フィルター選択された統計情報を作成します。 creates filtered statistics on the data rows in the filtered index.

フィルター述語では、単純な比較ロジックを使用します。The filter predicate uses simple comparison logic. 比較演算子では、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

フィルター選択されたインデックスについては、「フィルター選択されたインデックスの作成」を参照してください。For guidance on filtered indexes, see Create Filtered Indexes.

ONON
これらのオプションによって、インデックスが作成されるファイル グループが指定されます。These options specify the filegroups on which the index is created.

partition_scheme_name ( column_name )partition_scheme_name ( column_name )
ファイル グループを定義するパーティション構成を指定します。このファイル グループは、パーティション インデックスのパーティションのマップ先となります。Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index is mapped. CREATE PARTITION SCHEME を実行し、パーティション構成がデータベース内に存在するようにする必要があります。The partition scheme must exist within the database by executing CREATE PARTITION SCHEME. column_name には、パーティション インデックスがパーティション分割される対象の列を指定します。column_name specifies the column against which a partitioned index is 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. 列ストア インデックスをパーティション分割するとき、 データベース エンジンDatabase Engineでは、まだ指定されていない場合、パーティション分割列がインデックスの列として追加されます。When partitioning a columnstore index, データベース エンジンDatabase Engine adds the partitioning column as a 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.
パーティション テーブルの列ストア インデックスは、パーティション固定にする必要があります。A columnstore index on a partitioned table must be partition aligned.
インデックスのパーティション分割の詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。For more information about partitioning indexes, see Partitioned Tables and Indexes.

filegroup_namefilegroup_name
インデックスを作成するファイル グループ名を指定します。Specifies a filegroup name on which to create the index. filegroup_name の指定がなく、テーブルがパーティション分割されていない場合は、基になるテーブルと同じファイル グループが使用されます。If filegroup_name is not specified and the table is not partitioned, the index uses the same filegroup as the underlying table. ファイル グループは既に存在している必要があります。The filegroup must already exist.

" default "" default "
既定のファイル グループに、指定したインデックスを作成します。Creates the specified index on the default filegroup.

この文脈での 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 (Transact-SQL)」をご覧ください。For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

PermissionsPermissions

テーブルに対する ALTER 権限が必要です。Requires ALTER permission on the table.

全般的な解説General Remarks

列ストア インデックスは一時テーブルに作成できます。A columnstore index can be created on a temporary table. テーブルが削除されるかセッションが終了すると、インデックスも削除されます。When the table is dropped or the session ends, the index is also dropped.

フィルター選択されたインデックス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.

    フィルター選択されたインデックスについて詳しくは、「フィルター選択されたインデックスの作成」をご覧ください。For more information about Filtered Indexes, see Create Filtered Indexes.

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

列ストア インデックスの各列は、次の一般的なビジネス データ型のいずれかである必要があります。Each column in a columnstore index must be of one of the following common business data types:

  • datetimeoffset [ ( n ) ]datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]datetime2 [ ( n ) ]
  • DATETIMEdatetime
  • smalldatetimesmalldatetime
  • 日付date
  • time [ ( n ) ]time [ ( n ) ]
  • float [ ( n ) ]float [ ( n ) ]
  • real [ ( n ) ]real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]numeric [ ( precision [ , scale ] ) ]
  • moneymoney
  • SMALLMONEYsmallmoney
  • BIGINTbigint
  • ssNoversionint
  • smallintsmallint
  • TINYINTtinyint
  • bitbit
  • nvarchar [ ( n ) ]nvarchar [ ( n ) ]
  • nvarchar(max) (クラスタ化列ストア インデックスのみの SQL Server 2017 (14.x)SQL Server 2017 (14.x) および Premium 層、Standard 層 (S3 以上)、すべての VCore サービス層に適用されます)nvarchar(max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • nchar [ ( n ) ]nchar [ ( n ) ]
  • varchar [ ( n ) ]varchar [ ( n ) ]
  • varchar(max) (クラスタ化列ストア インデックスのみの SQL Server 2017 (14.x)SQL Server 2017 (14.x) および Premium 層、Standard 層 (S3 以上)、すべての VCore サービス層に適用されます)varchar(max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • char [ ( n ) ]char [ ( n ) ]
  • varbinary [ ( n ) ]varbinary [ ( n ) ]
  • varbinary (max) (クラスタ化列ストア インデックスのみの SQL Server 2017 (14.x)SQL Server 2017 (14.x) および Premium 層、Standard 層 (S3 以上)、すべての VCore サービス層の Azure SQL Database に適用されます)varbinary (max) (Applies to SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Azure SQL Database at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • binary [ ( n ) ]binary [ ( n ) ]
  • uniqueidentifier ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) 以降に適用)uniqueidentifier (Applies to SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later)

基になるテーブルに列ストア インデックスはサポートされていないデータ型の列がある場合は、非クラスター化列ストア インデックスには、その列を省略する必要があります。If the underlying table has a column of a data type that is not supported for columnstore indexes, you must omit that column from the nonclustered columnstore index.

以下のいずれかのデータ型を使用する列は、列ストア インデックスに含めることができません。Columns that use any of the following data types cannot be included in a columnstore index:

  • ntext、text、imagentext, text, and image
  • nvarchar(max)、varchar(max)、varbinary(max) ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以前のバージョンに適用、非クラスター化列ストア インデックス)nvarchar(max), varchar(max), and varbinary(max) (Applies to SQL Server 2016 (13.x)SQL Server 2016 (13.x) and prior versions, and nonclustered columnstore indexes)
  • rowversion (timestamp)rowversion (and timestamp)
  • sql_variantsql_variant
  • CLR 型 (hierarchyid 型および空間型)CLR types (hierarchyid and spatial types)
  • xmlxml
  • uniqueidentifier ( SQL Server 2012 (11.x)SQL Server 2012 (11.x) に適用)uniqueidentifier (Applies to SQL Server 2012 (11.x)SQL Server 2012 (11.x))

非クラスター化列ストア インデックスNonclustered columnstore indexes:

  • 1,024 より多い列を持つことはできません。Cannot have more than 1024 columns.
  • 制約ベースのインデックスとして作成することはできません。Cannot be created as a constraint-based index. 列ストア インデックスを持つテーブルには、一意の制約、主キー制約、外部キー制約を含めることができます。It is possible to have unique constraints, primary key constraints, and foreign key constraints on a table with a columnstore index. 制約は常に行ストア インデックスで適用されます。Constraints are always enforced with a row-store index. 列ストア (クラスター化または非クラスター化) インデックスで制約を適用することはできません。Constraints cannot be enforced with a columnstore (clustered or nonclustered) index.
  • ビューまたはインデックス付きビュー上では作成できません。Cannot be created on a view or indexed view.
  • スパース列を含めることはできません。Cannot include a sparse column.
  • ALTER INDEX ステートメントを使用して変更することはできません。Cannot be changed by using the ALTER INDEX statement. 非クラスター化インデックスを変更するには、列ストア インデックスを削除してから再作成する必要があります。To change the nonclustered index, you must drop and re-create the columnstore index instead. ALTER INDEX を使用し、列ストア インデックスを無効にし、再構築できます。You can use ALTER INDEX to disable and rebuild a columnstore index.
  • INCLUDE キーワードを使用して作成することはできません。Cannot be created by using the INCLUDE keyword.
  • インデックスを並べ替えるための ASC または DESC キーワードを含めることはできません。Cannot include the ASC or DESC keywords for sorting the index. 列ストア インデックスは、圧縮アルゴリズムに従って順序付けされます。Columnstore indexes are ordered according to the compression algorithms. 並べ替えを行うと、パフォーマンス上の利点の多くが無効になります。Sorting would eliminate many of the performance benefits.
  • 非クラスター化列ストア インデックスに型が nvarchar(max)、varchar(max)、varbinary(max) のラージ オブジェクト (LOB) 列を含めることはできません。Cannot include large object (LOB) columns of type nvarchar(max), varchar(max), and varbinary(max) in nonclustered column store indexes. Premium 層、Standard 層 (S3 以上)、およびすべての VCore サービス層で構成されている SQL Server 2017 (14.x)SQL Server 2017 (14.x) バージョンと Azure SQL Database 以降で、クラスター化列ストア インデックスのみ LOB 型をサポートしています。Only clustered columnstore indexes support LOB types, beginning in SQL Server 2017 (14.x)SQL Server 2017 (14.x) version and Azure SQL Database configured at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers tier. 以前のバージョンでは、クラスター化列ストア インデックスと非クラスター化列ストア インデックスで LOB 型をサポートしていません。Note, prior versions do not support LOB types in clustered and nonclustered columnstore indexes.

列ストア インデックスと同時に使用できない機能:Columnstore indexes cannot be combined with the following features:

  • 計算列。Computed columns. SQL Server 2017 以降、クラスター化列ストア インデックスに、保存されない計算列を含めることができます。Starting with SQL Server 2017, a clustered columnstore index can contain a non-persisted computed column. ただし、SQL Server 2017 では、クラスター化列ストア インデックスに、保存される計算列を含めることができません。計算列で非クラスター化インデックスを作成することはできません。However, in SQL Server 2017, clustered columnstore indexes cannot contain persisted computed columns, and you cannot created nonclustered indexes on computed columns.
  • ページと行の圧縮、vardecimal ストレージ形式 (列ストア インデックスは既に別の形式で圧縮されているため)。Page and row compression, and vardecimal storage format (A columnstore index is already compressed in a different format.)
  • のレプリケーションReplication
  • FilestreamFilestream

クラスター化列ストア インデックスを使用しているテーブルでは、カーソルやトリガーは使用できません。You cannot use cursors or triggers on a table with a clustered columnstore index. この制限は、非クラスター化列ストア インデックスには適用されません。非クラスター化列ストア インデックスを使用しているテーブルでは、カーソルとトリガーを使用できます。This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

SQL Server 2014 (12.x)SQL Server 2014 (12.x) に固有の制限事項 SQL Server 2014 (12.x)SQL Server 2014 (12.x) specific limitations
これらの制限は SQL Server 2014 (12.x)SQL Server 2014 (12.x) にのみ適用されます。These limitations apply only to SQL Server 2014 (12.x)SQL Server 2014 (12.x). このリリースでは、更新可能なクラスター化列ストア インデックスを導入しました。In this release, we introduced updateable clustered columnstore indexes. 非クラスター化列ストア インデックスは引き続き読み取り専用でした。Nonclustered columnstore indexes were still read-only.

  • 変更の追跡。Change tracking. 読み取り専用のため、非クラスター化列ストア インデックス (NCCI) で変更履歴を使用することはできません。You cannot use change tracking with nonclustered columnstore indexes (NCCI) because they are read-only. クラスター化列ストア インデックス (CCI) では機能します。It does work for clustered columnstore indexes (CCI).
  • 変更データ キャプチャ。Change data capture. 読み取り専用のため、非クラスター化列ストア インデックス (NCCI) に変更データ キャプチャを使用することはできません。You cannot use change data capture for nonclustered columnstore index (NCCI) because they are read-only. クラスター化列ストア インデックス (CCI) では機能します。It does work for clustered columnstore indexes (CCI).
  • 読み取り可能セカンダリ。Readable secondary. AlwaysOn 可用性グループの読み取り可能セカンダリからクラスター化列ストア インデックス (CCI) にアクセスすることはできません。You cannot access a clustered clustered columnstore index (CCI) from a readable secondary of an Always OnReadable availability group. 読み取り可能セカンダリから非クラスター化列ストア インデックス (NCCI) にアクセスできます。You can access a nonclustered columnstore index (NCCI) from a readable secondary.
  • 複数のアクティブな結果セット (MARS)。Multiple Active Result Sets (MARS). SQL Server 2014 (12.x)SQL Server 2014 (12.x) では、列ストア インデックスを含むテーブルに読み取り専用で接続するために、MARS が使用されます。 uses MARS for read-only connections to tables with a columnstore index. ただし、 SQL Server 2014 (12.x)SQL Server 2014 (12.x) では、列ストア インデックスを含むテーブルで DML (データ操作言語) を同時操作する場合、MARS を利用できません。However, SQL Server 2014 (12.x)SQL Server 2014 (12.x) does not support MARS for concurrent data manipulation language (DML) operations on a table with a columnstore index. この場合、 SQL ServerSQL Server は接続を強制終了し、トランザクションを中止します。When this occurs, SQL ServerSQL Server terminates the connections and aborts the transactions.

    列ストア インデックスのパフォーマンス上の利点と制限の詳細については、「列ストア インデックス - 概要」をご覧ください。For information about the performance benefits and limitations of columnstore indexes, see Columnstore Indexes Overview.

メタデータMetadata

列ストア インデックス内のすべての列は、付加列としてメタデータに格納されます。All of the columns in a columnstore index are stored in the metadata as included columns. 列ストア インデックスにキー列はありません。The columnstore index does not have key columns. 列ストア インデックスに関する情報は、次のシステム ビューによって提供されます。These system views provide information about columnstore indexes.

行ストア テーブルを列ストアに変換する例Examples for converting a rowstore table to columnstore

A.A. ヒープをクラスター化列ストア インデックスに変換するConvert a heap to a clustered columnstore index

この例では、テーブルをヒープとして作成してから、cci_Simple という名前のクラスター化 columnstore インデックスに変換します。This example creates a table as a heap and then converts it to a clustered columnstore index named cci_Simple. こうすることで、テーブル全体のストレージが行ストアから列ストアに変更されます。This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable(  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON SimpleTable;  
GO  

B.B. クラスター化インデックスを同じ名前のクラスター化列ストア インデックスに変換するConvert a clustered index to a clustered columnstore index with the same name.

この例では、クラスター化インデックスを持つテーブルを作成し、クラスター化インデックスをクラスター化列ストア インデックスに変換する構文を示します。This example creates a table with clustered index, and then demonstrates the syntax of converting the clustered index to a clustered columnstore index. こうすることで、テーブル全体のストレージが行ストアから列ストアに変更されます。This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON SimpleTable  
WITH (DROP_EXISTING = ON);  
GO  

C.C. 行ストア テーブルを列ストア インデックスに変換するときに、非クラスター化インデックスを処理します。Handle nonclustered indexes when converting a rowstore table to a columnstore index.

この例では、行ストア テーブルを列ストア インデックスに変換するときに、非クラスター化インデックスを処理する方法を示します。This example shows how to handle nonclustered indexes when converting a rowstore table to a columnstore index. 実際には、以降では、 SQL Server 2016 (13.x)SQL Server 2016 (13.x) 特別な操作は不要です。 SQL ServerSQL Server は新しいクラスター化列ストア インデックスで非クラスター化インデックスを自動的に定義し、再構築します。Actually, beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x) no special action is required; SQL ServerSQL Server automatically defines and rebuilds the nonclustered indexes on the new clustered columnstore index.

非クラスター化インデックスを削除する場合は、列ストア インデックスを作成する前に、DROP INDEX ステートメントを使用します。If you want to drop the nonclustered indexes, use the DROP INDEX statement prior to creating the columnstore index. DROP EXISTING オプションは、変換されるクラスター化インデックスのみを削除します。The DROP EXISTING option only drops the clustered index that is being converted. 非クラスター化インデックスは削除されません。It does not drop the nonclustered indexes.

SQL Server 2012 (11.x)SQL Server 2012 (11.x)SQL Server 2014 (12.x)SQL Server 2014 (12.x) では、列ストア インデックスで非クラスター化インデックスを作成できませんでした。In SQL Server 2012 (11.x)SQL Server 2012 (11.x) and SQL Server 2014 (12.x)SQL Server 2014 (12.x), you could not create a nonclustered index on a columnstore index. この例は、どのようにを列ストア インデックスを作成する前に、非クラスター化インデックスを削除する必要する以前のリリースで表示されます。This example shows how in previous releases you need to drop the nonclustered indexes before creating the columnstore index.

--Create the table for use with this example.  
CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
GO  

--Create two nonclustered indexes for use with this example  
CREATE INDEX nc1_simple ON SimpleTable (OrderDateKey);  
CREATE INDEX nc2_simple ON SimpleTable (DueDateKey);   
GO  

--SQL Server 2012 and SQL Server 2014: you need to drop the nonclustered indexes  
--in order to create the columnstore index.   

DROP INDEX SimpleTable.nc1_simple;  
DROP INDEX SimpleTable.nc2_simple;  

--Convert the rowstore table to a columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON SimpleTable;   
GO  

D.D. 大きいファクト テーブルを行ストアから列ストアに変換するConvert a large fact table from rowstore to columnstore

この例では、大きいファクト テーブルを行ストア テーブルから列ストア テーブルに変換する方法を説明します。This example explains how to convert a large fact table from a rowstore table to a columnstore table.

行ストア テーブルを列ストア テーブルに変換するには、次の手順に従います。To convert a rowstore table to a columnstore table.

  1. まず、この例で使用する小さいテーブルを作成します。First, create a small table to use in this example.

    --Create a rowstore table with a clustered index and a non-clustered index.  
    CREATE TABLE MyFactTable (  
        ProductKey [int] NOT NULL,  
        OrderDateKey [int] NOT NULL,  
         DueDateKey [int] NOT NULL,  
         ShipDateKey [int] NOT NULL )  
    )  
    WITH (  
        CLUSTERED INDEX ( ProductKey )  
    );  
    
    --Add a non-clustered index.  
    CREATE INDEX my_index ON MyFactTable ( ProductKey, OrderDateKey );  
    
  2. 行ストア テーブルからすべての非クラスター化インデックスを削除します。Drop all non-clustered indexes from the rowstore table.

    --Drop all non-clustered indexes  
    DROP INDEX my_index ON MyFactTable;  
    
  3. クラスター化インデックスを削除します。Drop the clustered index.

    • これは、クラスター化列ストア インデックスに変換されるときにインデックスに新しい名前を指定する場合にのみ行ってください。Do this only if you want to specify a new name for the index when it is converted to a clustered columnstore index. クラスター化インデックスを削除しない場合は、新しいクラスター化列ストア インデックスに同じ名前が付けられます。If you do not drop the clustered index, the new clustered columnstore index has the same name.

      注意

      インデックスの名前に自分の名前を使用すると記憶しやすくなります。The name of the index might be easier to remember if you use your own name. すべての行ストア クラスター化インデックスは、既定の名前である 'ClusteredIndex_<GUID>' を使用します。All rowstore clustered indexes use the default name which is 'ClusteredIndex_<GUID>'.

    --Process for dropping a clustered index.  
    --First, look up the name of the clustered rowstore index.  
    --Clustered rowstore indexes always use the DEFAULT name ‘ClusteredIndex_<GUID>’.  
    SELECT i.name   
    FROM sys.indexes i   
    JOIN sys.tables t  
    ON ( i.type_desc = 'CLUSTERED' ) WHERE t.name = 'MyFactTable';  
    
    --Drop the clustered rowstore index.  
    DROP INDEX ClusteredIndex_d473567f7ea04d7aafcac5364c241e09 ON MyDimTable;  
    
  4. 行ストア テーブルを、クラスター化列ストア インデックスを持つ列ストア テーブルに変換します。Convert the rowstore table to a columnstore table with a clustered columnstore index.

    --Option 1: Convert to columnstore and name the new clustered columnstore index MyCCI.  
    CREATE CLUSTERED COLUMNSTORE INDEX MyCCI ON MyFactTable;  
    
    --Option 2: Convert to columnstore and use the rowstore clustered   
    --index name for the columnstore clustered index name.  
    --First, look up the name of the clustered rowstore index.  
    SELECT i.name   
    FROM sys.indexes i  
    JOIN sys.tables t   
    ON ( i.type_desc = 'CLUSTERED' )  
    WHERE t.name = 'MyFactTable';  
    
    --Second, create the clustered columnstore index and   
    --Replace ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
    --with the name of your clustered index.  
    CREATE CLUSTERED COLUMNSTORE INDEX   
    ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
     ON MyFactTable  
    WITH DROP_EXISTING = ON;  
    

E.E. 列ストア テーブルをクラスター化インデックスを持つ行ストア テーブルに変換するConvert a columnstore table to a rowstore table with a clustered index

列ストア テーブルをクラスター化インデックスを持つ行ストア テーブルに変換するには、CREATE INDEX ステートメントと DROP_EXISTING オプションを使用します。To convert a columnstore table to a rowstore table with a clustered index, use the CREATE INDEX statement with the DROP_EXISTING option.

CREATE CLUSTERED INDEX ci_MyTable   
ON MyFactTable  
WITH ( DROP EXISTING = ON );  

F.F. 列ストア テーブルを行ストア ヒープに変換するConvert a columnstore table to a rowstore heap

列ストア テーブルを行ストア ヒープに変換するには、クラスター化列ストア インデックスを削除します。To convert a columnstore table to a rowstore heap, simply drop the clustered columnstore index.

DROP INDEX MyCCI   
ON MyFactTable;  

G.G. 全体のクラスター化列ストア インデックスを再構築での断片化を解消します。Defragment by rebuilding the entire clustered columnstore index

適用対象: SQL Server 2014 (12.x)SQL Server 2014 (12.x)Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x)

クラスター化列ストア インデックス全体を再構築するには、2 つの方法があります。There are two ways to rebuild the full clustered columnstore index. CREATE CLUSTERED COLUMNSTORE INDEX か ALTER INDEX (Transact-SQL) と REBUILD オプションを使用できます。You can use CREATE CLUSTERED COLUMNSTORE INDEX, or ALTER INDEX (Transact-SQL) and the REBUILD option. どちらの方法も、同じ結果が得られます。Both methods achieve the same results.

注意

SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降では、この例で説明した方法を使って再構築する代わりに、ALTER INDEX...REORGANIZE を使用します。Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), use ALTER INDEX...REORGANIZE instead of rebuilding with the methods described in this example.

--Determine the Clustered Columnstore Index name of MyDimTable.  
SELECT i.object_id, i.name, t.object_id, t.name   
FROM sys.indexes i   
JOIN sys.tables t  
ON (i.type_desc = 'CLUSTERED COLUMNSTORE')  
WHERE t.name = 'RowstoreDimTable';  

--Rebuild the entire index by using CREATE CLUSTERED INDEX.  
CREATE CLUSTERED COLUMNSTORE INDEX my_CCI   
ON MyFactTable  
WITH ( DROP_EXISTING = ON );  

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.  
ALTER INDEX my_CCI  
ON MyFactTable  
REBUILD PARTITION = ALL  
WITH ( DROP_EXISTING = ON );  

非クラスター化列ストア インデックスの例Examples for nonclustered columnstore indexes

A.A. 行ストア テーブルのセカンダリ インデックスとして列ストア インデックスを作成します。Create a columnstore index as a secondary index on a rowstore table

この例では、行ストア テーブルに非クラスター化列ストア インデックスを作成します。This example creates a nonclustered columnstore index on a rowstore table. このような状況では、1 つだけの列ストア インデックスを作成できます。Only one columnstore index can be created in this situation. 列ストア インデックスでは、行ストア テーブル内のデータのコピーが含まれているために、追加のストレージが必要です。The columnstore index requires extra storage since it contains a copy of the data in the rowstore table. この例では、単純なテーブルとクラスター化インデックスを作成し、非クラスター化列ストア インデックスを作成する構文を次に示します。This example creates a simple table and a clustered index, and then demonstrates the syntax of creating a nonclustered columnstore index.

CREATE TABLE SimpleTable  
(ProductKey [int] NOT NULL,   
OrderDateKey [int] NOT NULL,   
DueDateKey [int] NOT NULL,   
ShipDateKey [int] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey);  
GO  

B.B. すべてのオプションを使用して、単純な非クラスター化 columnstore インデックスを作成します。Create a simple nonclustered columnstore index using all options

次の例は、すべてのオプションを使用して非クラスター化列ストア インデックスを作成する構文を示しています。The following example demonstrates the syntax of creating a nonclustered columnstore index by using all options.

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey)  
WITH (DROP_EXISTING =  ON,   
    MAXDOP = 2)  
ON "default"  
GO  

パーティション テーブルを使用した、より複雑な例については、「列ストア インデックス - 概要」をご覧ください。For a more complex example using partitioned tables, see Columnstore Indexes Overview.

C.C. フィルター選択された述語で、非クラスター化列ストア インデックスを作成します。Create a nonclustered columnstore index with a filtered predicate

次の例では、 AdventureWorks2012AdventureWorks2012 データベースの Production.BillOfMaterials テーブルにフィルター選択された非クラスター化列ストア インデックスを作成します。The following example creates a filtered nonclustered columnstore 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.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithEndDate'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithEndDate  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"  
    ON Production.BillOfMaterials (ComponentID, StartDate)  
    WHERE EndDate IS NOT NULL;  

D.D. 非クラスター化列ストア インデックス内のデータを変更するChange the data in a nonclustered columnstore index

適用対象: SQL Server 2012 (11.x)SQL Server 2012 (11.x) から SQL Server 2014 (12.x)SQL Server 2014 (12.x)Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2014 (12.x)SQL Server 2014 (12.x).

テーブルに非クラスター化列ストア インデックスを作成すると、そのテーブル内のデータは変更できなくなります。Once you create a nonclustered columnstore index on a table, you cannot directly modify the data in that table. INSERT、UPDATE、DELETE、または MERGE を使用するクエリは失敗し、エラー メッセージが返されます。A query with INSERT, UPDATE, DELETE, or MERGE fails and returns an error message. テーブル内のデータを追加または変更するには、次のいずれかの操作を行います。To add or modify the data in the table, you can do one of the following:

  • 列ストア インデックスを無効にするか削除します。Disable or drop the columnstore index. その後、テーブル内のデータを更新できます。You can then update the data in the table. 列ストア インデックスを無効にすると、データの更新の終了時に列ストア インデックスを再構築できます。If you disable the columnstore index, you can rebuild the columnstore index when you finish updating the data. 例を次に示します。For example,

    ALTER INDEX mycolumnstoreindex ON mytable DISABLE;  
    -- update mytable --  
    ALTER INDEX mycolumnstoreindex on mytable REBUILD  
    
  • 列ストア インデックスのないステージング テーブルにデータを読み込みます。Load data into a staging table that does not have a columnstore index. ステージング テーブルで列ストア インデックスを構築します。Build a columnstore index on the staging table. ステージング テーブルをメイン テーブルの空のパーティションに切り替えます。Switch the staging table into an empty partition of the main table.

  • 列ストア インデックスを持つテーブルから空のステージング テーブルにパーティションを切り替えます。Switch a partition from the table with the columnstore index into an empty staging table. ステージング テーブルに列ストア インデックスがある場合は、列ストア インデックスを無効にします。If there is a columnstore index on the staging table, disable the columnstore index. 更新を実行します。Perform any updates. 列ストア インデックスを構築 (または再構築) します。Build (or rebuild) the columnstore index. ステージング テーブルを切り替えて、メイン テーブルの (空になった) パーティションに戻します。Switch the staging table back into the (now empty) partition of the main table.

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

A.A. クラスター化インデックスをクラスター化列ストア インデックスに変換するChange a clustered index to a clustered columnstore index

DROP_EXISTING = ON で CREATE CLUSTERED COLUMNSTORE INDEX ステートメントを使用すると、次のことができます。By using the CREATE CLUSTERED COLUMNSTORE INDEX statement with DROP_EXISTING = ON, you can:

  • クラスター化インデックスをクラスター化列ストア インデックスに変換します。Change a clustered index into a clustered columnstore index.

  • クラスター化列ストア インデックスを再構築します。Rebuild a clustered columnstore index.

    この例では、クラスター化インデックスを含む列ストア テーブルとして xDimProduct テーブルを作成し、CREATE CLUSTERED COLUMNSTORE INDEX を使用して行ストア テーブルから列ストア テーブルにテーブルを変更します。This example creates the xDimProduct table as a rowstore table with a clustered index, and then uses CREATE CLUSTERED COLUMNSTORE INDEX to change the table from a rowstore table to a columnstore table.

-- Uses AdventureWorks  

IF EXISTS (SELECT name FROM sys.tables  
    WHERE name = N'xDimProduct'  
    AND object_id = OBJECT_ID (N'xDimProduct'))  
DROP TABLE xDimProduct;  

--Create a distributed table with a clustered index.  
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)  
WITH ( DISTRIBUTION = HASH(ProductKey),  
    CLUSTERED INDEX (ProductKey) )  
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;  

--Change the existing clustered index   
--to a clustered columnstore index with the same name.  
--Look up the name of the index before running this statement.  
CREATE CLUSTERED COLUMNSTORE INDEX <index_name>   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

B.B. クラスター化列ストア インデックスを再構築するRebuild a clustered columnstore index

この例は先の例を元に作られています。CREATE CLUSTERED COLUMNSTORE INDEX を使用し、cci_xDimProduct という名前の既存のクラスター化列ストア インデックスを再構築します。Building on the previous example, this example uses CREATE CLUSTERED COLUMNSTORE INDEX to rebuild the existing clustered columnstore index called cci_xDimProduct.

--Rebuild the existing clustered columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

C.C. クラスター化列ストア インデックスの名前を変更するChange the name of a clustered columnstore index

クラスター化列ストア インデックスの名前を変更するには、既存のクラスター化列ストア インデックスを削除し、新しい名前でインデックスを再作成します。To change the name of a clustered columnstore index, drop the existing clustered columnstore index, and then recreate the index with a new name.

この操作は小規模のテーブルかからのテーブルでのみ行うことをお勧めします。We recommend only doing this operation with a small table or an empty table. 大規模なクラスター化列ストア インデックスを削除し、別の名前で再構築すると長い時間がかかります。It takes a long time to drop a large clustered columnstore index and rebuild with a different name.

この例では、先の例の cci_xDimProduct という名前のクラスター化列ストア インデックスを使用します。cci_xDimProduct を削除し、mycci_xDimProduct という名前で再作成します。Using the cci_xDimProduct clustered columnstore index from the previous example, this example drops the cci_xDimProduct clustered columnstore index and then recreates the clustered columnstore index with the name mycci_xDimProduct.

--For illustration purposes, drop the clustered columnstore index.   
--The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xDimProduct;  

--Create a clustered index with a new name, mycci_xDimProduct.  
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct  
ON xdimProduct  
WITH ( DROP_EXISTING = OFF );  

D.D. 列ストア テーブルをクラスター化インデックスを持つ行ストア テーブルに変換するConvert a columnstore table to a rowstore table with a clustered index

クラスター化列ストア インデックスを削除し、クラスター化インデックスを作成するという状況もあります。There might be a situation for which you want to drop a clustered columnstore index and create a clustered index. その場合、行ストア形式でテーブルを保存します。This stores the table in rowstore format. この例では、クラスター化インデックスが含まれる行ストア テーブルに列ストア テーブルを変換します。同じ名前が使用されます。This example converts a columnstore table to a rowstore table with a clustered index with the same name. データは何も失われません。None of the data is lost. すべてのデータが行ストア テーブルに入り、一覧の列はクラスター化インデックスのキー列になります。All data goes to the rowstore table and the columns listed becomes the key columns in the clustered index.

--Drop the clustered columnstore index and create a clustered rowstore index.   
--All of the columns are stored in the rowstore clustered index.   
--The columns listed are the included columns in the index.  
CREATE CLUSTERED INDEX cci_xDimProduct    
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)  
WITH ( DROP_EXISTING = ON);  

E.E. 列ストア テーブルを行ストア ヒープに戻すConvert a columnstore table back to a rowstore heap

DROP INDEX (SQL Server PDW) を使用し、クラスター化列ストア インデックスを削除し、テーブルを行ストア ヒープに変換します。Use DROP INDEX (SQL Server PDW) to drop the clustered columnstore index and convert the table to a rowstore heap. この例では、cci_xDimProduct テーブルを行ストア ヒープに変換します。This example converts the cci_xDimProduct table to a rowstore heap. テーブルは引き続き配布されますが、ヒープとして保存されます。The table continues to be distributed, but is stored as a heap.

--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xdimProduct;