次の方法で共有


CREATE COLUMNSTORE INDEX (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric SQL Database

行ストア テーブルをクラスター化列ストア インデックスに変換するか、非クラスター化列ストア インデックスを作成します。 列ストア インデックスを使用して、OLTP ワークロードでリアルタイムの運用分析を効率的に実行したり、データ ウェアハウス ワークロードのデータ圧縮とクエリのパフォーマンスを向上させたりします。

この機能の最新の機能強化については、 列ストア インデックスの新機能 に従ってください。

  • 順序付けされたクラスター化列ストア インデックスは、SQL Server 2022 (16.x) で導入されました。 詳細については、「 CREATE COLUMNSTORE INDEX」を参照してください。 順序付けされた列ストア インデックスの可用性については、「列ストア インデックスの : 概要」を参照してください。

  • SQL Server 2016 (13.x) 以降では、クラスター化列ストア インデックスとしてテーブルを作成できます。 最初に行ストア テーブルを作成してから、クラスター化列ストア インデックスに変換する必要はなくなりました。

  • 列ストア インデックスの設計ガイドラインについては、「 列ストア インデックス - 設計ガイダンス」を参照してください。

Transact-SQL 構文表記規則

構文

Azure SQL Database と Azure SQL Managed InstanceAUTD の構文:

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

-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ]  COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ , ...n ] )
    [ ORDER (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 )

SQL Server の構文:

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

-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ]  COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ , ...n ] )
    [ ORDER (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 )

Azure Synapse Analytics および Analytics Platform System (PDW) の構文:

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

バージョンの可用性

一部のオプションは、一部のデータベース エンジン バージョンでは使用できません。 次の表は、クラスター化列ストア インデックスと非クラスター化列ストア インデックスでオプションが導入された場合のバージョンを示しています。

選択肢 クラスタ化された NONCLUSTERED
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
データ圧縮 SQL Server 2016 (13.x) SQL Server 2016 (13.x)
オンライン SQL Server 2019 (15.x) SQL Server 2017 (14.x)
WHERE 句 なし SQL Server 2016 (13.x)
ORDER 句 SQL Server 2016 (13.x) SQL Server 2025 (17.x) プレビュー

すべてのオプションは、Azure SQL Database と Azure SQL Managed InstanceAUTD で使用できます。

機能の可用性の詳細については、「 列ストア インデックスの新機能」を参照してください。

論争

クラスター化列ストア インデックスの作成

すべてのデータが列によって圧縮および格納されるクラスター化列ストア インデックスを作成します。 インデックスにはテーブル内のすべての列が含まれており、テーブル全体が格納されます。 既存のテーブルがヒープまたはクラスター化インデックスの場合は、クラスター化列ストア インデックスに変換されます。 テーブルが既にクラスター化列ストア インデックスとして格納されている場合、既存のインデックスは削除され、再構築されます。

重要

Fabric の SQL データベースでは、クラスター化列ストア インデックスは、それが属するテーブルと同じバッチまたはトランザクション内に作成する必要があります。 クラスター化列ストア インデックスを既に作成した後にテーブルに追加すると、次のエラーが発生する可能性があります。

Msg 35354, Level 16, State 1, Line 63, The statement failed because a clustered columnstore index cannot be created on a table enabled for Change Feed. Consider disabling Change Feed and then creating the clustered columnstore index.

index_name

新しいインデックスの名前を指定します。

テーブルに既にクラスター化列ストア インデックスがある場合は、既存のインデックスと同じ名前を指定するか、DROP EXISTING オプションを使用して新しい名前を指定できます。

ON [ database_name。 [ schema_name ] . | schema_name . ] table_name

クラスター化列ストア インデックスとして格納するテーブルの 1 部、2 部、または 3 部構成の名前を指定します。 テーブルがヒープであるか、クラスター化インデックスがある場合、テーブルは行ストアから列ストアに変換されます。 テーブルが既に列ストアである場合、このステートメントはクラスター化列ストア インデックスを再構築します。

クラスター化列ストアの ORDER

クラスター化列ストア インデックスの列の順序を決定するには、column_store_order_ordinal列を使用します。 列ストアの順序付けは、 セグメントの削除 (特に文字列データ) に役立ちます。 詳細については、「 順序付き列ストア インデックスと列ストア インデックスを使用したパフォーマンスチューニング- 設計ガイダンス」を参照してください。

順序付けされたクラスター化列ストア インデックスに変換するには、既存のインデックスがクラスター化列ストア インデックスである必要があります。 DROP_EXISTING オプションを使用します。

LOB データ型 (最大) 長のデータ型は、順序付けされたクラスター化列ストア インデックスのキーにすることはできません。

順序付けされたクラスター化列ストア インデックスを作成する場合は、MAXDOP = 1 ステートメントの継続時間が大幅に長くなるのと引き換えに、最高品質の並べ替えに CREATE INDEX オプションを使用します。 インデックスをできるだけ早く作成するには、MAXDOP を制限しないでください。 圧縮と並べ替えの品質が最も高い場合は、列ストア インデックスに対するクエリが役立ちます。

順序付けされた列ストア インデックスの可用性については、「列ストア インデックスの : 概要」を参照してください。

WITH オプション

DROP_EXISTING = [OFF] |オン

DROP_EXISTING = ON は、既存のインデックスを削除し、新しい列ストア インデックスを作成することを指定します。

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (DROP_EXISTING = ON);

既定値の DROP_EXISTING = OFF は、インデックス名が既存の名前と同じである必要があります。 指定したインデックス名が既に存在する場合は、エラーが発生します。

MAXDOP = max_degree_of_parallelism

このオプションは、インデックス操作中に、既存の並列処理サーバー構成の最大次数をオーバーライドできます。 MAXDOP を使用して、並列プランの実行で使用されるプロセッサの数を制限します。 最大は 64 プロセッサです。

max_degree_of_parallelism 値は次のようになります。

  • 1 は、並列プランの生成を抑制することを意味します。
  • >1 は、現在のシステム ワークロードに基づいて、並列インデックス操作で使用されるプロセッサの最大数を指定した数以下に制限することを意味します。 たとえば、MAXDOP = 4 の場合、使用されるプロセッサの数は 4 以下です。
  • 0 (既定値)。つまり、現在のシステム ワークロードに基づいて、実際のプロセッサ数以下を使用します。
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

詳細については、「 サーバー構成: 並列処理の最大限度」および「 並列インデックス操作の構成」を参照してください

COMPRESSION_DELAY = 0 | delay [ MINUTES ]

ディスク ベースのテーブルの場合、 遅延 は、閉じた状態のデルタ行グループがデルタ行グループに残る必要がある最小分数を指定します。 その後、SQL Server は圧縮された行グループに圧縮できます。 ディスク ベースのテーブルは個々の行の挿入と更新の時間を追跡しないため、SQL Server は、閉じた状態のデルタ行グループに遅延を適用します。

既定値は、0 分です。

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( COMPRESSION_DELAY = 10 MINUTES );

COMPRESSION_DELAYを使用するタイミングに関する推奨事項については、 リアルタイムの運用分析に関する Columnstore の概要に関するページを参照してください。

DATA_COMPRESSION = COLUMNSTORE |COLUMNSTORE_ARCHIVE

指定したテーブル、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。 オプションは次のとおりです。

  • COLUMNSTORE は既定値であり、最もパフォーマンスの高い列ストア圧縮で圧縮するように指定します。 このオプションが一般的な選択肢です。
  • COLUMNSTORE_ARCHIVE では、テーブルまたはパーティションがさらに小さいサイズに圧縮されます。 このオプションは、アーカイブなどの場合に使用します。この場合は、ストレージ サイズを小さくする必要があり、ストレージと取得の時間を増やすことができます。
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

圧縮の詳細については、「データ圧縮」を参照してください。

ONLINE = [ON |OFF]
  • ON は、インデックスの新しいコピーが作成されている間、列ストア インデックスがオンラインのままで使用可能であることを指定します。
  • OFF は、新しいコピーのビルド中にインデックスを使用できないことを指定します。
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

ON オプション

これらのオプションを使用すると、パーティション構成、特定のファイル グループ、既定のファイル グループなど、データ ストレージのオプションを指定できます。 ON オプションが指定されていない場合、インデックスは既存のテーブルの設定パーティションまたはファイル グループ設定を使用します。

partition_scheme_name ( column_name ) は、テーブルのパーティション構成を指定します。 パーティション構成は、データベースに既に存在している必要があります。 パーティション構成を作成するには、 CREATE PARTITION SCHEME (Transact-SQL) を参照してください。

column_name では、パーティション インデックスをパーティション分割する対象の列を指定します。 この列は、partition_scheme_name で使用されているパーティション関数の引数のデータ型、長さ、有効桁数に一致する必要があります。

filegroup_name は、クラスター化列ストア インデックスを格納するためのファイル グループを指定します。 場所が指定されておらず、テーブルがパーティション分割されていない場合、インデックスは基になるテーブルまたはビューと同じファイル グループを使用します。 ファイル グループは既に存在している必要があります。

既定のファイル グループにインデックスを作成するには、 "default" または [default]を使用します。 "default"を指定する場合は、現在のセッションに対して QUOTED_IDENTIFIER オプションをONする必要があります。 QUOTED_IDENTIFIER は既定では ON です。 詳細については、「 SET QUOTED_IDENTIFIER (Transact-SQL)」を参照してください。

CREATE [NONCLUSTERED] COLUMNSTORE INDEX

ヒープまたはクラスター化インデックスとして格納されている行ストア テーブルに非クラスター化列ストア インデックスを作成します。 インデックスはフィルター処理された条件を持つ可能性があり、基になるテーブルのすべての列を含める必要はありません。 列ストア インデックスには、データのコピーを格納するのに十分な領域が必要です。 インデックスは更新でき、基になるテーブルが変更されると更新されます。 クラスター化インデックスの非クラスター化列ストア インデックスを使用すると、リアルタイム分析が可能になります。

index_name

インデックスの名前を指定します。 index_name テーブル内で一意である必要がありますが、データベース内で一意である必要はありません。 インデックス名は 、識別子の規則に従う必要があります。

( column [ ,...n ] )

格納する列を指定します。 非クラスター化列ストア インデックスは、1,024 列に制限されています。

各列は、列ストア インデックスでサポートされているデータ型である必要があります。 サポートされているデータ型の一覧については、「 制限事項と制限 事項」を参照してください。

ON [ database_name。 [ schema_name ] . | schema_name . ] table_name

インデックスを含むテーブルの 1 部、2 部、または 3 部構成の名前を指定します。

非クラスター化列ストアの ORDER

非クラスター化列ストア インデックスの ORDER 句で指定する列は、インデックスのキー列のサブセットである必要があります。

非クラスター化列ストア インデックスの列の順序を決定するには、column_store_order_ordinal列を使用します。 列ストアの順序付けは、 セグメントの削除 (特に文字列データ) に役立ちます。 詳細については、「 順序付き列ストア インデックスと列ストア インデックスを使用したパフォーマンスチューニング- 設計ガイダンス」を参照してください。 これらの記事の設計とパフォーマンスに関する考慮事項は、通常、クラスター化列ストア インデックスと非クラスター化列ストア インデックスの両方に適用されます。

LOB データ型 (最大) 長のデータ型は、順序付けられた非クラスター化列ストア インデックスのキーにすることはできません。

順序付けされた非クラスター化列ストア インデックスを作成する場合は、MAXDOP = 1 ステートメントの期間が大幅に長くなるのと引き換えに、最高品質の並べ替えにCREATE INDEX オプションを使用します。 インデックスをできるだけ早く作成するには、 MAXDOPを制限しないでください。 圧縮と並べ替えの品質が最も高い場合は、列ストア インデックスに対するクエリが役立ちます。

順序付け列ストア インデックスの可用性については、「 順序付き列インデックスの可用性」を参照してください。

WITH オプション

DROP_EXISTING = [OFF] |オン

DROP_EXISTING = ON 既存のインデックスが削除され、再構築されます。 指定するインデックス名は、現在既存のインデックスと同じである必要があります。ただし、インデックス定義は変更できます。 たとえば、さまざまな列やインデックス オプションを指定できます。

DROP_EXISTING = OFF
指定したインデックス名が既に存在する場合は、エラーが表示されます。 DROP_EXISTINGを使用してインデックスの種類を変更することはできません。 下位互換性のある構文では、WITH DROP_EXISTINGは WITH DROP_EXISTING = ON と同じです。

MAXDOP = max_degree_of_parallelism

インデックス操作中に サーバー構成の max degree of parallelism 構成オプションをオーバーライドします。 MAXDOP を使用して、並列プランの実行で使用されるプロセッサの数を制限します。 最大は 64 プロセッサです。

max_degree_of_parallelism 値は次のようになります。

  • 1 は、並列プランの生成を抑制することを意味します。
  • >1 は、現在のシステム ワークロードに基づいて、並列インデックス操作で使用されるプロセッサの最大数を指定した数以下に制限することを意味します。 たとえば、MAXDOP = 4 の場合、使用されるプロセッサの数は 4 以下です。
  • 0 (既定値)。これは、現在のシステム ワークロードに基づいて実際のプロセッサ数以下を使用することを意味します。

詳細については、「 並列インデックス操作の構成」を参照してください。

並列インデックス操作は、Microsoft SQL Server のすべてのエディションで使用できるわけではありません。 SQL Server の各エディションでサポートされる機能の一覧については、「SQL Server 2022 の各エディションとサポートされている機能」を参照してください。

ONLINE = [ON |OFF]
  • ON は、インデックスの新しいコピーが作成されている間、列ストア インデックスがオンラインのままで使用可能であることを指定します。
  • OFF は、新しいコピーのビルド中にインデックスを使用できないことを指定します。 非クラスター化インデックスでは、ベース テーブルは引き続き使用できます。 新しいインデックスが完了するまで、非クラスター化列ストア インデックスのみがクエリを満たすために使用されません。
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ MINUTES ]

