SQL Server のメモリ内列ストア インデックスは、列 ベースのデータ ストレージと列ベースのクエリ処理を使用してデータを格納および管理します。 列ストア インデックスは、主に一括読み込みと読み取り専用クエリを実行するデータ ウェアハウス ワークロードに適しています。 列ストア インデックスを使用して、従来の行指向ストレージに対して最大 10 倍のクエリ パフォーマンス の向上を実現し、圧縮されていないデータ サイズに対して最大 7 倍のデータ圧縮 を実現します。
注
クラスター化列ストア インデックスは、大規模なデータ ウェアハウスファクト テーブルを格納するための標準と見なされ、ほとんどのデータ ウェアハウス シナリオで使用されることを想定しています。 クラスター化列ストア インデックスは更新可能であるため、ワークロードは多数の挿入、更新、および削除操作を実行できます。
内容
基本情報
列ストア インデックスは、列ストアと呼ばれる列形式のデータ形式を使用してデータを格納、取得、管理するためのテクノロジです。 SQL Server では、クラスター化列ストア インデックスと非クラスター化列ストア インデックスの両方がサポートされます。 どちらも同じメモリ内列ストア テクノロジを使用しますが、目的とサポートする機能に違いがあります。
メリット
列ストア インデックスは、大きなデータ セットに対して分析を実行する読み取り専用クエリのほとんどに適しています。 多くの場合、これらはデータ ウェアハウス ワークロードのクエリです。 列ストア インデックスを使用すると、完全なテーブル スキャンを使用するクエリのパフォーマンスが高くなります。また、特定の値を検索してデータをシークするクエリには適していません。
列ストア インデックスの利点:
多くの場合、列のデータが似ているため、圧縮率が高くなります。
高い圧縮比率により、メモリ使用量が削減され、クエリのパフォーマンスが向上します。 さらに、SQL Server ではメモリ内でより多くのクエリ操作とデータ操作を実行できるため、クエリのパフォーマンスが向上する可能性があります。
バッチ モード実行と呼ばれる新しいクエリ実行メカニズムが SQL Server に追加され、CPU 使用率が大幅に削減されました。 バッチ モードの実行は、列ストア ストレージ形式と密接に統合され、最適化されています。 バッチ モードの実行は、ベクターベースまたはベクター化された実行と呼ばれることもあります。
クエリはテーブルから少数の列のみを選択することが多く、物理メディアからの合計 I/O を低減します。
列ストアのバージョン
SQL Server 2012、SQL Server 2012 Parallel Data Warehouse、SQL Server 2014 はすべて列ストア インデックスを使用して、一般的なデータ ウェアハウス クエリを高速化します。 SQL Server 2012 では、非クラスター化列ストア インデックスと、"バッチ" と呼ばれる単位でデータを処理するベクターベースのクエリ実行機能という 2 つの新機能が導入されました。SQL Server 2014 には、SQL Server 2012 と更新可能なクラスター化列ストア インデックスの機能があります。
主な特性
適用対象: SQL Server 2014 から SQL Server 2019 (15.x)。 |
SQL Server では、クラスター化列ストア インデックスとは、
Enterprise、Developer、Evaluation の各エディションで使用できます。
更新可能です。
テーブル全体のプライマリ ストレージ方法です。
キー列がありません。 すべての列は含まれる列です。
テーブルの唯一のインデックスです。 他のインデックスと組み合わせることはできません。
列ストア圧縮または列ストアアーカイブ圧縮を使用するように構成できます。
並べ替えられた順序で列を物理的に格納しません。 代わりに、圧縮とパフォーマンスを向上させるためにデータが格納されます。
適用対象: SQL Server 2012 から SQL Server 2019 (15.x)。 |
SQL Server では、非クラスタ化された列ストア インデックスの一種:
クラスター化インデックスまたはヒープ内の列のサブセットにインデックスを作成できます。 たとえば、頻繁に使用される列のインデックスを作成できます。
インデックスに列のコピーを格納するには、追加のストレージが必要です。
インデックスを再構築するか、パーティションのインとアウトを切り替えることで更新されます。挿入、更新、削除などの DML 操作を使用して更新することはできません。
テーブル上の他のインデックスと組み合わせることができます。
列ストアまたは列ストアのアーカイブ圧縮を使用するように構成できます。
並べ替えられた順序で列を物理的に格納しません。 代わりに、圧縮とパフォーマンスを向上させるためにデータが格納されます。 列ストア インデックスを作成する前にデータを事前に並べ替える必要はありませんが、列ストアの圧縮を向上させることができます。
主な概念と用語
ここでは、列ストア インデックスに関連する主な用語と概念について説明します。
列ストア インデックス列 ストア インデックスは、列ストア と呼ばれる列形式のデータ形式を使用してデータを格納、取得、および管理するためのテクノロジです。 SQL Server では、クラスター化列ストア インデックスと非クラスター化列ストア インデックスの両方がサポートされます。 どちらも同じメモリ内列ストア テクノロジを使用しますが、目的とサポートする機能に違いがあります。
columnstore 列ストア は、行と列を含むテーブルとして論理的に編成され、列ごとのデータ形式で物理的に格納されるデータです。
行ストア: 行ストア は、行と列を含むテーブルとして論理的に編成され、行方向のデータ形式で物理的に格納されるデータです。 これは、リレーショナル テーブル データを格納する従来の方法でした。
行グループと列セグメント 高パフォーマンスで高い圧縮率を実現するために、列ストア インデックスはテーブルを行グループと呼ばれる行のグループにスライスし、列ごとの方法で各行グループを圧縮します。 行グループ内の行の数は、圧縮率を向上させるために十分な大きさで、メモリ内操作のメリットを得るのに十分なサイズである必要があります。
行グループ 行グループ は、列ストア形式に同時に圧縮される行のグループです。
列セグメント 列セグメント は、行グループ内からのデータの列です。
通常、行グループには、行グループあたりの最大行数 (1,048,576 行) が含まれます。
それぞれの行グループには、テーブルの 1 つの列につき 1 つの列セグメントが含まれます。
それぞれの列セグメントは一緒に圧縮され、物理メディアに格納されます。
非クラスター化列ストア インデックス : 非クラスター化列ストア インデックス は、既存のクラスター化インデックスまたはヒープ テーブルで作成された読み取り専用インデックスです。 これには、テーブル内のすべての列までの列のサブセットのコピーが含まれています。 テーブルは読み取り専用ですが、非クラスター化列ストア インデックスが含まれています。
非クラスター化列ストア インデックスを使用すると、分析クエリを実行するための列ストア インデックスを作成すると同時に、元のテーブルに対して読み取り専用操作を実行できます。
クラスター化列ストア インデックス クラスター化列ストア インデックス は、テーブル全体の物理ストレージであり、テーブルの唯一のインデックスです。 クラスター化インデックスは更新可能です。 インデックスに対して挿入、削除、更新の操作を実行し、インデックスにデータを一括読み込みできます。
列セグメントの断片化を減らし、パフォーマンスを向上させるために、列ストア インデックスでは、一部のデータを一時的に行ストア テーブル (デルタストアと呼ばれます) に格納し、削除された行の ID の B ツリーを格納する場合があります。 デルタストア操作は内部で処理されます。 列ストア インデックスは、正しいクエリ結果を返すために、列ストアとデルタストアの両方からのクエリ結果を結合します。
deltastore クラスター化列ストア インデックスでのみ使用される デルタストア は、行数が列ストアに移動するのに十分な大きさになるまで行を格納する行ストア テーブルです。 デルタストアは、読み込みやその他の DML 操作のパフォーマンスを向上させるために、クラスター化列ストア インデックスと共に使用されます。
大規模な一括読み込みでは、行のほとんどがデルタストアを通らずに列ストアに直接移動します。 一括読み込みの最後にある行の数が少なすぎて、行グループの最小サイズ (102,400 行) を満たできないことがあります。 この場合、最後の行は列ストアではなくデルタストアに移動します。 102,400 行未満の小規模な一括読み込みでは、すべての行がデルタストアに直接移動します。
デルタストアが最大行数に達すると、デルタストアは閉じられます。 タプル移動プロセスでは、閉じた行グループがチェックされます。 閉じた行グループが見つかると、その行グループが圧縮され、列ストアに格納されます。
データの読み込み
非クラスター化列ストア インデックスへのデータの読み込み
非クラスター化列ストア インデックスにデータを読み込むには、まず、ヒープまたはクラスター化インデックスとして格納されている従来の行ストア テーブルにデータを読み込み、次に CREATE COLUMNSTORE INDEX (Transact-SQL) を使用して非クラスター化列ストア インデックスを作成します。
非クラスター化列ストア インデックスを持つテーブルは、インデックスが削除されるか無効になるまで読み取り専用です。 テーブルと非クラスター化列ストア インデックスを更新するには、パーティションを切り替えることができます。また、インデックスを無効にし、テーブルを更新してから、インデックスを再構築することもできます。
詳細については、「非クラスター化列ストア インデックスの使用」を参照してください。
クラスター化列ストア インデックスへのデータの読み込み
図が示すように、クラスター化列ストア インデックスにデータを読み込むには、SQL Server:
最大サイズの行グループを列ストアに直接挿入します。 データが読み込まれると、SQL Server は、先着順のデータ行を開いている行グループに割り当てます。
行グループの最大サイズに達すると、SQL Serverは:
行グループを CLOSED としてマークします。
デルタストアをバイパスします。
行グループを用いて列ストア圧縮で各列セグメントを圧縮します。
圧縮された各列セグメントを列ストアに物理的に格納します。
次のように、残りの行を列ストアまたはデルタストアに挿入します。
行数が行グループの要件あたりの最小行数を満たしている場合、行は列ストアに追加されます。
行数が行グループあたりの最小行数より少ない場合、行はデルタストアに追加されます。
デルタストア のタスクとプロセスの詳細については、「クラスター化列ストア インデックスの使用」を参照してください。
パフォーマンスに関するヒント
列ストア インデックスを並列に作成するのに十分なメモリを計画する
列ストア インデックスの作成は、メモリに制限がない限り既定で並列操作になります。 インデックスを並列で作成するには、インデックスを順次作成する場合よりも多くのメモリが必要です。 十分なメモリがある場合、列ストア インデックスの作成には、同じ列で B-Tree を構築する場合の約 1.5 倍の時間がかかります。
列ストア インデックスを作成するために必要なメモリは、列数、文字列型の列数、並列処理の最大限度 (DOP)、およびデータの特性によって異なります。 たとえば、テーブルの行数が 100 万行未満の場合、SQL Server は列ストア インデックスを作成するために 1 つのスレッドのみを使用します。
テーブルに 100 万行を超える行があるのに、SQL Server が MAXDOP を使用してインデックスを作成するのに十分な大きさのメモリ許可を取得できない場合、SQL Server は、使用可能なメモリ許可に収まるように、必要に応じて自動的に MAXDOP を減らします。 場合によっては、メモリが制限された状況でインデックスを構築できるように、DOP を 1 まで小さくする必要があります。
関連するタスクとトピック
非クラスター化列ストア インデックス
一般的なタスクについては、「 非クラスター化列ストア インデックスの使用」を参照してください。
ALTER INDEX (Transact-SQL) の REBUILD を実行する。
クラスター化カラムストアインデックス
一般的なタスクについては、「 クラスター化列ストア インデックスの使用」を参照してください。
ALTER INDEX (Transact-SQL) に REBUILD または REORGANIZE を指定します。
メタデータ
列ストア インデックス内のすべての列は、付加列としてメタデータに格納されます。 列ストア インデックスにキー列がありません。