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はベースラインデータ上に格納されており、事前集約に対応するRange内のデータが更新されると事前集約データが無効になるため、頻繁なランダム更新はSkip Indexを無効にし、最適化効果を低下させる原因となります。
Skip IndexのDDL動作
Skip Indexデータのメンテナンスは、コンパクション時にベースラインデータ上で完了します。現在、すべての集計データ更新のDDL操作は、段階的なコンパクションに依存しています。つまり、Skip Indexは部分的に有効になることがあります。例えば、ある列に新しいSkip Indexを作成すると、コンパクションが完了するたびに、新しく書き込まれたデータ上のSkip Indexが有効になります。フルコンパクションが完了し、すべてのデータが書き換えられると、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を削除することを推奨します。 - OceanBaseデータベースV4.3.0およびV4.3.1バージョンのカラムストアテーブルでは、デフォルトで
SUMタイプのSkip Indexが作成されますが、V4.3.2バージョンにアップグレードすると、SUMタイプのSkip Indexが使用できなくなる可能性があります。SUM集計を持つ一部のカラムストアテーブルでクエリ性能が低下した場合、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属性の変更に関する詳細は、テーブルの変更を参照してください。
例
テーブル作成時にスキップインデックス属性を指定します。
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)
);