行を圧縮された行グループに移行する前に、デルタ行グループに保持する期間の下限を指定します。 たとえば、行が 120 分間変更されていない場合、その行は列形式のストレージ形式に圧縮される可能性があるとします。

ディスク ベース テーブルの列ストア インデックスの場合、行が挿入または更新された時刻は追跡されません。 代わりに、デルタ行グループの閉じた時刻が行のプロキシとして使用されます。 既定の期間は 0 分です。 行は、デルタ行グループに 100 万行が蓄積され、閉じられたとマークされた後に、列ストレージに移行されます。

データ圧縮

指定したテーブル、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。 非クラスター化インデックスとクラスター化インデックスの両方を含む列ストア インデックスにのみ適用されます。 オプションは次のとおりです。

  • COLUMNSTORE は既定値であり、最もパフォーマンスの高い列ストア圧縮で圧縮するように指定します。 このオプションが一般的な選択肢です。
  • COLUMNSTORE_ARCHIVE では、テーブルまたはパーティションがさらに小さいサイズに圧縮されます。 このオプションは、アーカイブに使用することも、ストレージ サイズを小さくする必要があり、ストレージと取得の時間を増やす必要がある場合にも使用できます。

圧縮の詳細については、「データ圧縮」を参照してください。

WHERE <filter_expression> [ AND <filter_expression> ]

