このドキュメントでは、OceanBaseデータベースの密インデックスであるIVFシリーズインデックスの作成、検索、削除の構文説明と使用例を解説します。
インデックス構文と説明
作成
IVFシリーズインデックスには、IVFとIVF_PQの2種類があり、テーブル作成時の同時作成と後からの個別作成の2つの方法をサポートしています。作成時には以下の点に注意してください:
- ベクトルインデックスを作成する場合は、
VECTORキーワードを指定する必要があります。 - 後から作成するインデックスのパラメータと説明は、テーブル作成時にインデックスを作成する場合と同じです。
- データ量が多い場合は、最適な検索パフォーマンスを得るため、データの書き込みを完了してからインデックスを作成することを推奨します。
- IVF/IVF_PQインデックスは、データの書き込み後に作成し、大量の増分データの書き込み後にインデックスを再構築することを推奨します。各インデックスの具体的な作成方法については、以下の具体例を参照してください。
- IVFインデックスを作成する際、インデックス名の長さが33文字を超える場合は現在サポートされていません。超えると、インデックス補助テーブル名の長さが
index_nameの制限を超えて異常が発生する可能性があります。将来のバージョンでは、より長いインデックス名がサポートされる予定です。
テーブル作成時に作成
インデックスの後付け
テーブル作成時のインデックス作成構文:
CREATE TABLE table_name (
column_name1 data_type1,
column_name2 VECTOR(dim),
...,
VECTOR INDEX index_name (column_name2) WITH (param1=value1, param2=value2, ...)
);
後付けインデックス構文:
-- 後付けインデックスは並列度を設定でき、インデックス構築のパフォーマンスを向上させます。並列度の最大設定値はCPUコア数 × 2を超えません。
CREATE [/*+ paralell $value*/] VECTOR INDEX index_name ON table_name(column_name2) WITH (param1=value1, param2=value2, ...);
param パラメータの説明:
パラメータ |
デフォルト値 |
値の範囲 |
必須 |
説明 |
備考 |
|---|---|---|---|---|---|
| distance | l2/inner_product/cosine | はい | ベクトル距離アルゴリズムのタイプを指定します。 | l2はユークリッド距離、inner_productは内積距離、cosineはコサイン距離を表します。 | |
| type | ivf_flat/ivf_pq | はい | IVFインデックスのタイプを指定します。 | ||
| lib | ob | ob | いいえ | ベクトルインデックスライブラリのタイプを指定します。 | |
| nlist | 128 | [1,65536] | いいえ | クラスタ中心の数です。 |
データ量は最大パーティションのデータ量で推定します。
|
| sample_per_nlist | 256 | [1,int64_max] | はい | 各クラスタ中心でサンプリングするデータ量で、後から作成するインデックスで使用されます。 | V4.4.2 BP1バージョンではデフォルト値のままにしておくことを推奨し、変更は推奨されません。 |
| nbits | 8 | [1,24] | いいえ | 量子化ビット数を指定します。
注意このパラメータはV4.4.1バージョンからサポートされており、IVF_PQインデックスの作成時にのみ指定できます。 |
推奨値は8で、推奨範囲は[8,10]です。この値が大きいほど、量子化の精度が高まり、検索の正解率も向上しますが、同時に検索性能に影響が出ます。 |
| m | デフォルト値なし、指定必須 | [1,65536] | はい | 量子化後のベクトル次元を指定します。
注意このパラメータはV4.4.1バージョンからサポートされており、IVF_PQインデックスの作成時にのみ指定できます。 |
この値が大きいほど、インデックスの構築は遅くなり、検索の正解率も向上しますが、同時に検索性能に影響が出ます。 |
IVF/IVF_PQインデックスについて(V4.4.2 BP1バージョンのみ適用)、以下の追加説明があります:
- インデックスの制限:
- ヒープテーブルやパーティションテーブルには、IVF/IVF_PQインデックスを作成できません。
- 構築に関する推奨事項:
- データのインポートが完了してから、IVF/IVF_PQインデックスを作成することを強く推奨します。テーブル作成時にIVFインデックスを同時に作成することは推奨されません。作成時にデータがない場合、インデックスはクラスタ化できず、使用できなくなります。その場合は、手動で
REBUILD INDEXまたはDROPを実行した後、再度CREATE INDEXを実行する必要があります。 - インデックスを作成する前に、ベクトルインデックスのメモリ使用量の見積もりを参照し、メモリ使用状況を見積もっておくことを推奨します。これにより、作成中にメモリ不足が発生するのを防ぐことができます。
- インデックスを作成する前に、メジャーコンパクションを実行するために
ALTER SYSTEM major freezeを実行し、コンパクション完了を待つことを推奨します。 - マルチノードクラスタモードでは、SYSテナントのメモリを1GB以上に設定することを推奨します。
- インデックスを作成する前に、parallel_servers_targetパラメータの値をテナントの
max_cpu * 10に設定することを推奨します。 - 単一パーティションのデータ量が1000万件を超え、テナントのCPUリソースが10Cを超える場合、インデックスを作成する前に
ALTER SYSTEM SET _px_object_sampling = 5000でサンプリング比率を変更することで、インデックス構築の効率を向上させることができます。
- データのインポートが完了してから、IVF/IVF_PQインデックスを作成することを強く推奨します。テーブル作成時にIVFインデックスを同時に作成することは推奨されません。作成時にデータがない場合、インデックスはクラスタ化できず、使用できなくなります。その場合は、手動で
サーチ
IVFシリーズインデックスのサーチは近似最近傍(ANN)サーチであり、結果の正確性を100%保証するものではありません。その精度を測る指標が再現率です。例えば、最近傍10個を検索する際に、安定して正しい結果を9個返すことができれば、再現率は90%となります。
SELECT ... FROM table_name
ORDER BY distance_function(column_name, vector_expr) [APPROXIMATE|APPROX]
LIMIT num (OFFSET num) [PARAMETERS ($param1=$value1, ...)];
サーチ構文要件:
APPROXIMATE/APPROXキーワードを指定する必要があります。これにより、ベクトルインデックスが使用され、テーブル全体のスキャンは行われません。ORDER BYおよびLIMIT句を含める必要があります。ORDER BYは単一のベクトル条件のみをサポートします。LIMIT + OFFSETの取り得る範囲は(0, 16384]です。LIMIT句を指定しない場合、エラーが発生します。PARAMETERS句はサーチパラメータを指定するために使用されます。IVF/IVF_PQ インデックスでは、nprobesパラメータをサポートしています。例:PARAMETERS(nprobes=200)。このパラメータは V4.4.2 BP1 からサポートされており、サーチ時のクラスタ中心の数を指定するために使用されます。
距離関数の使用規則:
APPROXIMATE/APPROXを指定し、現在のバージョンでサポートされている距離関数を呼び出し、かつそれがベクトルインデックスアルゴリズムとマッチする場合、サーチはベクトルインデックスを使用します。APPROXIMATE/APPROXを指定し、距離関数がベクトルインデックスアルゴリズムとマッチしない場合、サーチはベクトルインデックスを使用しませんが、エラーも報告しません。APPROXIMATE/APPROXを指定し、距離関数が現在のバージョンでサポートされていない場合、サーチはベクトルインデックスを使用せず、エラーが発生します。APPROXIMATE/APPROXを指定せず、現在のバージョンでサポートされている距離関数を呼び出す場合、サーチはベクトルインデックスを使用しませんが、エラーも報告しません。
注意
V4.4.2 BP1 以降、PARAMETERS(similarity=$value) 句を使用して類似度しきい値を指定してサーチすることができます。
- 類似度しきい値パラメータ(
similarity):- 構文:
LIMIT句の後にPARAMETERS (similarity=$value)を追加します。ここで、$valueは類似度しきい値です(取り得る範囲は[0, 1])。一般的に、類似度値が大きいほど、より類似しており、距離が小さいことを意味します。inner_productは例外で、距離が大きいほど類似しています。 - 機能:類似度しきい値を指定すると、返される結果には、そのしきい値以上の類似度を持つ結果のみが含まれます。
- サポートされているインデックスタイプ:IVF、IVF_PQ。
- サポートされている距離タイプ:
- クエリ時に、
cosine_distanceおよびl2_distance距離タイプのインデックスに対して類似度を指定できます。l2_distanceの場合、ベクトルにL2ノーマライゼーション処理を施すことを推奨します。これにより、類似度サーチの精度が向上します。ベクトルノーマライゼーションの説明と例については、SQL関数の使用 - ベクトルノーマライゼーションを参照してください。 - 距離タイプが
inner_productのインデックスに対してクエリ時に類似度を指定することはサポートされていません(not supportエラーが発生します)。
- クエリ時に、
- 類似度と距離の対応関係:
cosine_distance=2 - 2 * similarityl2_distance=sqrt(1 / similarity -1)
- 構文:
その他の説明:
WHERE条件は、ベクトルインデックスサーチのフィルタ条件として使用されます。- 再現率は、構築パラメータとサーチパラメータの影響を受けます。
- インデックスのサーチパラメータはインデックス作成時に指定し、その後は変更できません。ただし、セッション変数
ob_ivf_nprobesを使用して、サーチ時のクラスタ中心の数を設定できます。セッション変数に設定がある場合、その値が優先的に使用されます。具体的な設定方法については、ob_ivf_nprobesを参照してください。 - IVF/IVF_PQ インデックスサーチの最適化に関する推奨事項(V4.4.2 BP1 バージョンのみ適用):
- メインテーブル作成時に
ROW_FORMAT=COMPRESSEDを設定して圧縮行フォーマットを有効にすることで、IVF ベクトルインデックスサーチのパフォーマンスを 20~30%向上させることができます。例:CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VECTOR(4)) ROW_FORMAT=COMPRESSED; - 並列サーチを有効にすることは推奨されません。そうすると、サーチのパフォーマンスが低下したり、結果が正しくならなかったりする可能性があります。
- メインテーブル作成時に
削除
ベクトルインデックスを削除する構文は次のとおりです:
DROP INDEX index_name ON table_name;
作成、検索、削除の例
テーブル作成時の作成
IVFの例
CREATE TABLE ivf_vecindex_suite_table_test (c1 INT, c2 VECTOR(3), PRIMARY KEY(c1), VECTOR INDEX idx2(c2) WITH (distance=l2, type=ivf_flat));
作成後
IVFの例
テストテーブルを作成します。
CREATE TABLE vec_table_ivf (c1 INT, c2 VECTOR(3), PRIMARY KEY(c1));
IVFインデックスを作成します。
CREATE VECTOR INDEX vec_idx3 ON vec_table_ivf(c2) WITH (distance=l2, type=ivf_flat);
削除
DROP INDEX vec_idx1 ON vec_table;
削除されたインデックスを確認します。
SHOW INDEX FROM vec_table;
実行結果は次のとおりです:
Empty set