列ストア インデックスの新機能

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

各バージョンの SQL Server で使用できる列ストア機能と、SQL Database、Azure Synapse Analytics、Analytics Platform System (PDW) の最新リリースについて説明します。

製品リリースの機能の概要

列ストア インデックスの主な機能と、これらの機能を利用できる製品をまとめた表を次に示します。

列ストア インデックスの機能 SQL Server 2012 (11.x) SQL Server 2014 (12.x) SQL Server 2016 (13.x)1 SQL Server 2017 (14.x) SQL Server 2019 (15.x) SQL Server 2022 (16.x) SQL データベース1 Azure Synapse Analytics の専用 SQL プール
マルチ スレッド クエリのバッチ モード実行 2 はい はい はい はい はい はい はい はい
シングル スレッド クエリのバッチ モード実行 はい はい はい はい はい はい
アーカイブ圧縮オプション はい はい はい はい はい はい はい
スナップショット分離および Read Committed スナップショット分離 はい はい はい はい はい はい
テーブルの作成時に、列ストア インデックスを指定する はい はい はい はい はい はい
AlwaysOn は列ストア インデックスをサポートする はい はい はい はい はい はい はい はい
AlwaysOn の読み取り可能なセカンダリは非クラスター化列ストア インデックスをサポートする はい はい はい はい はい はい はい はい
Always On の読み取り可能なセカンダリは、更新可能な列ストア インデックスをサポートする はい はい はい はい
ヒープまたは B ツリーの読み取り専用の非クラスター化列ストア インデックス はい はい はい 3 はい 3 はい 3 はい 3 はい 3 はい 3
ヒープまたは B ツリーの更新可能な非クラスター化列ストア インデックス はい はい はい はい はい はい
ヒープまたは B ツリーで許容される追加の B ツリー インデックスには非クラスター化列ストア インデックスがある はい はい はい はい はい はい はい はい
更新可能なクラスター化列ストア インデックス はい はい はい はい はい はい はい
クラスター化列ストア インデックスの B ツリー インデックス はい はい はい はい はい はい
メモリ最適化テーブルの列ストア インデックス はい はい はい はい はい はい
非クラスター化列ストア インデックスの定義では、フィルター適用条件の使用をサポートする はい はい はい はい はい はい
CREATE TABLE および ALTER TABLE での列ストア インデックスの圧縮遅延オプション はい はい はい はい はい はい
nvarchar(max) 型のサポート はい はい はい はい いいえ 4
列ストア インデックスは保存されない計算列を使用できる はい はい はい
組ムーバーのバックグラウンド マージ サポート はい はい はい はい
順序付きクラスター化列ストア インデックス はい はい はい
順序指定非クラスター化列ストア インデックス はい

1 SQL Database では、列ストア インデックスは Azure SQL Database DTU Premium レベル、DTU Standard レベル (S3 以上)、およびすべての vCore レベルで使用できます。 SQL Server 2016 (13.x) SP1 以降のバージョンでは、列ストア インデックスがすべてのエディションで使用できます。 SQL Server 2016 (13.x) (SP1 より前) 以前のバージョンでは、列ストア インデックスは Enterprise Edition でのみ使用できます。

2 バッチ モード操作の並列処理の度合い (DOP) は、SQL Server Standard Edition では 2 DOP、SQL Server Web Edition および Express Edition では 1 DOP に制限されます。 この制限は、ディスク ベース テーブルとメモリ最適化テーブルで作成された列ストア インデックスに当てはまります。

3 読み取り専用の非クラスター化列ストア インデックスを作成するには、読み取り専用ファイル グループにインデックスを格納します。

4 専用 SQL プールではサポートされていませんが、サーバーレス SQL プールではサポートされます。

SQL Server 2022 (16.x)