フィルター述語と呼ばれるこのオプションは、インデックスに含める行を指定します。 SQL Server は、フィルター選択されたインデックス内のデータ行に対してフィルター選択された統計を作成します。

フィルター述語では、単純な比較ロジックが使用されます。 NULLリテラルを使用する比較は、比較演算子では使用できません。 代わりに、 IS NULL 演算子と IS NOT NULL 演算子を使用します。

Production.BillOfMaterials テーブルのフィルター述語の例を次に示します。

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

フィルター選択されたインデックスのガイダンスについては、「 フィルター選択されたインデックスの作成」を参照してください。

ON オプション

次のオプションでは、インデックスを作成するファイル グループを指定します。

partition_scheme_name ( column_name )

パーティション インデックスのパーティションがマップされるファイル グループを定義するパーティション構成を指定します。 パーティション構成は、 CREATE PARTITION SCHEME を実行してデータベース内に存在する必要があります。

column_name では、パーティション インデックスをパーティション分割する対象の列を指定します。 この列は、partition_scheme_name で使用されているパーティション関数の引数のデータ型、長さ、有効桁数に一致する必要があります。 column_name は、インデックス定義で指定されている列に限定されません。 列ストア インデックスをパーティション分割するときに、データベース エンジンはパーティション分割列をインデックスの列として追加します (まだ指定されていない場合)。

