クラスター化列ストア インデックスの使用
SQL Serverでクラスター化列ストア インデックスを使用するためのタスク。
列ストア インデックスの概要については、「 列ストア インデックスの説明」を参照してください。
クラスター化列ストア インデックスの詳細については、「クラスター化 列ストア インデックスの使用」を参照してください。
内容
クラスター化列ストア インデックスを作成する
クラスター化列ストア インデックスを作成するには、まず行ストア テーブルをヒープインデックスまたはクラスター化インデックスとして作成してから、 CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) ステートメントを使用してテーブルをクラスター化列ストア インデックスに変換します。 クラスター化 columnstore インデックスにクラスター化インデックスと同じ名前を付ける場合は、DROP_EXISTING オプションを使用します。
この例では、テーブルをヒープとして作成してから、cci_Simple という名前のクラスター化 columnstore インデックスに変換します。 こうすることで、テーブル全体のストレージが行ストアから列ストアに変更されます。
CREATE TABLE T1(
ProductKey [int] NOT NULL,
OrderDateKey [int] NOT NULL,
DueDateKey [int] NOT NULL,
ShipDateKey [int] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_T1 ON T1;
GO
その他の例については、「 CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL)」の「例」セクションを参照してください。
クラスター化 Columnstore インデックスの削除
DROP INDEX (Transact-SQL) ステートメントを使用して、クラスター化列ストア インデックスを削除します。 この操作は、インデックスを削除し、列ストア テーブルを行ストア ヒープに変換します。
クラスター化 Columnstore インデックスへのデータの読み込み
標準的な読み込み方法を使用して既存のクラスター化列ストア インデックスにデータを追加できます。 たとえば、bcp 一括読み込みツール、Integration Services、INSERT ..などです。SELECT では、すべてのデータをクラスター化列ストア インデックスに読み込むことができます。
クラスター化 columnstore インデックスでは、columnstore の列セグメントの断片化を防ぐためにデルタストアを活用します。
パーティション テーブルへの読み込み
パーティション分割されたデータの場合、 SQL Server はまずパーティションに各行を割り当て、次にパーティション内のデータの columnstore 処理を実行します。 各パーティションには、独自の行グループと少なくとも 1 つのデルタストアがあります。
デルタストアの読み込みのシナリオ
デルタストアの行は、行グループに許容されている最大行数になるまで蓄積されます。 デルタストアに行グループあたりの最大行数が含まれている場合、SQL Serverは行グループを "CLOSED" としてマークします。 "タプルムーバー" と呼ばれるバックグラウンド プロセスは、CLOSED 行グループを検索して列ストアに移動します。ここで、行グループは列セグメントに圧縮され、列セグメントは列ストアに格納されます。
各クラスター化 columnstore インデックスに対して複数のデルタストアが許容されます。
デルタストアがロックされている場合、SQL Serverは別のデルタストアのロックを取得しようとします。 使用可能なデルタストアがない場合、SQL Serverは新しいデルタストアを作成します。
パーティション テーブルでは、各パーティションに 1 つ以上のデルタストアが許容されます。
クラスター化 columnstore インデックスのみについて、次のシナリオは、読み込まれた行が columnstore に直接移動するときと、デルタストアに移動するときについて説明します。
この例では、行グループはそれぞれ 102,400 ~ 1,048,576 個の行を持つことができます。
一括読み込みを行う行 | 列ストアに追加される行 | デルタストアに追加される行 |
---|---|---|
102,000 | 0 | 102,000 |
145,000 | 145,000 行グループのサイズ:145,000 |
0 |
1,048,577 | 1,048,576 行グループのサイズ:1,048,576 |
1 |
2,252,152 | 2,252,152 行グループのサイズ:1,048,576、1,048,576、155,000 |
0 |
次の例は、1,048,577 個の行をパーティションに読み込んだ結果を示しています。 この結果では、列ストアに 1 つの圧縮された行グループ (圧縮された列セグメントとして)、およびデルタストアに 1 行があります。
SELECT * FROM sys.column_store_row_groups;
クラスター化 Columnstore インデックス内のデータの変更
クラスター化 columnstore インデックスでは挿入、更新、および DML 削除操作がサポートされます。
INSERT (Transact-SQL) を使用して行を挿入します。 行はデルタストアに追加されます。
DELETE (Transact-SQL) を使用して行を削除します。
行が列ストアにある場合、SQL Serverは行を論理的に削除済みとしてマークしますが、インデックスが再構築されるまで行の物理ストレージを再利用しません。
行がデルタストア内にある場合は、行を論理的かつ物理的に削除SQL Server。
UPDATE (Transact-SQL) を使用して行を更新します。
行が列ストアにある場合、SQL Serverは行を論理的に削除済みとしてマークし、更新された行をデルタストアに挿入します。
行がデルタストア内にある場合、SQL Serverはデルタストアの行を更新します。
クラスター化列ストア インデックスを再構築する
CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL) または ALTER INDEX (Transact-SQL) を使用して、既存のクラスター化列ストア インデックスの完全な再構築を実行します。 さらに、ALTER INDEX ... を使用することもできます。REBUILD を使用して特定のパーティションを再構築します。
再構築プロセス
クラスター化列ストア インデックスを再構築するには、次をSQL Serverします。
再構築が行われている間、テーブルまたはパーティションを排他的にロックします。 再構築の間、データは "オフライン" になって使用できません。
テーブルから論理的に削除された行を物理的に削除することで、列ストアをデフラグします。削除されたバイトは物理メディアで再利用されます。
インデックスを再構築する前に、デルタストアの行ストア データを columnstore のデータとマージします。 再構築が終了すると、すべてのデータが columnstore 形式で格納され、デルタストアが空になります。
すべてのデータを列ストアに再圧縮します。 再構築が行われている間、列ストア インデックスのコピーが 2 つ存在します。 再構築が完了すると、SQL Serverは元の列ストア インデックスを削除します。
クラスター化 Columnstore インデックスの再構築の推奨設定
クラスター化 columnstore インデックスを再構築すると、断片化の解消およびすべての行を columnstore に移動する場合に便利です。 次の推奨事項が用意されています。
テーブル全体ではなくパーティションを再構築します。
インデックスが大きいとテーブル全体の再構築には時間がかかり、再構築中にインデックスの追加コピーを格納するために十分なディスク領域が必要です。 通常は、最近使用されたパーティションを再構築するだけで済みます。
パーティション テーブルでは、columnstore インデックス全体を再構築する必要はありません。断片化は最近変更されたパーティションのみで起きる可能性が高いためです。 ファクト テーブルや大きなディメンション テーブルは通常、テーブルのチャンク上でバックアップおよび管理を行うためにパーティション分割されます。
負荷の高い DML 操作後にパーティションを再構築します。
パーティションを再構築すると、パーティションの断片化を解消し、ディスク ストレージが減少します。 再構築すると、削除のマークが付けられた columnstore からすべての行が削除され、すべての行がデルタストアから columnstore に移動されます。
データを読み込んだ後に、パーティションを再構築します。
これにより、すべてデータが columnstore に格納されます。 複数の負荷が同時に発生した場合は、各パーティションは複数のデルタストアを持つ可能性があります。 再構築すると、すべてのデルタストア行が columnstore に移動されます。
クラスター化列ストア インデックスの再構成
クラスター化 columnstore インデックスを再構成すると、すべての CLOSED 行グループが columnstore に移動されます。 再編成を実行するには、 ALTER INDEX (Transact-SQL) を REORGANIZE オプションと共に使用します。
再構成は、CLOSED 行グループを columnstore に移動するためには必要はありません。 タプルムーバープロセスは最終的にすべての CLOSED 行グループを見つけて移動します。 ただし、タプルムーバーはシングルスレッドであり、ワークロードに十分な速度で行グループを移動できない可能性があります。
再構成に関する推奨事項
クラスター化列ストア インデックスを再構成するとき:
- クエリのパフォーマンスの利点をできるだけ早く得るために、1 つ以上のデータが読み込まれた後にクラスター化列ストア インデックスを再編成します。 再構成ではデータを圧縮するために最初に追加の CPU リソースが必要とされ、システムの全体的なパフォーマンスが遅くなる場合があります。 しかし、データが圧縮されるとすぐにクエリ パフォーマンスが改善します。