1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vector Pool と INDEX_VECTOR_MEMORY_ADVISOR

1
Last updated at Posted at 2026-05-07

Vector Pool は OracleDB 23ai で登場した SGAコンポーネントで、Oracle AI Vector Search で利用されます。
具体的には、インメモリ近傍グラフベクトル索引 (HNSW) と 近傍パーティションベクトル索引 (IVF) に関する情報の格納や操作に利用されます。

Vector Pool を有効にする (≒ベクトル索引を利用する) には、初期化パラメータvector_memory_sizeにゼロ以外の値を設定します。

ADB-S でvector_memory_sizeを確認するとゼロとなっており、変更不可でした。(ユーザは ADMIN を使用)

SQL> show parameter vector
NAME                               TYPE        VALUE
---------------------------------- ----------- -------
inmemory_deep_vectorization        boolean     TRUE
spatial_vector_acceleration        boolean     TRUE
vector_index_neighbor_graph_reload string      RESTART
vector_memory_size                 big integer 0
vector_query_capture               string      ON
SQL>
SQL>
SQL> ALTER SYSTEM SET vector_memory_size=1G SCOPE=BOTH;

Error starting at line : 1 in command -
ALTER SYSTEM SET vector_memory_size=1G SCOPE=BOTH
Error report -
ORA-01031: insufficient privileges

https://docs.oracle.com/error-help/db/ora-01031/
01031. 00000 -  "insufficient privileges"
*Document: YES
*Cause:    A database operation was attempted without the required
           privilege(s).
*Action:   Ask your database administrator or security administrator to grant
           you the required privilege(s).
SQL>

改めてマニュアルを確認すると、vector_memory_sizeは ADB-S では明示的に設定することはできず、動的に拡大・縮小するようです。

Autonomous AI Databaseサーバーレス・サービス(ADB-S)を使用する場合、SGA関連のメモリー・パラメータを明示的に設定することはできません。これには、ベクトル・プール・サイズの直接変更が含まれます。
ADB-Sでは、ベクトル・プールは動的に拡大および縮小できます。

ベクトル・プール・サイズの増加は、HNSW索引の作成およびHNSW索引を含むPDBの再オープンによって自動的にトリガーされます。
ベクトル・プール・サイズの縮小は、HNSW索引の削除、PDBのクローズおよびCPUの削減によって自動的にトリガーされます。

HNSW索引の作成が拡大のトリガーとなっているようなので、索引を作成したところ拡大を確認できました。

SQL> show parameter vector_
NAME                               TYPE        VALUE
---------------------------------- ----------- -------
inmemory_deep_vectorization        boolean     TRUE
spatial_vector_acceleration        boolean     TRUE
vector_index_neighbor_graph_reload string      RESTART
vector_memory_size                 big integer 0
vector_query_capture               string      ON

SQL> CREATE TABLE testtab (
  2    vec VECTOR(4096, FLOAT32) NOT NULL
  3* );

Table TESTTAB created.

SQL> INSERT /*+ APPEND */ INTO testtab (vec)
  2  SELECT v.vec
  3  FROM (
  4    SELECT LEVEL AS rn
  5    FROM dual
  6    CONNECT BY LEVEL <= 5000
  7  ) t
  8  CROSS APPLY (
  9    SELECT TO_VECTOR(
 10             JSON_ARRAYAGG(val ORDER BY dim RETURNING CLOB),
 11             4096,
 12             FLOAT32
 13           ) AS vec
 14    FROM (
 15      SELECT LEVEL AS dim,
 16             ROUND(DBMS_RANDOM.VALUE(0, 1) + 0 * t.rn, 6) AS val
 17      FROM dual
 18      CONNECT BY LEVEL <= 4096
 19    )
 20* ) v;

5,000 rows inserted.

SQL> commit;

Commit complete.

SQL> create vector index testtab_vec_idx on testtab(vec)
  2* organization inmemory neighbor graph;

Vector INDEX created.

SQL> show parameter vector_
NAME                               TYPE        VALUE
---------------------------------- ----------- ---------
inmemory_deep_vectorization        boolean     TRUE
spatial_vector_acceleration        boolean     TRUE
vector_index_neighbor_graph_reload string      RESTART
vector_memory_size                 big integer 187578594   ★拡大
vector_query_capture               string      ON
SQL>

インメモリ近傍グラフベクトル索引 (HNSW) を使用する場合多くのメモリが必要となるため、Vector Pool のサイジングがポイントとなります。
Vector Pool のサイジングに活用できるのが、INDEX_VECTOR_MEMORY_ADVISORプロシージャです。
INDEX_VECTOR_MEMORY_ADVISORプロシージャを使用して、ベクトル索引に必要なメモリサイズをシミュレーション可能です。
ベクトルデータの次元数・件数等を指定するか、既に存在するベクトルデータを持つ列を指定可能です。

ベクトルデータの次元数・件数等を指定
SQL> SET SERVEROUTPUT ON;
DECLARE
    response_json CLOB;
BEGIN
    DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
        INDEX_TYPE=>'HNSW',
        NUM_VECTORS=>5000,
SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>5000,
  7          DIM_COUNT=>4096,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 105 MB


PL/SQL procedure successfully completed.

SQL>
既に存在するベクトルデータを持つ列を指定
SQL> SET SERVEROUTPUT ON;
DECLARE
    response_json CLOB;
BEGIN
    DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
        'ADMIN',
SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          'ADMIN',
  6          'TESTTAB',
  7          'VEC',
  8          'HNSW',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 105 MB


PL/SQL procedure successfully completed.

SQL> info testtab
TABLE: TESTTAB
         LAST ANALYZED:2026-04-23 09:27:33.0
         ROWS         :5000
         SAMPLE SIZE  :5000
         INMEMORY     :DISABLED
         COMMENTS     :

Columns
NAME         DATA TYPE                    NULL  DEFAULT    COMMENTS
 VEC         VECTOR(4096,FLOAT32,DENSE)   No

768次元・FLOAT32 で 10万件から 10万件ずつ件数を増やしていくと、下記のようになりました。

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>100000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 396 MB


PL/SQL procedure successfully completed.

SQL>
SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>200000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 789 MB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>300000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 2 GB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>400000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 2 GB


PL/SQL procedure successfully completed.

SQL>
DECLARE
    response_json CLOB;
BEGIN
    DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
        INDEX_TYPE=>'HNSW',
SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>500000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 2 GB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>600000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 3 GB


PL/SQL procedure successfully completed.

SQL>
SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>700000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 3 GB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>800000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 4 GB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>900000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 4 GB


PL/SQL procedure successfully completed.

SQL> DECLARE
  2      response_json CLOB;
  3  BEGIN
  4      DBMS_VECTOR.INDEX_VECTOR_MEMORY_ADVISOR(
  5          INDEX_TYPE=>'HNSW',
  6          NUM_VECTORS=>1000000,
  7          DIM_COUNT=>768,
  8          DIM_TYPE=>'FLOAT32',
  9          RESPONSE_JSON=>response_json);
 10  END;
 11* /
Using default accuracy: 90%
Suggested vector memory pool size: 4 GB


PL/SQL procedure successfully completed.

SQL>

机上で試算※すると下記の通りですので、1GB以降は大胆に丸めているようです。
※次元数 × フォーマットサイズ × 件数 × 1.3 (オーバーヘッド)

件数 サイズ (MB)
100,000 381
200,000 762
300,000 1143
400,000 1523
500,000 1904
600,000 2285
700,000 2666
800,000 3047
900,000 3428
1,000,000 3809
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?