次の方法で共有


クラスター化列ストア インデックスの使用

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 に移動する場合に便利です。 次の推奨事項が用意されています。

  • テーブル全体ではなくパーティションを再構築します。

    1. インデックスが大きいとテーブル全体の再構築には時間がかかり、再構築中にインデックスの追加コピーを格納するために十分なディスク領域が必要です。 通常は、最近使用されたパーティションを再構築するだけで済みます。

    2. パーティション テーブルでは、columnstore インデックス全体を再構築する必要はありません。断片化は最近変更されたパーティションのみで起きる可能性が高いためです。 ファクト テーブルや大きなディメンション テーブルは通常、テーブルのチャンク上でバックアップおよび管理を行うためにパーティション分割されます。

  • 負荷の高い DML 操作後にパーティションを再構築します。

    パーティションを再構築すると、パーティションの断片化を解消し、ディスク ストレージが減少します。 再構築すると、削除のマークが付けられた columnstore からすべての行が削除され、すべての行がデルタストアから columnstore に移動されます。

  • データを読み込んだ後に、パーティションを再構築します。

    これにより、すべてデータが columnstore に格納されます。 複数の負荷が同時に発生した場合は、各パーティションは複数のデルタストアを持つ可能性があります。 再構築すると、すべてのデルタストア行が columnstore に移動されます。

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

クラスター化 columnstore インデックスを再構成すると、すべての CLOSED 行グループが columnstore に移動されます。 再編成を実行するには、 ALTER INDEX (Transact-SQL) を REORGANIZE オプションと共に使用します。

再構成は、CLOSED 行グループを columnstore に移動するためには必要はありません。 タプルムーバープロセスは最終的にすべての CLOSED 行グループを見つけて移動します。 ただし、タプルムーバーはシングルスレッドであり、ワークロードに十分な速度で行グループを移動できない可能性があります。

再構成に関する推奨事項

クラスター化列ストア インデックスを再構成するとき:

  • クエリのパフォーマンスの利点をできるだけ早く得るために、1 つ以上のデータが読み込まれた後にクラスター化列ストア インデックスを再編成します。 再構成ではデータを圧縮するために最初に追加の CPU リソースが必要とされ、システムの全体的なパフォーマンスが遅くなる場合があります。 しかし、データが圧縮されるとすぐにクエリ パフォーマンスが改善します。