AnalyticDB for PostgreSQL V7.0 の次世代ベクトルエンジンである Nova は、卓越したクエリパフォーマンスとコスト効率を実現します。コスト効率の高いディスクベース (Novad) モードと、パフォーマンス専有型のメモリベース (Novam) モードの 2 つのモードを提供します。このトピックでは、Nova ベクターインデックスの選択方法と作成方法について説明します。
メリット
Nova ベクターインデックスは、従来の HNSW インデックスと比較して、主に次のメリットがあります。
クエリパフォーマンスの向上:ベクタークエリの高速化を実現します。
メモリ効率の最適化:ディスクベース (Novad) のインデックスはメモリ使用量を削減し、優れたコスト効率を提供します。
書き込みスループットの向上:データインジェストとインデックス構築を分離することで、ベクトルデータの書き込み効率を向上させます。
前提条件
マイナーバージョンが 7.4.2.0 以降の AnalyticDB for PostgreSQL V7.0 インスタンス。
ベクトルエンジンの最適化機能が有効になっていること。
容量評価とインデックスの選択
Nova ベクターインデックスには、ディスクベース (Novad) とメモリベース (Novam) の 2 つのモードがあります。
ディスクベース (Novad):グラフとパーティションベースのハイブリッドインデックスを使用します。HNSW グラフはメモリに常駐し、転置ファイル (IVF) インデックスはディスクに保存されます。この設計はディスク I/O に最適化されており、インデックスサイズがメモリ容量を大幅に超えても安定したパフォーマンスを保証します。Novam と比較して、Novad はメモリフットプリントが小さく、インデックス構築のパフォーマンスが高く、ディスク使用率が低いです。大規模でコスト効率の高い取得シナリオに最適であり、数百億から数千億規模のベクトルデータセットに対して、大きなコストメリットをもたらします。
メモリベース (Novam):グラフインデックスの実装を使用します。そのパフォーマンスは、使用可能なメモリ容量に比例して向上し、メモリが不足すると自動的にディスクにスピルします。十分なメモリがあれば、同じリソース仕様の Novad よりも優れたクエリパフォーマンスを発揮します。リアルタイムレコメンデーションなどのパフォーマンス専有型シナリオに最適です。
Nova ベクターインデックスはバックグラウンドで定期的な最適化タスクを実行するため、アクティブなワークロードがない場合でもリソースを消費する可能性があります。
以下の表は、さまざまなベクトル次元とベクトル数に対する推奨リソース仕様の例です。これらは一例であり、より大規模なデータセットをサポートするために、リソースを追加することも可能です。
Novad
ベクトル次元 | ベクトル数 | 推奨計算リソース |
128 | 3.2 億未満 | 8 コア |
256 | 1.6 億未満 | |
512 | 8000 万未満 | |
768 | 5000 万未満 | |
1024 | 4000 万未満 | |
1536 | 2600 万未満 | |
2048 | 2000 万未満 | |
128 | 6.4 億未満 | 16 コア |
256 | 3.2 億未満 | |
512 | 1.6 億未満 | |
768 | 1 億未満 | |
1024 | 8000 万未満 | |
1536 | 6000 万未満 | |
2048 | 4000 万未満 | |
128 | 12.8億未満 | 32 コア |
256 | 6.4 億未満 | |
512 | 3.2 億未満 | |
768 | 2 億未満 | |
1024 | 1.6 億未満 | |
1536 | 1.2 億未満 | |
2048 | 8000 万未満 | |
128 | 51.2 億未満 | 128 コア |
256 | 25.6 億未満 | |
512 | < 12.8億 | |
768 | 8 億未満 | |
1024 | 6.4 億未満 | |
1536 | 4.8 億未満 | |
2048 | 3.2 億未満 | |
128 | 2000 億未満 | 4,096 コア |
256 | 1000 億未満 | |
512 | 500 億未満 | |
768 | 330 億未満 | |
1024 | 250 億未満 | |
1536 | 160 億未満 | |
2048 | 120 億未満 | |
128 | 1.6 兆未満 | 32,768 コア |
256 | 8000 億未満 | |
512 | 4000 億未満 | |
768 | 2600 億未満 | |
1024 | 2000 億未満 | |
1536 | 1300 億未満 | |
2048 | 1000 億未満 |
Novam
ベクトル次元 | ベクトル数 | 推奨計算リソース |
128 | 3200 万未満 | 8 コア |
256 | 1600 万未満 | |
512 | 800 万未満 | |
768 | 500 万未満 | |
1024 | 400 万未満 | |
1536 | 260 万未満 | |
2048 | 200 万未満 | |
128 | 6400 万未満 | 16 コア |
256 | 3200 万未満 | |
512 | 1600 万未満 | |
768 | 1000 万未満 | |
1024 | 800 万未満 | |
1536 | 500 万未満 | |
2048 | 400 万未満 | |
128 | 1.28 億未満 | 32 コア |
256 | 6400 万未満 | |
512 | 3200 万未満 | |
768 | 2000 万未満 | |
1024 | 1600 万未満 | |
1536 | 1000 万未満 | |
2048 | 800 万未満 |
構文
CREATE INDEX [INDEX_NAME]
ON [SCHEMA_NAME].[TABLE_NAME]
USING ANN(COLUMN_NAME)
WITH (DIM=<DIMENSION>,
ALGORITHM=<ALGORITHM>,
DISTANCEMEASURE=<MEASURE>,
...);パラメーター:
INDEX_NAME:インデックスの名前。
SCHEMA_NAME:スキーマ (名前空間) の名前。
TABLE_NAME:テーブルの名前。
COLUMN_NAME:ベクトル列の名前。
その他のベクターインデックスパラメーター:
パラメーター
説明
デフォルト値
値
dim
ベクトルの次元。
なし (必須)
[1, 8192]
algorithm
インデックス作成アルゴリズム。有効な値:
novam:量子化なしのグラフベースのインデックス。
novad:rabitq 量子化を使用したパーティションベースのインデックス。
hnswflat:量子化なしの HNSW インデックス。
hnswflat
(novam, novad, hnswflat)
distancemeasure
類似検索のための距離メジャー。有効な値:
L2:ユークリッド距離の二乗関数を使用してインデックスを構築します。通常、画像類似検索に使用されます。式:

