データスキッピングは、ストレージ層で計算を実行して不必要なI/Oを回避しようとする最適化手法です。一方、スキップインデックスは、事前集約されたデータを格納することでデータスキッピング機能を提供する疎インデックス構造であり、クエリ効率の向上を図ります。スキップインデックスは、インデックスツリーに格納されるメタデータを拡張し、列レベルのメタデータフィールドを追加することで、インデックスノードが対応するRange内の指定列データの最大値・最小値・NULLカウント・合計などを集約して格納します。これにより、ダウンプッシュされた式の計算時に、インデックス上の集約データを用いて動的なデータトリミングを行い、スキャン処理中のオーバーヘッドを低減します。スキップインデックスは列の属性の一種であり、DESC table_name または SHOW CREATE TABLE table_name コマンドでテーブルの列属性を確認できます。
説明
事前集約の本質は、クエリ実行段階での計算をデータ書き込み段階に前もって移し、事前計算された結果を格納することでクエリ効率の向上を図ることです。同時に、この方法ではCompactionタスクによる追加の計算が必要となり、事前集約されたデータはストレージ容量も消費します。スキップインデックスはベースラインデータ上に格納されており、事前集約された範囲内のデータが更新されるとその集約データは無効になります。そのため、頻繁なランダム更新はスキップインデックスを無効にし、最適化効果を低下させます。
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を格納します。このタイプのデータは、プッシュダウンされるFilterやMIN/MAX集約のプッシュダウンを高速化できます。SUM:数値型のSUM集約のプッシュダウンを高速化するために使用されます。MIN_MAX, SUM:MIN_MAXとSUM集約のSkip Indexタイプを同時に使用します。
Skip Index属性の変更に関する情報については、テーブルの変更を参照してください。
例
テーブル作成時に列のSkip Index属性を識別します。
CREATE TABLE test_skidx(
col1 NUMBER SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR2(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);