データスキッピングは、ストレージ層で計算を実行して不要なI/Oをスキップしようとする最適化手法です。一方、スキップインデックスは、事前に集約されたデータを格納することでデータスキッピング機能を提供する疎インデックス構造であり、クエリ効率を向上させます。スキップインデックスは、インデックスツリーに格納されるメタデータを拡張し、列レベルのメタデータフィールドを追加することで、インデックスノードが対応する範囲内の指定列データの最大値・最小値・NULLカウント・合計などを集約して格納します。これにより、プッシュダウンされた式の計算時にインデックス上の集約データを用いて動的にデータをトリミングし、スキャン処理中のオーバーヘッドを削減します。スキップインデックスは列の属性の一種であり、DESC table_name または SHOW CREATE TABLE table_name コマンドでテーブルの列属性を確認できます。
説明
事前集約の本質は、クエリ実行段階での計算をデータ書き込み段階へ前もって移し、事前に計算された結果を格納することでクエリ効率を向上させることです。同時に、この方法ではCompactionタスクによる追加の計算が必要となり、事前集約されたデータはストレージ容量も消費します。スキップインデックスはベースラインデータ上に格納されるため、対応する範囲内のデータが更新されると事前集約データが無効になります。そのため、頻繁なランダム更新はスキップインデックスを無効にし、最適化効果を低下させます。
スキップインデックスのDDL動作
スキップインデックスデータのメンテナンスはメジャーコンパクション時にベースラインデータ上で完了します。現在、すべての集約データ更新に関するDDL操作は、プログレッシブコンパクションに依存しています。つまり、スキップインデックスは部分的に有効になる場合があります。例えば、ある列に新しいスキップインデックスを作成すると、メジャーコンパクションが完了するたびに、新しく書き込まれたデータ上のスキップインデックスが有効になります。フルコンパクションが1サイクル終了し、すべてのデータが書き直されると、その列のすべてのデータに対してスキップインデックスが有効になります。
スキップインデックスは、Online DDL操作を通じて適用可能な列属性です。
一つの列が持てるスキップインデックス属性は、その列のデータ型と特性によって制限されます。連携関係にある列は、対応する集約属性を継承します。例えば、インデックス列がそれに該当します。
列にスキップインデックス属性を追加する際、単一テーブルのスキップインデックスのサイズがストレージがサポートする最大制限を超える可能性がある場合、システムはエラーを返します。スキップインデックスの使用は、空間を時間と交換する最適化戦略です。そのため、特定の列にスキップインデックス属性を追加するかどうかを決定する際には、この操作がクエリパフォーマンスに実際に意味があるかどうかを確認し、ストレージリソースの無駄遣いを避ける必要があります。
スキップインデックスの使用制限
JSONおよび空間データ型の列には、スキップインデックスの作成を禁止します。
非数値型の列には、
SUMタイプのスキップインデックスの作成を禁止します。数値型には、整数型、固定小数点型、浮動小数点型が含まれます(Bit-Value型はサポートされていません)。生成列には、スキップインデックスの作成を禁止します。
スキップインデックスの識別方法
説明
- 行ストアテーブルはデフォルトで任意のタイプのスキップインデックスを作成しません。列ストアテーブルはデフォルトで
MIN_MAXタイプのスキップインデックスを作成します。 - システムがデフォルトで作成するスキップインデックス属性については、
DESC table_nameまたはSHOW CREATE TABLE table_nameコマンドでテーブルの列属性を確認する際、スキップインデックス属性は表示されません。 - 列ストアテーブルがデフォルトで
MIN_MAXタイプのスキップインデックスを作成し、SUMタイプのスキップインデックスをデフォルトで作成しないのは、SUMタイプのスキップインデックスがダイレクトロードやメジャーコンパクションタスクのパフォーマンスに一定の影響を与えるためです。SUMタイプのスキップインデックスがクエリパフォーマンスの最適化につながる場合、ユーザーはクエリを高速化するためにSUMタイプのスキップインデックスを明示的に作成することを検討できます。しかし、クエリパフォーマンスが最適化されない場合は、SUMタイプのスキップインデックスを削除することを推奨します。
SKIP_INDEX(skip_index_option) を指定することで、列のスキップインデックス属性を識別します。skip_index_option の取り得る値は以下のとおりです:
MIN_MAX:スキップインデックスで最も一般的な集約データタイプであり、インデックスノードの粒度でインデックス列の最大値、最小値、NULLカウントを格納します。このタイプのデータは、プッシュダウンされるFilterやMIN/MAX集約のプッシュダウンを高速化できます。SUM:数値型のSUM集約のプッシュダウンを高速化するために使用されます。MIN_MAX, SUM:MIN_MAXとSUMの両方の集計を同時に使用するSkip Indexタイプです。
Skip Indexプロパティの変更に関する情報は、テーブルの変更を参照してください。
例
テーブル作成時に列のSkip Indexプロパティを指定します。
CREATE TABLE test_skidx(
col1 INT SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);