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