このドキュメントでは、OceanBaseデータベースの密集インデックスであるIVFシリーズのインデックスの作成、検索、削除の構文と例を説明します。
インデックス構文と説明
作成
IVF シリーズのインデックスには、IVF と IVF_PQ の 2 種類が含まれており、作成方法はテーブル作成時に作成すると後から作成するの 2 つの方法がサポートされています。作成時には以下の点に注意してください。
- ベクトルインデックスを作成する際は、
VECTORキーワードを必ず指定する必要があります。 - 後から作成するインデックスのパラメータと説明は、テーブル作成時にインデックスを作成する場合と同じです。
- データ量が大きい場合は、データの書き込みを完了してからインデックスを作成することで、最適な検索性能を得ることができます。
- IVF および IVF_PQ インデックスの作成は、データの書き込み後に実行することを推奨します。また、大量の増分データを書き込んだ後は、インデックスの再構築を行うことを推奨します。各インデックスの具体的な作成方法については、以下の例を参照してください。
- IVF インデックスを作成する際、インデックス名の長さは現在 33 文字を超えることができません。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.3.5 BP5 バージョンでは、デフォルト値を維持することを推奨し、変更は推奨されません。 |
| nbits | 8 | [1,24] | いいえ | 量子化ビット数を指定します。
注意このパラメータは V4.3.5 BP3 バージョンからサポートされており、IVF_PQ インデックスの作成時にのみ指定できます。 |
推奨値は 8 で、推奨値の範囲は [8,10] です。この値が大きいほど、量子化精度が高まり、検索の正確性が向上しますが、同時に検索性能に影響が出ます。 |
| m | デフォルト値なし、指定必須 | [1,65536] | はい | 量子化後のベクトル次元を指定します。
注意このパラメータは V4.3.5 BP3 バージョンからサポートされており、IVF_PQ インデックスの作成時にのみ指定できます。 |
この値が大きいほど、インデックスの構築が遅くなり、検索の正確性が向上しますが、同時に検索性能に影響が出ます。 |
IVF/IVF_PQ インデックス(V4.3.5 BP5 バージョンにのみ適用) について、以下の追加説明があります:
- インデックスの制限:
- ヒープテーブルとパーティションテーブルを同時に使用するシナリオでは、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リソースが10コアを超えるシナリオでは、インデックスを作成する前に
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 シリーズインデックスでは、nprobesパラメータがサポートされています。例えば、PARAMETERS(nprobes=200)です。このパラメータは V4.3.5 BP5 バージョンからサポートされており、検索時に使用するクラスタ中心の数を指定します。
距離関数の使用ルール:
APPROXIMATE/APPROXを指定し、現在のバージョンがサポートする距離関数を呼び出し、かつベクトルインデックスアルゴリズムと一致する場合、検索はベクトルインデックスを使用します。APPROXIMATE/APPROXを指定し、現在のバージョンがサポートする距離関数を呼び出し、かつベクトルインデックスアルゴリズムと一致しない場合、検索はベクトルインデックスを使用せず、エラーも発生しません。APPROXIMATE/APPROXを指定し、現在のバージョンがサポートしない距離関数を呼び出す場合、検索はベクトルインデックスを使用せず、エラーが発生します。APPROXIMATE/APPROXを指定しない場合、現在のバージョンがサポートする距離関数を呼び出すと、検索はベクトルインデックスを使用せず、エラーも発生しません。
その他の説明:
WHERE条件は、ベクトルインデックス検索のフィルタリング条件となります。- リコール率は、構築パラメータと検索パラメータの影響を受けることがあります。
- インデックス検索パラメータは、インデックスを作成する際に指定し、その後は変更できません。ただし、セッション変数
ob_ivf_nprobesを使用して、検索時のクラスタ中心の数を設定できます。セッション変数が設定されている場合は、その値が優先されます。具体的な設定方法については、ob_ivf_nprobesを参照してください。 - IVF/IVF_PQ インデックスの検索最適化の推奨事項(V4.3.5 BP5 バージョンにのみ適用されます):
- メインテーブルを作成する際に
ROW_FORMAT=COMPRESSEDを設定して圧縮行形式を有効化すると、IVF ベクトルインデックス検索のパフォーマンスが20〜30%向上します。例えば:CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VECTOR(4)) ROW_FORMAT=COMPRESSED; - 並列検索を有効にしないことを推奨します。有効にすると、検索パフォーマンスに影響を与えるか、検索結果が正しくない場合があります。
- メインテーブルを作成する際に
注意
V4.3.5 BP5 バージョンから、PARAMETERS(similarity=$value) 句を使用して、類似度しきい値に基づく検索を指定できるようになりました。
- 相似度しきい値パラメータ(
similarity):- 構文:
LIMIT句の後にPARAMETERS (similarity=$value)を追加します。ここで、$valueは相似度しきい値であり、値の範囲は[0, 1]です。通常、相似度値が大きいほど、より類似度が高く、距離は小さくなります。ただし、inner_productの場合は、距離が大きくなるほどより類似度が高いです。 - 機能:指定された相似度しきい値に基づいて、結果に含まれる結果はそのしきい値以上である必要があります。
- サポートされるIVFシリーズインデックスタイプ: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)
- 構文:
削除
ベクトルインデックスを削除する構文は次のとおりです。
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