このドキュメントでは、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テナントのメモリを1G以上に設定することを推奨します。
- インデックス作成前に、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