はじめに
OracleDB で使用できるベクトル索引には、Hierarchical Navigable Small World (HNSW) に基づいたインメモリ近傍グラフ・ベクトル索引と、Inverted File Flat (IVF) に基づいた近傍パーティション・ベクトル索引の 2種類があります。
↑の資料を読み進めていくとインメモリ近傍グラフ・ベクトルは「索引作成コストがやや大きい」との記載があり、「作成に時間がかかるということ?」とハテナになったので、計測してみます。
手順・前提
下記の手順をインメモリ近傍グラフ・ベクトル索引と近傍パーティション・ベクトル索引で 3セットずつ実施します。ついでに索引サイズも計測します (⑤ - ③)。
環境は Oracle Autonomous AI Database Always Free です。
① 4,096次元のベクトル型の列を持つテーブルを作成
② 1,000件のベクトルデータを INSERT
③ USER_SEGMENTS を集計
④ ベクトル索引を作成 (所要時間を計測)
⑤ USER_SEGMENTS を集計
⑥ ベクトル索引を削除
⑦ ②に戻る (終了条件:ベクトルデータが 10,000件)
CREATE TABLE testtab_hnsw3 (
vec VECTOR(4096, FLOAT32) NOT NULL
);
INSERT /*+ APPEND */ INTO testtab_hnsw3 (vec)
SELECT v.vec
FROM (
SELECT LEVEL AS rn
FROM dual
CONNECT BY LEVEL <= 1000
) t
CROSS APPLY (
SELECT TO_VECTOR(
JSON_ARRAYAGG(val ORDER BY dim RETURNING CLOB),
4096,
FLOAT32
) AS vec
FROM (
SELECT LEVEL AS dim,
ROUND(DBMS_RANDOM.VALUE(0, 1) + 0 * t.rn, 6) AS val
FROM dual
CONNECT BY LEVEL <= 4096
)
) v;
--近傍パーティション・ベクトル索引の場合は organization の後を neighbor partitions に変更
create vector index testtab_hnsw3_vec_idx on testtab_hnsw3(vec)
organization inmemory neighbor graph;
結果
作成所要時間
下表の通りとなりました。
| データ件数 | HNSW #1 | HNSW #2 | HNSW #3 | IVF #1 | IVF #2 | IVF #3 |
|---|---|---|---|---|---|---|
| 1,000件 | 00:00.54 | 00:00.56 | 00:00.53 | 00:04.97 | 00:05.88 | 00:06.21 |
| 2,000件 | 00:03.32 | 00:03.04 | 00:03.32 | 00:08.67 | 00:08.82 | 00:09.23 |
| 3,000件 | 00:07.50 | 00:07.45 | 00:07.63 | 00:12.46 | 00:12.37 | 00:12.62 |
| 4,000件 | 00:13.41 | 00:13.83 | 00:13.10 | 00:15.32 | 00:15.95 | 00:15.25 |
| 5,000件 | 00:20.87 | 00:20.12 | 00:19.94 | 00:18.73 | 00:19.63 | 00:17.93 |
| 6,000件 | 00:30.17 | 00:29.84 | 00:29.54 | 00:29.15 | 00:25.13 | 00:23.31 |
| 7,000件 | 00:39.51 | 00:40.29 | 00:38.52 | 00:52.67 | 00:26.80 | 00:32.57 |
| 8,000件 | 00:49.22 | 00:51.25 | 00:51.10 | 00:31.05 | 00:30.81 | 00:40.27 |
| 9,000件 | 01:00.65 | 01:03.74 | 01:01.72 | 00:57.63 | 00:31.36 | 00:34.17 |
| 10,000件 | 01:13.93 | 01:18.17 | 01:15.20 | 00:35.17 | 00:33.67 | 00:36.50 |
グラフにすると下図の通り。インメモリ近傍グラフ・ベクトル索引と比較して、近傍パーティション・ベクトル索引は傾きが緩やかであることがわかります。
サイズ (MB)
下表の通りとなりました。
| データ件数 | HNSW #1 | HNSW #2 | HNSW #3 | IVF #1 | IVF #2 | IVF #3 |
|---|---|---|---|---|---|---|
| 1,000件 | 16.3 | 16.3 | 16.3 | 251.3 | 299.4 | 323.4 |
| 2,000件 | 18.8 | 18.8 | 18.8 | 447.6 | 438.7 | 464.1 |
| 3,000件 | 19.8 | 19.8 | 19.8 | 605.6 | 591.6 | 591.6 |
| 4,000件 | 18.8 | 18.9 | 18.8 | 770.8 | 802.7 | 705.3 |
| 5,000件 | 18.9 | 19.9 | 19.8 | 903.6 | 887.6 | 958.6 |
| 6,000件 | 19.9 | 19.9 | 19.8 | 1201.4 | 1182.3 | 1163.3 |
| 7,000件 | 19.9 | 21.0 | 20.9 | 1311.9 | 1283.8 | 1302.9 |
| 8,000件 | 20.0 | 20.0 | 21.0 | 1407.5 | 1384.4 | 1484.9 |
| 9,000件 | 21.0 | 34.0 | 21.0 | 1459.8 | 1449.8 | 1577.5 |
| 10,000件 | 21.1 | 21.1 | 22.1 | 1569.4 | 1558.3 | 1745.4 |
グラフにすると下図の通り。インメモリ近傍グラフ・ベクトル索引と比較して、近傍パーティション・ベクトル索引は 10倍以上大きくなることがわかります。
要件・制約を整理して、より適切なベクトル索引を作成・使用しましょう![]()

