このドキュメントでは、OceanBaseデータベースの密インデックスであるHNSWシリーズインデックスの作成、検索、削除の構文説明と使用例を紹介します。
インデックス構文と説明
作成
HNSWシリーズのインデックスには、HNSW、HNSW_SQ、HNSW_BQの3種類があり、テーブル作成時の同時作成と後からの単独作成の2つの方法でサポートされています。作成時には以下の点に注意してください:
- ベクトルインデックスを作成する場合は、
VECTORキーワードを指定する必要があります。 - 後から作成するインデックスのパラメータと説明は、テーブル作成時にインデックスを作成する場合と同じです。
- データ量が多い場合は、最適な検索パフォーマンスを得るため、データの書き込みを完了してからインデックスを作成することを推奨します。
- HNSW_SQインデックスは、データの書き込み後に作成し、大量の増分データの書き込み後にインデックスを再構築することを推奨します。各インデックスの具体的な作成方法については、以下の具体例を参照してください。
- HNSWインデックスを作成する際、インデックス名の長さが25文字を超える場合は、現在サポートされていません。インデックスの補助テーブル名が
index_nameの制限を超えると異常が発生する可能性があります。将来のバージョンでは、より長いインデックス名がサポートされる予定です。 - 最適な検索パフォーマンスを得るため、ヒープテーブルにHNSWシリーズのインデックスを作成することを推奨します。
構文は以下のとおりです:
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 | 現在 hnsw / hnsw_sq/ hnsw_bq をサポートしています。 |
はい | インデックスタイプを指定します。 | ||
| lib | vsag | vsag | いいえ | ベクトルインデックスライブラリのタイプを指定します。 | 現在VSAGベクトルライブラリのみをサポートしています。 |
| m | 16 | [5,128] | いいえ | 各ノードの最大近傍数です。 | 値が大きいほど、インデックス構築は遅くなりますが、検索性能は向上します。 |
| ef_construction | 200 | [5,1000] | いいえ | インデックス構築時の候補集合のサイズです。 | 値が大きいほど、インデックス構築は遅くなりますが、インデックスの品質は向上します。ef_construction は m より大きい必要があります。 |
| ef_search | 64 | [1,1000] | いいえ | 検索時の候補集合のサイズです。 | 値が大きいほど、検索は遅くなりますが、再現率は高くなります。 |
| extra_info_max_size | 0 | [0,16384] | いいえ | 各主キー情報の最大サイズ(単位:バイト)を設定します。テーブルの主キーをインデックスに格納することで、検索速度を向上させます。 | 0:主キー情報を格納しません。1:サイズ制限を無視して主キー情報を強制的に格納します。この場合、テーブルの主キータイプ(詳細は後述)はサポートされているタイプである必要があります。1 より大きい場合:主キー情報の最大サイズ(単位:バイト)を設定します。この場合、以下の条件を満たす必要があります:
|
| refine_k | 4.0 | [1.0,1000.0] | いいえ |
注意このパラメータは、HNSW_BQインデックスの作成時にのみ指定できます。 |
このパラメータはインデックス作成時に設定することも、検索時に指定することもできます:
|
| refine_type | sq8
注意データベースが旧バージョンからV4.4.2バージョンにアップグレードされた場合、このパラメータのデフォルト値はfp32です。 |
sq8/fp32 | いいえ |
注意このパラメータは、HNSW_BQインデックスの作成時にのみ指定できます。 |
この値は、インデックス構築時のメモリ消費と構築時間を削減することで効率を向上させますが、再現率に影響を与える可能性があります。 |
| bq_bits_query | 32 | 0/4/32 | いいえ |
注意このパラメータは、HNSW_BQインデックスの作成時にのみ指定できます。 |
この値は、インデックス構築時のメモリ消費と構築時間を削減することで効率を向上させますが、再現率に影響を与える可能性があります。 |
| bq_use_fht | true
注意データベースがV4.3.5 BP2バージョンからV4.4.2バージョンにアップグレードされた場合、このパラメータのデフォルト値はfalseです。 |
true/false | いいえ |
注意このパラメータは、HNSW_BQインデックスの作成時にのみ指定できます。 |
extra_info_max_size がサポートする主キーの種類は以下のとおりです:
主キー情報のサイズ計算方法:
SET @table_name = 'test'; -- クエリ対象のtable_nameに置き換えてください
SELECT
CASE
WHEN COUNT(*) <> COUNT(result_value) THEN 'not support'
ELSE COALESCE(SUM(result_value), 'not support')
END AS extra_info_size
FROM (
SELECT
CASE
WHEN vdt.data_type_class IN (1, 2, 3, 4, 6, 8, 9, 14, 27, 28) THEN 8 -- 数値型の場合、extra_info_size += 8
WHEN oc.data_type = 22 THEN oc.data_length -- VARCHAR型の場合、extra_info_size += data_length
ELSE NULL -- その他の型はサポートされていません
END AS result_value
FROM
oceanbase.__all_column oc
JOIN
oceanbase.__all_virtual_data_type vdt
ON
oc.data_type = vdt.data_type
WHERE
oc.rowkey_position != 0
AND oc.table_id = (SELECT table_id FROM oceanbase.__all_table WHERE table_name = @table_name)
) AS result_table;
-- 計算結果は8バイトです
サーチ
HNSWシリーズインデックスのサーチは近似最近傍(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句を指定しない場合、エラーが発生します。
距離関数の使用規則:
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は例外で、距離が大きいほど類似しています。 - 機能:類似度しきい値を指定すると、返される結果には、そのしきい値以上の類似度を持つ結果のみが含まれます。
- サポートされているインデックスタイプ:HNSW、HNSW_SQ、HNSW_BQ。
- サポートされている距離タイプ:
- クエリ時に、
cosine_distanceおよびl2_distance距離タイプのインデックスに類似度を指定できます。l2_distanceの場合、ベクトルにL2ノーマライゼーション処理を施すことを推奨します。これにより、類似度検索の精度が向上します。ベクトルノーマライゼーションの説明と例については、SQL関数の使用 - ベクトルノーマライゼーションを参照してください。 - 距離タイプが
inner_productのインデックスに対してクエリ時に類似度を指定することはサポートされていません(not supportエラーが発生します)。
- クエリ時に、
- 類似度と距離の対応関係:
cosine_distance=2 - 2 * similarityl2_distance=sqrt(1 / similarity -1)
- 構文:
その他の説明:
WHERE条件は、ベクトルインデックス検索のフィルタ条件として使用されます。- 再現率は、構築パラメータと検索パラメータの影響を受けます。
- インデックスの検索パラメータは、インデックス作成時に設定できます。インデックス作成後に調整が必要な場合は、DBMS_VECTOR.REBUILD_INDEX を使用してテーブルレベルの属性を変更するか、クエリ時に検索レベルパラメータ
ef_searchを指定して調整できます。
削除
ベクトルインデックスを削除する構文は以下のとおりです:
DROP INDEX index_name ON table_name;
作成、検索、削除の例
テーブル作成時に作成
HNSWインデックスの例
テストテーブルを作成します。
CREATE TABLE t1(c1 INT, c0 INT, c2 VECTOR(10), c3 VECTOR(10), PRIMARY KEY(c1), VECTOR INDEX idx1(c2) WITH (distance=l2, type=hnsw, lib=vsag), VECTOR INDEX idx2(c3) WITH (distance=l2, type=hnsw, lib=vsag));
テストデータを書き込みます。
INSERT INTO t1 VALUES(1, 1,'[0.203846,0.205289,0.880265,0.824340,0.615737,0.496899,0.983632,0.865571,0.248373,0.542833]', '[0.203846,0.205289,0.880265,0.824340,0.615737,0.496899,0.983632,0.865571,0.248373,0.542833]');
INSERT INTO t1 VALUES(2, 2, '[0.735541,0.670776,0.903237,0.447223,0.232028,0.659316,0.765661,0.226980,0.579658,0.933939]', '[0.213846,0.205289,0.880265,0.824340,0.615737,0.496899,0.983632,0.865571,0.248373,0.542833]');
INSERT INTO t1 VALUES(3, 3, '[0.327936,0.048756,0.084670,0.389642,0.970982,0.370915,0.181664,0.940780,0.013905,0.628127]', '[0.223846,0.205289,0.880265,0.824340,0.615737,0.496899,0.983632,0.865571,0.248373,0.542833]');
近似最近傍探索を実行します。
SELECT * FROM t1 ORDER BY l2_distance(c2, [0.712338,0.603321,0.133444,0.428146,0.876387,0.763293,0.408760,0.765300,0.560072,0.900498]) APPROXIMATE LIMIT 1;
結果は次のとおりです:
+----+------+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+
| c1 | c0 | c2 | c3 |
+----+------+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+
| 3 | 3 | [0.327936,0.048756,0.08467,0.389642,0.970982,0.370915,0.181664,0.94078,0.013905,0.628127] | [0.223846,0.205289,0.880265,0.82434,0.615737,0.496899,0.983632,0.865571,0.248373,0.542833] |
+----+------+-------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------+
1 row in set
HNSW_SQインデックスの例
CREATE TABLE t2 (c1 INT AUTO_INCREMENT, c2 VECTOR(3), PRIMARY KEY(c1), VECTOR INDEX idx1(c2) WITH (distance=l2, type=hnsw_sq, lib=vsag));
HNSW_BQインデックスの例
CREATE TABLE t3 (c1 INT AUTO_INCREMENT, c2 VECTOR(3), PRIMARY KEY(c1), VECTOR INDEX idx3(c2) WITH (distance=l2, type=hnsw_bq, lib=vsag));
HNSW_BQでは、distanceパラメータとして l2 と cosine を指定できます。
後付
HNSWインデックスの例
テストテーブルを作成します。
CREATE TABLE vec_table_hnsw (id INT, c2 VECTOR(10));
HNSWインデックスを作成します。
CREATE VECTOR INDEX vec_idx1 ON vec_table_hnsw(c2) WITH (distance=l2, type=hnsw);
作成したテーブルを確認します。
SHOW CREATE TABLE vec_table_hnsw;
実行結果は次のとおりです:
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| vec_table_hnsw | CREATE TABLE `vec_table_hnsw` (
`id` int(11) DEFAULT NULL,
`c2` VECTOR(10) DEFAULT NULL,
VECTOR KEY `vec_idx1` (`c2`) WITH (DISTANCE=L2, TYPE=HNSW, LIB=VSAG, M=16, EF_CONSTRUCTION=200, EF_SEARCH=64) BLOCK_SIZE 16384
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 2 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
作成したインデックスを確認します。
SHOW INDEX FROM vec_table_hnsw;
実行結果は次のとおりです:
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| vec_table | 1 | vec_idx1 | 1 | c2 | A | NULL | NULL | NULL | YES | VECTOR | available | | YES | NULL |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
1 row in set
HNSW_SQインデックスの例
テストテーブルを作成します。
CREATE TABLE vec_table_hnsw_sq (c1 INT AUTO_INCREMENT, c2 VECTOR(3), PRIMARY KEY(c1));
HNSW_SQインデックスを作成します。
CREATE VECTOR INDEX vec_idx2 ON vec_table_hnsw_sq(c2) WITH (distance=l2, type=hnsw_sq, lib=vsag, m=16, ef_construction = 200);
HNSW_BQインデックスの例
CREATE VECTOR INDEX vec_idx3 ON vec_table_hnsw_bq(c2) WITH (distance=l2, type=hnsw_bq, lib=vsag, m=16, ef_construction = 200);
HNSW_BQインデックスでは、distanceパラメータとして l2 と cosine を指定できます。
削除
DROP INDEX vec_idx1 ON vec_table;
削除されたインデックスを確認します。
SHOW INDEX FROM vec_table;
実行結果は次のとおりです:
Empty set