SQL Server 2022 (16.x) では、次の新機能が追加されます。 詳細については、「SQL Server 2022 (16.x) の新機能」を参照してください。

  • 順序付きクラスター化列ストア インデックスを使用すると、順序付けられた列述語に基づいてクエリのパフォーマンスが向上します。 順序付き列ストア インデックスは、データのセグメントを完全にスキップすることでパフォーマンスを向上させることができます。 これにより、列ストア データに対するクエリを完了するために必要な IO が大幅に削減されます。 詳細については、「セグメントの削除」を参照してください。 順序付けされたクラスター列ストア インデックスは、SQL Server 2022 (16.x) で導入されました。 詳しくは、「CREATE COLUMNSTORE INDEX」と「順序付けされたクラスター列ストア インデックスを使用したパフォーマンス チューニング」をご覧ください。

  • 文字列のクラスター化列ストア行グループを削除した述語プッシュダウンでは、境界値を使用して文字列検索を最適化します。 すべての列ストア インデックスで、データ型によるセグメントの削除が拡張されました。 SQL Server 2022 (16.x) からは、これらのセグメントの削除機能が、文字列、バイナリ、guid データ型、およびスケールが 2 より大きい datetimeoffset データ型まで拡張されます。 これまで、列ストア セグメントの削除は、数値、日付、時刻のデータ型、およびスケールが 2 以下の datetimeoffset データ型のみに適用されていました。 文字列の最小/最大セグメントの削除 (SQL Server 2022 (16.x) 以降のバージョンをサポートする SQL Server のバージョンにアップグレードした後、列ストア インデックスは REBUILD または DROP/CREATE を使用して再構築されるまで、この機能を利用できません。

SQL Server 2019 (15.x)

SQL Server 2019 (15.x) では、次の新機能が追加されます。

機能

SQL Server 2019 (15.x) 以降、タプル ムーバーは、内部しきい値で指定した所定の期間存在していたと判断された小さい OPEN デルタ行グループを自動的に圧縮したり、大量の行が削除された COMPRESSED 行グループをマージしたりするバックグラウンド マージ タスクによってサポートされています。 行グループを部分的に削除されたデータとマージするには、以前はインデックスの再編成操作が必要でした。 これにより、時間の経過とともに、列ストア インデックスの品質が向上します。

SQL Server 2017 (14.x)

SQL Server 2017 (14.x) では、次の新機能が追加されます。

機能

  • SQL Server 2017 (14.x) は、クラスター化列ストア インデックスで非永続的計算列をサポートします。 保存される計算列は、クラスター化列ストア インデックス内ではサポートされません。 計算列に非クラスター化列ストア インデックスを作成することはできません。

SQL Server 2016 (13.x)

SQL Server 2016 (13.x) には、列ストア インデックスのパフォーマンスと柔軟性を向上させるために重要な機能強化が追加されています。 これらの機能強化により、データ ウェアハウスのシナリオが強化され、リアルタイムの運用分析が可能になります。

機能

  • 行ストア テーブルで、更新可能な非クラスター化列ストア インデックスを 1 つ使用できます。 以前、非クラスター化列ストア インデックスは、読み取り専用でした。

  • 非クラスター化列ストア インデックスの定義で、フィルター適用条件の使用をサポートします。 OLTP テーブルに列ストア インデックスを追加することによるパフォーマンスへの影響を最小限に抑えるには、フィルター条件を使って、用して、運用ワークロードのコールド データのみに、非クラスター化列ストア インデックスを作成します。

  • インメモリ テーブルでは、列ストア インデックスを 1 つ使用できます。 これは、テーブルの作成時に作成することも、後で ALTER TABLE (Transact-SQL) を使用して追加することもできます。 以前は、列ストア インデックスを保持できたのはディスク ベースのテーブルのみでした。

  • クラスター化列ストア インデックスでは、1 つ以上の非クラスター化行ストア インデックスを使用できます。 以前、列ストア インデックスでは、非クラスター化インデックスはサポートされていませんでした。 SQL Server では、DML 操作の非クラスター化インデックスが自動的に維持されます。

  • B ツリー インデックスを使用して主キーと外部キーをサポートし、これらの制約をクラスター化列ストア インデックスに適用します。

  • 列ストア インデックスには、リアルタイム運用分析へのトランザクション ワークロードの影響を最小限に抑える圧縮遅延オプションが用意されています。 このオプションでは、頻繁に変更される行が安定するように配慮してから、それらの行を列ストアに圧縮します。 詳しくは、「CREATE COLUMNSTORE INDEX (Transact-SQL)」および「列ストアを使用したリアルタイム運用分析の概要」をご覧ください。

データベースの互換性レベルが 120 または 130 の場合のパフォーマンス

  • 列ストア インデックスでは、Read Committed スナップショット分離レベル (RCSI) とスナップショット分離 (SI) をサポートします。 これにより、ロックなしのトランザクション一貫性分析クエリが有効になります。

  • 列ストアでは、削除された行を取り除くことでインデックス最適化をサポートしており、明示的にインデックスを再構築する必要はありません。 ALTER INDEX ... REORGANIZE ステートメントは、オンライン操作として、内部的に定義されたポリシーに基づいて、削除された行を列ストアから削除します。

  • 列ストア インデックスには、Always On の読み取り可能なセカンダリ レプリカでアクセスできます。 Always On セカンダリ レプリカに分析クエリをオフロードすることで、運用分析のパフォーマンスを向上させることができます。

  • 集計プッシュダウンでは、データ型で使われているバイト数が 8 バイト以下で、かつ文字列でない場合は、テーブル スキャン中に集計関数 MINMAXSUMCOUNTAVG が計算されます。 クラスター化列ストア インデックスおよび非クラスター化列ストア インデックスの両方で、GROUP BY 句を使用するかどうかに関係なく、集計プッシュダウンがサポートされています。 SQL Server では、この改良は Enterprise エディションで予約されています。

  • 文字列述語のプッシュダウンは、VARCHAR/CHAR 型または NVARCHAR/NCHAR 型の文字列を比較するクエリを高速化します。 これは、一般的な比較演算子に適用され、ビットマップ フィルターを使用する演算子 (LIKE など) が含まれます。 サポートされるすべての照合順序で機能します。 SQL Server では、この改良は Enterprise エディションで予約されています。

  • ベクターベースのハードウェア機能を活用したバッチ モード操作の機能強化。 データベース エンジンによって、AVX 2 (Advanced Vector Extensions) と SSE 4 (Streaming SIMD Extensions 4) のハードウェア拡張機能の CPU サポート レベルが検出されます。サポートされている場合、これらが使用されます。 SQL Server では、この改良は Enterprise エディションで予約されています。

データベースの互換性レベルが 130 の場合のパフォーマンス

  • 次のいずれかの操作を使用して、クエリの新しいバッチ モード実行をサポートします。

    • SORT
    • 複数の異なる関数では集計します。 例: COUNT/COUNTAVG/SUMCHECKSUM_AGGSTDEV/STDEVP
    • ウィンドウ集計関数: COUNTCOUNT_BIGSUMAVGMINMAXCLR
    • ユーザー定義のウィンドウ集計関数: CHECKSUM_AGGSTDEVSTDEVPVARVARPGROUPING
    • ウィンドウ集計分析関数: LAGLEADFIRST_VALUELAST_VALUEPERCENTILE_CONTPERCENTILE_DISCCUME_DISTPERCENT_RANK
  • MAXDOP 1 または直列クエリ プランで実行されるシングル スレッド クエリは、バッチ モードで実行されます。 以前は、バッチ実行でマルチ スレッド クエリのみが実行されていました。

  • メモリ最適化テーブル クエリでは、行ストア インデックス内または列ストア インデックス内のデータにアクセスする際に、並列プランを SQL 相互運用モードで使用できます。

サポート可能性

次に、列ストア用の新しいシステム ビューを示します。

これらのインメモリ OLTP ベースの DMV には、列ストアに対する更新が含まれます。

制限事項

  • インメモリ テーブルの場合、列ストア インデックスにはすべての列が含まれている必要があります。列ストア インデックスにフィルター適用条件を含めることはできません。
  • インメモリ テーブルの場合、列ストア インデックスに対するクエリは相互運用モードでのみ実行され、インメモリ ネイティブ モードでは実行されません。 並列実行がサポートされています。

既知の問題

適用対象: SQL Server、Azure SQL Database、Azure SQL Managed Instance、Azure Synapse Analytics 専用 SQL プール

  • 現在、圧縮列ストア セグメントの LOB 列 (varbinary(max)、varchar(max)、および nvarchar(max)) は、DBCC SHRINKDATABASE および DBCC SHRINKFILE の影響を受けません。

SQL Server 2014 (12.x)

SQL Server 2014 (12.x)は、プライマリ ストレージ形式としてクラスター化列ストア インデックスを導入されました。 これにより、通常の読み込みに加えて、更新、削除、および挿入の操作が可能になりました。

  • テーブルは、主テーブル ストレージとしてクラスター化列ストア インデックスを使用できます。 テーブルでそれ以外のインデックスは使用できませんが、クラスター化列ストア インデックスは更新可能なため、通常の読み込みを実行して個々の行に変更を加えることができます。
  • 非クラスター化列ストア インデックスは、バッチ モードで実行可能になった追加の演算子を除き、SQL Server 2012 (11.x)と同様な機能を引き続き備えています。 更新は相変わらずサポートされていません。ただし、再構築およびパーティションの切り替えによる更新は除きます。 非クラスター化列ストア インデックスは、ディスクベースのテーブルでのみサポートされており、インメモリ テーブルではサポートされていません。
  • クラスター化および非クラスター化列ストア インデックスは、データをさらに圧縮するアーカイブ圧縮オプションがあります。 アーカイブ オプションは、メモリ内でもディスク上でもデータ サイズを縮小するのに便利ですが、クエリのパフォーマンスを低下させます。 アクセス頻度の低いデータに対して適切に機能します。
  • クラスター化列ストア インデックスと非クラスター化列ストア インデックスには類似点が多数あります。両者は、同じ列ストレージ形式、同じクエリ処理エンジン、および同じ動的管理ビュー セットを使用します。 違いは、一方がプライマリ インデックス型で他方がセカンダリ インデックス型であることです。非クラスター化列ストア インデックスは読み取り専用です。
  • Scan、Filter、Project、Join、Group By、Union All の各演算子は、マルチ スレッド クエリではバッチ モードで実行されます。

SQL Server 2012 (11.x)

SQL Server 2012 (11.x) では、行ストア テーブルに対するもう 1 つのインデックス型としての非クラスター化列ストア インデックスと、列ストア データに対するクエリのバッチ処理が導入されました。

  • 行ストア テーブルでは、非クラスター化列ストア インデックスを 1 つ使用することができます。
  • 列ストア インデックスは読み取り専用です。 列ストア インデックスの作成後は、INSERTDELETE、および UPDATE の操作で、テーブルを更新することはできません。これらの操作を実行するには、インデックスを削除し、テーブルを更新し、列ストア インデックスを再構築する必要があります。 パーティション切り替えを使用することで、テーブルに追加データを読み込むことができます。 パーティション切り替えの利点は、列ストア インデックスを削除して再構築しなくても、データを読み込むことができることです。
  • 列ストア インデックスは、データのコピーを格納するため、常に余分のストレージ(通常は、行ストアより 10% 多く)ストレージを確保しておく必要があります。
  • バッチ処理は、クエリのパフォーマンスを 2 倍以上向上させますが、並列クエリの実行でしか利用できません。