AlloyDB for PostgreSQL のカラム型エンジンを使用すると、Scalable Nearest Neighbors(ScaNN)インデックスまたは Hierarchical Navigable Small World(HNSW)インデックスを使用するベクトル検索を高速化できます。カラム型エンジンは、読み取りに最適化されたインメモリ表現でベクトル インデックスをキャッシュに保存することで、メモリから直接クエリを処理し、ベクトル検索ワークロードの秒間クエリ数(QPS)を増やします。
カラム型エンジンで HNSW を使用できるのは、PostgreSQL 17 以降を実行している AlloyDB クラスタのみです。カラム型エンジンを使用する ScaNN には、このような制限はありません。
始める前に
google_columnar_engine.enabledデータベース フラグとgoogle_columnar_engine.enable_index_cachingデータベース フラグをonに設定して、カラム型エンジンとそのインデックス キャッシュ機能を有効にします。gcloud alloydb instances update INSTANCE_ID \ --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \ --region=REGION \ --cluster=CLUSTER_ID \ --project=PROJECT_ID次のように置き換えます。
INSTANCE_ID: カラム型エンジンを有効にするインスタンスの ID。REGION: インスタンスが配置されているリージョン(例:us-central1)。CLUSTER_ID: インスタンスが配置されているクラスタの ID。PROJECT_ID: クラスタが配置されているプロジェクトの ID。
フラグの設定方法については、データベース フラグを構成するをご覧ください。
データベースに ScaNN インデックスを作成するか、HNSW インデックスを作成します。
カラム型エンジンにインデックスを追加する
カラム型エンジンを有効にすると、google_columnar_engine_add_index() SQL 関数を使用して既存のインデックスをキャッシュに追加できます。
カラム型エンジンにインデックスを追加する手順は次のとおりです。
Google Cloud コンソールで、[クラスタ] ページに移動します。
クラスタの [概要] ページを表示するには、[リソース名] 列で AlloyDB クラスタの名前をクリックします。
ナビゲーション パネルで [AlloyDB Studio] をクリックします。
データベースの名前、ユーザー名、パスワードを使用して AlloyDB Studio にログインします。
[エディタ 1] タブに、次のクエリを入力します。
SELECT google_columnar_engine_add_index('INDEX_NAME');INDEX_NAMEは、ベクトル インデックスの名前に置き換えます。- [実行] をクリックします。
カラム型エンジンにインデックスを追加すると、このインデックスを使用するすべてのクエリがカラム型エンジンによって自動的に高速化されます。クエリで EXPLAIN (ANALYZE, COLUMNAR_ENGINE) プランを使用すると、ベクトルクエリがカラム型エンジンによって高速化されていることを確認できます。
キャッシュの使用状況を確認する
ベクトルクエリがカラム型エンジンによって高速化されていることを確認するには、クエリで EXPLAIN (ANALYZE, COLUMNAR_ENGINE) プランを使用します。
ScaNN 実行プランの例(プレビュー)
次の例は、カラム型エンジンに追加された ScaNN インデックスを使用するクエリの実行プランです。
EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;
--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
Limit: 100
ScaNN Info: (... columnar engine nodes hit=6...)
Columnar Engine ScaNN Info: (index found=true)
(5 rows)
出力に columnar engine nodes hit と Columnar Engine ScaNN Info:
(index found=true) が含まれている場合は、クエリにカラム型エンジンが使用されています。
HNSW 実行プランの例
実行プランには、それぞれのインデックスの [カラム型エンジン HNSW 情報] セクションが表示されます。このセクションには、カラム型エンジン(elements_from_ce)とディスク(elements_from_disk)から取得された要素の比率などの指標が表示されます。
次の例は、カラム型エンジンに追加された HNSW インデックスを使用するクエリの実行プランです。
EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;
--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Limit (actual rows=5 loops=1)
-> Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
Columnar Check: table is not in the columnar store
(5 rows)
レスポンスは、すべての要素がカラム型エンジン(elements_from_ce=385)から取得され、ディスク(elements_from_disk=0)から取得された要素がないため、インデックスがカラム型エンジンによって高速化されていることを示しています。
INSERT、UPDATE、DELETE ステートメントなどのデータ変更によってキャッシュ エントリが無効になると、カラム型エンジンはハイブリッド アプローチを使用して精度とパフォーマンスを維持します。有効なキャッシュに保存されたベクトルをメモリから直接読み取り、変更されたベクトルまたは新しいベクトルのみをディスクからフェッチします。
大量のデータを変更すると、キャッシュが更新されるまで、elements_from_disk が一時的に増加し、パフォーマンスが低下することがあります。
キャッシュに保存されたインデックスを管理する
キャッシュに保存されたインデックスのライフサイクルを管理する手順は次のとおりです。
Google Cloud コンソールで、[クラスタ] ページに移動します。
クラスタの [概要] ページを表示するには、[リソース名] 列で AlloyDB クラスタの名前をクリックします。
ナビゲーション パネルで [AlloyDB Studio] をクリックします。
データベースの名前、ユーザー名、パスワードを使用して AlloyDB Studio にログインします。
[エディタ 1] タブで、選択したタスクの SQL コマンドを入力します。
キャッシュを手動で更新するには、次のコマンドを実行します。
SELECT google_columnar_engine_refresh_index('INDEX_NAME');インデックスのステータスを確認するには、次のコマンドを実行します。
SELECT google_columnar_engine_verify('INDEX_NAME');キャッシュからインデックスを削除するには、次のコマンドを実行します。
SELECT google_columnar_engine_drop_index('INDEX_NAME');アクティブなインデックスを表示するには、次のコマンドを実行します。
SELECT * FROM g_columnar_indexes;パーティション分割インデックスを表示するには、次のコマンドを実行します。
SELECT * FROM g_columnar_index_partitions;
INDEX_NAMEは、インデックスの名前に置き換えます。[実行] をクリックします。
制限事項
カラム型エンジンで高速化された HNSW インデックスを更新すると、インデックス サイズの最大 2 倍のメモリが一時的に消費されることがあります。
次のステップ
- HNSW インデックスを作成する
- ScaNN インデックスを作成する
- AlloyDB のカラム型エンジンについて
- カラム型エンジンで ScaNN インデックスを管理する(プレビュー)
- ベクトル検索を実行する