データスキッピングは、ストレージ層で計算を実行して不要な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 NUMBER SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR2(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);