テーブルがパーティション分割されていて、 partition_scheme_name または ファイル グループ が指定されていない場合、インデックスは同じパーティション構成に配置され、基になるテーブルと同じパーティション分割列が使用されます。

パーティション テーブルの列ストア インデックスは、パーティションアラインされている必要があります。 インデックスのパーティション分割の詳細については、「 パーティション テーブルとパーティション インデックス」を参照してください。

filegroup_name

インデックスを作成するファイル グループ名を指定します。 filegroup_nameが指定されておらず、テーブルがパーティション分割されていない場合、インデックスは基になるテーブルと同じファイル グループを使用します。 ファイル グループは既に存在している必要があります。

デフォルト

指定したインデックスを既定のファイル グループに作成します。

このコンテキストでは、default という用語はキーワードではありません。 これは既定のファイル グループの識別子であり、 ON "default"ON [default]のように区切る必要があります。 "default"を指定した場合、現在のセッションの QUOTED_IDENTIFIER オプションは ON である必要があります。これは既定の設定です。 詳細については、「SET QUOTED_IDENTIFIER」を参照してください。

権限

テーブルに対する ALTER 権限が必要です。

注釈

一時テーブルに列ストア インデックスを作成できます。 テーブルが削除されるか、セッションが終了すると、インデックスも削除されます。

Fabric SQL データベースでは、クラスター化列ストア インデックスを持つテーブルは Fabric OneLake にミラー化されません。

フィルター選択されたインデックス

フィルター選択されたインデックスは、最適化された非クラスター化インデックスであり、テーブルから少数の行を選択するクエリに適しています。 フィルター述語を使用して、テーブル内のデータの一部のインデックスを作成します。 適切に設計されたフィルターインデックスを使用すると、クエリのパフォーマンスを向上させ、ストレージ コストを削減し、メンテナンス コストを削減できます。

フィルター選択されたインデックスに必要な SET オプション

次のいずれかの条件が発生するたびに、必要な値列の SET オプションが必要です。

  • フィルター選択されたインデックスを作成します。
  • INSERT、UPDATE、DELETE、または MERGE 操作は、フィルター選択されたインデックス内のデータを変更します。
  • クエリ オプティマイザーは、フィルター選択されたインデックスを使用してクエリ プランを生成します。
設定オプション 必須の値 既定のサーバー値 既定の OLE DB と ODBC 値 既定の DB-Library 値
ANSI_NULLS(データベースにおけるNULL値の扱いを規定する設定) オン オン オン オフ
ANSI_PADDING (ANSIのパディング) オン オン オン オフ
ANSI_WARNINGS 1 オン オン オン オフ
アリスアボート オン オン オフ オフ
CONCAT_NULL_YIELDS_NULL(NULL値を連結する場合の動作を設定) オン オン オン オフ
数値丸め中止 オフ オフ オフ オフ
QUOTED_IDENTIFIER(引用された識別子) オン オン オン オフ

1 ANSI_WARNINGSを ON に設定すると、データベース互換性レベルが 90 以降に設定されている場合、ARITHABORT は暗黙的に ON に設定されます。 データベース互換性レベルが 80 以前に設定されている場合は、ARITHABORT オプションを ON に明示的に設定する必要があります。

SET オプションが正しくない場合は、次の条件が発生する可能性があります。

  • フィルター選択されたインデックスは作成されません。

  • データベース エンジンはエラーを生成し、インデックス内のデータを変更する INSERT、UPDATE、DELETE、または MERGE ステートメントをロールバックします。

  • クエリ オプティマイザーでは、Transact-SQL ステートメントの実行プラン内のインデックスは考慮されません。

フィルター選択されたインデックスの詳細については、「 フィルター選択されたインデックスの作成」を参照してください。

制限事項と制約事項