IP:内積の逆数関数を使用してインデックスを構築します。ベクトルが正規化された後、コサイン類似度の代替としてよく使用されます。式:

COSINE:コサイン距離関数を使用してインデックスを構築します。通常、テキストの類似検索に使用されます。式:

l2
(L2, IP, COSINE)
max_delta_vecs
1 回の書き込み操作でバッチ処理されるベクトルの最大数。
1048576
[1024, 1073741824]
hnsw_m
Novam の場合、グラフ内の各ノードの近傍数を指定します。値を大きくすると、一般的にグラフの品質は向上しますが、構築時間が増加します。
16
[10, 1000]
hnsw_ef_construction
Novam の場合、インデックス構築時の検索候補セットのサイズを定義します。値を大きくすると、グラフの品質は向上しますが、構築時間が増加します。
64
[40, 4000]
base_slice_log2_size
Novam の場合、ファイルスライスサイズの底 2 の対数です。
24
[10, 30]
nlist
Novad の場合、パーティションベースのインデックス内のリスト数を指定します。
1024
[2, 1073741824]
accel_m
Novad の場合、加速レイヤーの近傍数を指定します。
16
[8, 1024]
accel_efc
Novad の場合、加速レイヤーを構築するための検索候補セットのサイズを定義します。
128
[1, 32768]
rabitq_bits
rabitq 圧縮に使用されるビット数。
1
[1, 8]
max_cluster_vecs
Novad の場合、単一ファイル内の 1 つの重心に対するベクトルの最大数です。
65536
[1, 10000000]
例
サンプルテーブルを作成します。
CREATE TABLE chunks ( id SERIAL PRIMARY KEY, chunk VARCHAR(1024), intime TIMESTAMP, url VARCHAR(1024), feature REAL[] ) DISTRIBUTED BY (id);ベクトル列に Nova ベクターインデックスを作成します。
コサイン距離を使用する Novad ベクターインデックスを作成します。
CREATE INDEX idx_feature_novad_cosine ON chunks USING ann(feature) WITH ( dim=1536, algorithm=novad, distancemeasure=cosine, nlist=4096, rabitq_bits=1 );ユークリッド距離を使用する Novam ベクターインデックスを作成します。
CREATE INDEX idx_feature_novam_l2 ON chunks USING ann(feature) WITH ( dim=1536, algorithm=novam, distancemeasure=l2, hnsw_m=32, hnsw_ef_construction=200 );