列ストア インデックスの各列は、次の一般的なビジネス データ型のいずれかである必要があります。

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datetime
  • smalldatetime (スモールデイトタイム)
  • 日付
  • time [ ( n ) ]
  • float [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]
  • お金
  • スモールマネー
  • ビギント
  • int
  • smallint (スモールイント)
  • tinyint
  • ビット
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • varbinary [ ( n ) ]
  • varbinary(max)1
  • binary [ ( n ) ]
  • uniqueidentifier2

1 SQL Server 2017 (14.x)、および Azure SQL Database (Premium レベル、Standard レベル (S3 以降)、およびすべての仮想コア オファリング層 (クラスター化列ストア インデックスのみ) に適用されます。

2 SQL Server 2014 (12.x) 以降のバージョンに適用されます。

基になるテーブルに列ストア インデックスでサポートされていないデータ型の列がある場合は、非クラスター化列ストア インデックスからその列を省略する必要があります。

8 KB を超えるラージ オブジェクト (LOB) データは、列セグメント内に格納されている物理的な場所へのポインターだけで、行外の LOB ストレージに格納されます。 格納されているデータのサイズは、 sys.column_store_segmentssys.column_store_dictionaries、または sys.dm_db_column_store_row_group_physical_statsでは報告されません。

次のいずれかのデータ型を使用する列を列ストア インデックスに含めることはできません。

  • ntexttext、および image
  • nvarchar(max)varchar(max)varbinary(max)1
  • rowversion (および タイムスタンプ)
  • sql_variant
  • CLR 型 (hierarchyid 型と空間型)
  • xml
  • uniqueidentifier2

1 SQL Server 2016 (13.x) 以前のバージョン、および非クラスター化列ストア インデックスに適用されます。

2 SQL Server 2012 (11.x) に適用されます。

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

  • 1,024 列を超えることはできません。
  • 制約ベースのインデックスとして作成することはできません。 列ストア インデックスを持つテーブルに対して、一意の制約、主キー制約、および外部キー制約を持つことができます。 制約は常に行ストア インデックスで適用されます。 列ストア (クラスター化または非クラスター化) インデックスでは制約を適用できません。
  • スパース列を含めることはできません。
  • ALTER INDEX ステートメントを使用して変更することはできません。 非クラスター化インデックスを変更するには、代わりに列ストア インデックスを削除して再作成する必要があります。 ALTER INDEX を使用して、列ストア インデックスを無効にして再構築できます。
  • INCLUDE キーワードを使用して作成することはできません。
  • インデックス列の一覧に ASC キーワードまたは DESC キーワードを指定できません。 列ストア インデックスは、圧縮アルゴリズムに従って順序付けられます。
  • Azure SQL Database では、Microsoft Fabric の SQL データベース、Azure SQL Managed InstanceAUTD、SQL Server 2025 (17.x) プレビューは、 ORDER 句を含めることで並べ替えることができます。 詳細については、「順序付き列ストア インデックスを使用したパフォーマンスチューニング」を参照してください。
  • 非クラスター化列ストア インデックスに nvarchar(max)varchar(max)varbinary(max) 型の LOB 列を含めることはできません。 SQL Server 2017 (14.x) バージョン、Azure SQL Database (Premium レベル、Standard レベル (S3 以降)、およびすべての仮想コア オファリングレベルで構成) 以降、LOB の種類をサポートするのはクラスター化列ストア インデックスのみです。 以前のバージョンでは、クラスター化列ストア インデックスと非クラスター化列ストア インデックスの LOB 型はサポートされていません。
  • SQL Server 2016 (13.x) 以降では、インデックス付きビューに非クラスター化列ストア インデックスを作成できます。

列ストア インデックスを次の機能と組み合わせることはできません。

  • 計算列。 SQL Server 2017 (14.x) 以降では、クラスター化列ストア インデックスに非永続化計算列を含めることができます。 ただし、SQL Server 2017 (14.x) では、クラスター化列ストア インデックスに保存された計算列を含めることはできません。また、計算列に非クラスター化インデックスを作成することはできません。
  • ページと行の圧縮、および vardecimal ストレージ形式。 (列ストア インデックスは既に別の形式で圧縮されています)。
  • クラスター化列ストア インデックスを使用したレプリケーション。 非クラスター化列ストア インデックスがサポートされています。 詳細については、「sp_addarticle」 参照してください。
  • Filestream。

クラスター化列ストア インデックスを持つテーブルでカーソルやトリガーを使用することはできません。 この制限は、非クラスター化列ストア インデックスには適用されません。 非クラスター化列ストア インデックスを持つテーブルでカーソルとトリガーを使用できます。

SQL Server 2014 (12.x) 固有の制限事項:

次の制限は、SQL Server 2014 (12.x) にのみ適用されます。 このリリースでは、更新可能なクラスター化列ストア インデックスを使用できます。 非クラスター化列ストア インデックスは引き続き読み取り専用です。

  • 変更の追跡。 列ストア インデックスでは変更の追跡を使用できません。
  • データ キャプチャを変更します。 この機能は、クラスター化列ストア インデックスを持つテーブルでは有効にできません。 SQL Server 2016 (13.x) 以降では、非クラスター化列ストア インデックスを持つテーブルで変更データ キャプチャを有効にできます。
  • 読み取り可能なセカンダリ。 Always On 読み取り可能可用性グループの読み取り可能なセカンダリからクラスター化列ストア インデックス (CCI) にアクセスすることはできません。 読み取り可能なセカンダリから非クラスター化列ストア インデックス (NCCI) にアクセスできます。
  • 複数のアクティブな結果セット (MARS)。 SQL Server 2014 (12.x) では、列ストア インデックスを持つテーブルへの読み取り専用接続にこの機能が使用されます。 ただし、SQL Server 2014 (12.x) では、列ストア インデックスを持つテーブルに対する同時データ操作言語 (DML) 操作では、この機能はサポートされていません。 この目的でこの機能を使用しようとすると、SQL Server は接続を終了し、トランザクションを取り消します。
  • 非クラスター化列ストア インデックスは、ビューまたはインデックス付きビューでは作成できません。

列ストア インデックスのパフォーマンス上の利点と制限については、「列ストア インデックス : 概要」を参照してください。

メタデータ

列ストア インデックス内のすべての列は、付加列としてメタデータに格納されます。 列ストア インデックスはキー列を持ちません。 次のシステム ビューは、列ストア インデックスに関する情報を提供します。

例: テーブルを行ストアから列ストアに変換する

A。 ヒープをクラスター化列ストア インデックスに変換する

この例では、テーブルをヒープとして作成し、 cci_Simpleという名前のクラスター化列ストア インデックスに変換します。 クラスター化列ストア インデックスを作成すると、テーブル全体のストレージが行ストアから列ストアに変更されます。

CREATE TABLE dbo.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 dbo.SimpleTable;
GO

B. クラスター化インデックスを同じ名前のクラスター化列ストア インデックスに変換する

この例では、クラスター化インデックスを持つテーブルを作成し、クラスター化インデックスをクラスター化列ストア インデックスに変換する構文を示します。 クラスター化列ストア インデックスを作成すると、テーブル全体のストレージが行ストアから列ストアに変更されます。

CREATE TABLE dbo.SimpleTable2 (
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable2 (ProductKey);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON dbo.SimpleTable2
WITH (DROP_EXISTING = ON);
GO

C. 行ストア テーブルを列ストア インデックスに変換するときに非クラスター化インデックスを処理する

この例では、行ストア テーブルを列ストア インデックスに変換するときに非クラスター化インデックスを処理する方法を示します。 SQL Server 2016 (13.x) 以降では、特別な操作は必要ありません。 SQL Server では、新しいクラスター化列ストア インデックスで非クラスター化インデックスが自動的に定義および再構築されます。

非クラスター化インデックスを削除する場合は、列ストア インデックスを作成する前に DROP INDEX ステートメントを使用します。 DROP EXISTING オプションは、変換されるクラスター化インデックスのみを削除します。 非クラスター化インデックスは削除されません。

SQL Server 2012 (11.x) と SQL Server 2014 (12.x) では、列ストア インデックスに非クラスター化インデックスを作成することはできません。

--Create the table for use with this example.
CREATE TABLE dbo.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 dbo.SimpleTable (OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable (DueDateKey);
GO

列ストア インデックスを作成するには、SQL Server 2012 (11.x) と SQL Server 2014 (12.x) の場合にのみ、非クラスター化インデックスを削除する必要があります。

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

D. 大きなファクト テーブルを行ストアから列ストアに変換する

この例では、大きなファクト テーブルを行ストア テーブルから列ストア テーブルに変換する方法について説明します。

  1. この例で使用する小さなテーブルを作成します。

    --Create a rowstore table with a clustered index and a nonclustered index.
    CREATE TABLE dbo.MyFactTable (
        ProductKey [INT] NOT NULL,
        OrderDateKey [INT] NOT NULL,
        DueDateKey [INT] NOT NULL,
        ShipDateKey [INT] NOT NULL
    INDEX IDX_CL_MyFactTable CLUSTERED  ( ProductKey )
    );
    
    --Add a nonclustered index.
    CREATE INDEX my_index ON dbo.MyFactTable ( ProductKey, OrderDateKey );
    
  2. 行ストア テーブルからすべての非クラスター化インデックスを削除します。 インデックスをスクリプト化して後で再作成することもできます

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. 行ストア テーブルを、クラスター化列ストア インデックスを持つ列ストア テーブルに変換します。

    まず、既存のクラスター化行ストア インデックスの名前を検索します。 手順 1 では、インデックスの名前を IDX_CL_MyFactTable に設定します。 インデックス名が指定されていない場合は、自動的に生成された一意のインデックス名が指定されました。 自動生成された名前は、次のサンプル クエリを使用して取得できます。

    SELECT i.object_id, i.name, t.object_id, t.name
    FROM sys.indexes i
    INNER JOIN sys.tables t ON i.object_id = t.object_id
    WHERE i.type_desc = 'CLUSTERED'
    AND t.name = 'MyFactTable';
    

    オプション 1: 既存のクラスター化インデックス IDX_CL_MyFactTableを削除し、 MyFactTable を列ストアに変換します。 新しいクラスター化列ストア インデックスの名前を変更します。

    --Drop the clustered rowstore index.
    DROP INDEX [IDX_CL_MyFactTable]
    ON dbo.MyFactTable;
    GO
    --Create a new clustered columnstore index with the name MyCCI.
    CREATE CLUSTERED COLUMNSTORE
    INDEX IDX_CCL_MyFactTable ON dbo.MyFactTable;
    GO
    

    オプション 2: 列ストアに変換し、既存の行ストア クラスター化インデックス名を再利用します。

    --Create the clustered columnstore index,
    --replacing the existing rowstore clustered index of the same name
    CREATE CLUSTERED COLUMNSTORE
    INDEX [IDX_CL_MyFactTable]
    ON dbo.MyFactTable
    WITH (DROP_EXISTING = ON);
    

E. クラスター化インデックスを使用して列ストア テーブルを行ストア テーブルに変換する

クラスター化インデックスを持つ行ストア テーブルに列ストア テーブルを変換するには、DROP_EXISTING オプションを指定して CREATE INDEX ステートメントを使用します。

CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable] ( ProductKey )
WITH ( DROP_EXISTING = ON );

F. 列ストア テーブルを行ストア ヒープに変換する

列ストア テーブルを行ストア ヒープに変換するには、クラスター化列ストア インデックスを削除します。 これは通常は推奨されませんが、用途が狭いものもあります。 ヒープの詳細については、「 ヒープ (クラスター化インデックスのないテーブル)」を参照してください。

DROP INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable];

G. 列ストア インデックスを再構成して最適化する

クラスター化列ストア インデックスを維持するには、2 つの方法があります。 SQL Server 2016 (13.x) 以降では、REBUILD の代わりに ALTER INDEX...REORGANIZE を使用します。 詳細については、「 列ストア インデックスの行グループ」を参照してください。 以前のバージョンの SQL Server では、DROP_EXISTING=ON または ALTER INDEX (Transact-SQL) と REBUILD オプションを使用して、CREATE CLUSTERED COLUMNSTORE INDEX を使用できます。 どちらの方法も同じ結果を得た。

まず、 MyFactTableでクラスター化列ストア インデックス名を決定します。

SELECT i.object_id, i.name, t.object_id, t.name
FROM sys.indexes i
INNER JOIN sys.tables t on i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
AND t.name = 'MyFactTable';

列ストア インデックスに対して REORGANIZE を実行して、断片化を削除します。

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
ON dbo.[MyFactTable]
REORGANIZE;

非クラスター化列ストア インデックスの例

A。 行ストア テーブルのセカンダリ インデックスとして列ストア インデックスを作成する

この例では、行ストア テーブルに非クラスター化列ストア インデックスを作成します。 この状況では、列ストア インデックスを 1 つだけ作成できます。 列ストア インデックスには、行ストア テーブル内のデータのコピーが含まれているため、追加のストレージが必要です。 この例では、単純なテーブルと行ストア クラスター化インデックスを作成し、非クラスター化列ストア インデックスを作成する構文を示します。

CREATE TABLE dbo.SimpleTable (
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO

CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable (ProductKey);
GO

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON dbo.SimpleTable (OrderDateKey, DueDateKey, ShipDateKey);
GO

B. すべてのオプションを使用して基本的な非クラスター化列ストア インデックスを作成する

次の例では、DEFAULT ファイル グループに非クラスター化列ストア インデックスを作成し、並列処理の最大度 (MAXDOP) を 2 として指定する構文を示します。

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

C. フィルター処理された述語を使用して非クラスター化列ストア インデックスを作成する

次の例では、Production.BillOfMaterials サンプル データベースのAdventureWorks2022 テーブルにフィルター処理された非クラスター化列ストア インデックスを作成します。 フィルター述語には、フィルター選択されたインデックスのキー列ではない列を含めることができます。 この例の述語は、 EndDate が 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. 非クラスター化列ストア インデックスのデータを変更する

適用対象: SQL Server 2012 (11.x) から SQL Server 2014 (12.x) まで。

SQL Server 2014 (12.x) 以前のバージョンでは、テーブルに非クラスター化列ストア インデックスを作成した後、そのテーブル内のデータを直接変更することはできません。 INSERT、UPDATE、DELETE、または MERGE を含むクエリが失敗し、エラー メッセージが返されます。 テーブル内のデータを追加または変更するために使用できるオプションを次に示します。

  • 列ストア インデックスを無効または削除します。 その後、テーブル内のデータを更新できます。 列ストア インデックスを無効にした場合は、データの更新が完了したときに列ストア インデックスを再構築できます。 例えば次が挙げられます。

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • 列ストア インデックスがないステージング テーブルにデータを読み込みます。 ステージング テーブルに列ストア インデックスを作成します。 ステージング テーブルをメイン テーブルの空のパーティションに切り替えます。

  • 列ストア インデックスを持つテーブルから空のステージング テーブルにパーティションを切り替えます。 ステージング テーブルに列ストア インデックスがある場合は、列ストア インデックスを無効にします。 すべての更新を実行します。 列ストア インデックスをビルド (または再構築) します。 ステージング テーブルをメイン テーブルの (現在は空の) パーティションに切り替えます。

例: Azure Synapse Analytics、Analytics Platform System (PDW)

A。 クラスター化インデックスをクラスター化列ストア インデックスに変更する

CREATE CLUSTERED COLUMNSTORE INDEX ステートメントを DROP_EXISTING = ON と共に使用すると、次のことができます。

  • クラスター化インデックスをクラスター化列ストア インデックスに変更します。

  • クラスター化列ストア インデックスを再構築します。

この例では、クラスター化インデックスを持つ行ストア テーブルとして xDimProduct テーブルを作成します。 次に、CREATE CLUSTERED COLUMNSTORE INDEX を使用して、テーブルを行ストア テーブルから列ストア テーブルに変更します。

-- 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;

sys.indexesを使用して、システム メタデータ内の新しいテーブルに対して自動的に作成されるクラスター化インデックスの名前を検索します。 例えば次が挙げられます。

SELECT i.object_id, i.name, t.object_id, t.name, i.type_desc
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
AND t.name = 'xdimProduct';

これで、次のことができます。

  1. 自動的に作成された名前を持つ既存のクラスター化列ストア インデックスを削除し、ユーザー定義名で新しいクラスター化列ストア インデックスを作成します。
  2. 既存のインデックスを削除し、クラスター化列ストア インデックスに置き換えます。 ClusteredIndex_1bd8af8797f7453182903cc68df48541など、システムによって生成された同じ名前を保持します。

例えば次が挙げられます。

--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541 on xdimProduct;
GO
CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
ON xdimProduct;
GO

--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
ON xdimProduct
WITH ( DROP_EXISTING = ON );
GO

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

前の例を基に、この例では CREATE CLUSTERED COLUMNSTORE INDEX を使用して、 cci_xDimProductと呼ばれる既存のクラスター化列ストア インデックスを再構築します。

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

C. クラスター化列ストア インデックスの名前を変更する

クラスター化列ストア インデックスの名前を変更するには、既存のクラスター化列ストア インデックスを削除してから、新しい名前でインデックスを再作成します。

この操作は、小さいテーブルまたは空のテーブルに制限することをお勧めします。 大規模なクラスター化列ストア インデックスを削除し、別の名前で再構築するには、長い時間がかかります。

この例では、前の例 cci_xDimProduct クラスター化列ストア インデックスを参照します。 この例では、 cci_xDimProduct クラスター化列ストア インデックスを削除し、 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. クラスター化インデックスを使用して列ストア テーブルを行ストア テーブルに変換する

クラスター化列ストア インデックスを削除し、クラスター化インデックスを作成する場合があります。 クラスター化列ストア インデックスを削除すると、テーブルは行ストア形式に変更されます。 次の使用例は、列ストア テーブルを、同じ名前のクラスター化インデックスを持つ行ストア テーブルに変換します。 いずれのデータも失われない。 すべてのデータが行ストア テーブルに移動し、一覧表示されている列がクラスター化インデックスのキー列になります。

--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. 列ストア テーブルを行ストア ヒープに変換する

DROP INDEX を使用してクラスター化列ストア インデックスを削除し、テーブルを行ストア ヒープに変換します。 次の使用例は、 cci_xDimProduct テーブルを行ストア ヒープに変換します。 テーブルは引き続き分散されますが、ヒープとして格納されます。

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

F. インデックスのないテーブルに順序付けされたクラスター化列ストア インデックスを作成する

順序指定されていない列ストア インデックスは、列リストを指定する必要なく、既定ですべての列を対象とします。 順序付き列ストア インデックスを使用すると、列の順序を指定できます。 リストにすべての列を含める必要はありません。

詳細については、「順序付き列ストア インデックスを使用したパフォーマンスチューニング」を参照してください。

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE);

G. クラスター化列ストア インデックスを順序付けされたクラスター化列ストア インデックスに変換する

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE)
WITH (DROP_EXISTING = ON);

H. 順序付けされたクラスター化列ストア インデックスの順序に列を追加する

列ストア インデックス内の列の順序を指定できます。 元の順序付けされたクラスター化列ストア インデックスは、 SHIPDATE 列でのみ並べ替えられました。 次の例では、 PRODUCTKEY 列を順序に追加します。 順序付けされた列ストア インデックスの可用性については、「列ストア インデックスの : 概要」を参照してください。

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE, PRODUCTKEY)
WITH (DROP_EXISTING = ON);

一 順序付き列の序数を変更する

元の順序付けされたクラスター化列ストア インデックスは、SHIPDATEPRODUCTKEYに並べ替えられました。 次の例では、順序をPRODUCTKEYSHIPDATEに変更します。 順序付けされた列ストア インデックスの可用性については、「列ストア インデックスの : 概要」を参照してください。

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (PRODUCTKEY,SHIPDATE)
WITH (DROP_EXISTING = ON);

J. 順序付けされたクラスター化列ストア インデックスを作成する

順序付けキーを使用してクラスター化列ストア インデックスを作成できます。 順序付けされたクラスター化列ストア インデックスを作成する場合は、クエリ ヒント MAXDOP = 1 を適用して、並べ替えの品質を最大限に高め、最短の期間にする必要があります。 順序付けされた列ストア インデックスの可用性については、「列ストア インデックスの : 概要」を参照してください。

CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI] ON dbo.FactResellerSalesPartCategoryFull
ORDER (EnglishProductSubcategoryName, EnglishProductName)
WITH (MAXDOP = 1, DROP_EXISTING = ON);