すべてのプロダクト
Search
ドキュメントセンター

Hologres:Proxima Graph インデックス

最終更新日:Jun 23, 2026

Hologres のベクトル処理機能は、類似検索、画像取得、シーン認識に最適です。この機能を使用すると、データ処理と分析を強化し、より正確な検索とレコメンデーション機能を実現できます。このトピックでは、Hologres で Proxima を使用してベクトル処理を行う方法を説明し、完全な使用例を紹介します。

操作手順

  1. Hologres インスタンスへの接続

    開発ツールを使用して Hologres インスタンスに接続します。詳細については、「開発ツールへの接続」をご参照ください。JDBC を使用して接続する場合は、PreparedStatement モードを使用してください。

  2. Proxima 拡張機能のインストール

    Proxima は拡張機能として Hologres に接続します。Proxima を使用する前に、スーパーユーザーが次のコマンドを実行して Proxima 拡張機能をインストールする必要があります。

    --Proxima 拡張機能をインストールします。
    CREATE EXTENSION proxima;

    Proxima 拡張機能はデータベースレベルでインストールされます。データベースごとに 1 回インストールするだけで済みます。拡張機能をアンインストールするには、次のコマンドを実行します。

    DROP EXTENSION proxima;
    重要

    DROP EXTENSION <extension_name> CASCADE; コマンドを使用して拡張機能をアンインストールしないでください。CASCADE オプションは、指定された拡張機能を削除するだけでなく、PostGIS、RoaringBitmap、Proxima、Binlog、BSI データなどのすべての拡張機能データ、およびメタデータ、テーブル、ビュー、サーバーデータなど、拡張機能に依存するすべてのオブジェクトも削除します。

  3. ベクトルテーブルとベクトルインデックスの作成

    Hologres では、ベクトルは通常 FLOAT4 配列として表現されます。ベクトルテーブルを作成するための構文は次のとおりです。

    説明
    • ベクトルインデックスは、列指向テーブルと行列ハイブリッドテーブルでのみサポートされます。行指向テーブルはサポートされていません。

    • ベクトルを定義する際は、配列のディメンションを 1 に設定する必要があります。array_ndimsarray_length の両方の 2 番目のパラメーターを 1 に設定する必要があります。

    • Hologres V2.0.11 以降では、ベクトルインデックスを作成する前にデータをインポートできます。このアプローチにより、ファイルのコンパクション中にインデックスを構築する必要がなくなるため、インデックスの作成時間が短縮されます。

    • データをインポートする前にベクトルインデックスを作成する:このメソッドは、リアルタイムデータのシナリオに適しています。

      --単一のインデックスを設定
      BEGIN;
      CREATE TABLE feature_tb (
          id BIGINT,
          feature_col FLOAT4[] CHECK(array_ndims(feature_col) = 1 AND array_length(feature_col, 1) = <value>) --ベクトルを定義
      );
      CALL set_table_property(
      'feature_tb', 
      'proxima_vectors', 
      '{"<feature_col>":{"algorithm":"Graph",
      "distance_method":"<value>",
      "builder_params":{"min_flush_proxima_row_count" : 1000, 
      "min_compaction_proxima_row_count" : 1000, 
      "max_total_size_to_merge_mb" : 2000}}}'); --ベクトルインデックスを構築
      COMMIT;
      --複数のインデックスを設定
      BEGIN;
      CREATE TABLE t1 (
          f1 INT PRIMARY KEY,
          f2 FLOAT4[] NOT NULL CHECK(array_ndims(f2) = 1 AND array_length(f2, 1) = 4),
          f3 FLOAT4[] NOT NULL CHECK(array_ndims(f3) = 1 AND array_length(f3, 1) = 4)
      );
      CALL set_table_property(
      't1',  
      'proxima_vectors', 
      '{"f2":{"algorithm":"Graph",
      "distance_method":"InnerProduct",
      "builder_params":{"min_flush_proxima_row_count" : 1000, 
      "min_compaction_proxima_row_count" : 1000, 
      "max_total_size_to_merge_mb" : 2000}},
      "f3":{"algorithm":"Graph",
      "distance_method":"InnerProduct",
      "builder_params":{"min_flush_proxima_row_count" : 1000, 
      "min_compaction_proxima_row_count" : 1000, 
      "max_total_size_to_merge_mb" : 2000}}}');
      COMMIT;
    • ベクトルインデックスを作成する前にデータをインポートする:このメソッドは、オフライン分析のシナリオに適しています。

      説明

      Hologres V2.1.17 以降、Serverless Computing がサポートされています。大規模なベクトルデータセットのオフラインインポートや大規模なベクトルクエリなどのシナリオでは、Serverless Computing を使用して追加のサーバーレスリソースを活用できます。このアプローチにより、インスタンス自体のリソースを使用することを回避でき、インスタンスの安定性が大幅に向上し、メモリ不足 (OOM) エラーのリスクが軽減されます。課金はタスクに対してのみ行われます。Serverless Computing の詳細については、「Serverless Computing」をご参照ください。この機能の使用方法については、「Serverless Computing の使用」をご参照ください。

      --単一のインデックスを設定
      BEGIN;
      CREATE TABLE feature_tb (
          id BIGINT,
          feature_col FLOAT4[] CHECK(array_ndims(feature_col) = 1 AND array_length(feature_col, 1) = <value>) --ベクトルを定義
      );
      COMMIT;
      -- (オプション) 大規模なオフラインインポートと ETL には Serverless Computing の使用を推奨します。
      SET hg_computing_resource = 'serverless';
      -- データをインポート
      INSERT INTO feature_tb ...;
      VACUUM feature_tb;
      -- ベクトルインデックスを構築
      CALL set_table_property(
      'feature_tb', 
      'proxima_vectors', 
      '{"<feature_col>":{"algorithm":"Graph",
      "distance_method":"<value>",
      "builder_params":{"min_flush_proxima_row_count" : 1000, 
      "min_compaction_proxima_row_count" : 1000, 
      "max_total_size_to_merge_mb" : 2000}}}'); 
      -- 不要な SQL ステートメントがサーバーレスリソースを使用しないように構成をリセットします。
      RESET hg_computing_resource;

    次の表にパラメーターを示します。

    カテゴリ

    パラメーター

    説明

    基本的なベクトルプロパティ

    feature_col

    ベクトル列の名前。

    feature

    array_ndims

    ベクトルのディメンション。1次元ベクトルのみがサポートされています。

    次の例は、長さ 4 の 1次元ベクトルを作成する方法を示しています。

    feature float4[] check(array_ndims(feature) = 1 and array_length(feature, 1) = 4)

    array_length

    ベクトルの長さ。最大値は 1,000,000 です。

    ベクトルインデックス設定

    proxima_vectors

    ベクトルインデックスのプロパティを指定します。これは、次のパラメーターを含む JSON 文字列です:

    • algorithm:ベクトルインデックスの構築に使用されるアルゴリズム。現在、Graph のみがサポートされています。

    • distance_method:ベクトルインデックスの構築に使用される距離関数。次の距離関数がサポートされています:

      • (推奨) SquaredEuclidean:2乗ユークリッド距離を計算します。この関数は最高のクエリパフォーマンスを提供し、pm_approx_squared_euclidean_distance 関数を使用するクエリに適しています。

      • Euclidean:ユークリッド距離を計算します。この関数は、pm_approx_euclidean_distance 関数を使用するクエリにのみ適しています。

      • (注意して使用) InnerProduct:内積距離を計算します。内部的に、この計算は平方根を含むユークリッド距離の計算に変換されます。この変換により、インデックス作成とクエリの両方に計算オーバーヘッドが追加され、効率が低下します。ビジネス要件で必要な場合を除き、この関数の使用は避けてください。pm_approx_inner_product_distance 関数を使用するクエリにのみ適しています。

    • builder_params:インデックス構築プロセスを制御するパラメーターを指定する JSON 形式の文字列。次のパラメーターが含まれます:

      • min_flush_proxima_row_count:データがディスクにフラッシュされるときにインデックスを構築するために必要な最小行数。推奨値は 1,000 です。

      • min_compaction_proxima_row_count:データがディスク上でコンパクションされるときにインデックスを構築するために必要な最小行数。推奨値は 1,000 です。

      • max_total_size_to_merge_mb:データのコンパクション中にマージされるファイルの最大サイズ (MB)。推奨値は 2,000 です。

    • proxima_builder_thread_count:データ書き込み中にベクトルインデックスを構築するために使用されるスレッド数。デフォルト値は 4 です。通常、この値を変更する必要はありません。

    説明

    次の例は、2乗ユークリッド距離を使用するクエリ用にベクトルインデックスを構築する方法を示しています。

    call set_table_property(
    'feature_tb', 
    'proxima_vectors', 
    '{"feature":{"algorithm":"Graph",
    "distance_method":"SquaredEuclidean",
    "builder_params":{"min_flush_proxima_row_count" : 1000, 
    "min_compaction_proxima_row_count" : 1000, 
    "max_total_size_to_merge_mb" : 2000}}}');
  4. ベクトルデータのインポート

    ベクトルテーブルには、オフラインモードまたはリアルタイムモードでデータをインポートできます。 バッチインポート後、クエリパフォーマンスを向上させるために VACUUM および ANALYZE コマンドを実行する必要があります。

    • VACUUM コマンドは、バックエンドファイルをより大きなファイルにコンパクションすることでクエリ効率を向上させます。このプロセスは CPU リソースを消費し、その持続時間はテーブルサイズとともに増加します。VACUUM プロセスが実行中の場合は、完了するまで待ってください。

      VACUUM <tablename>;
    • ANALYZE コマンドは、クエリオプティマイザ (QO) がより効率的な実行計画を生成するために使用する統計情報を収集します。

      analyze <tablename>;
  5. ベクトルデータのクエリ

    Hologres は、完全一致クエリと近似一致クエリの両方をサポートしています。プレフィックスが pm_ のユーザー定義関数 (UDF) は完全一致クエリを実行し、プレフィックスが pm_approx_ の UDF は近似一致クエリを実行します。近似一致クエリのみがベクトルインデックスを使用できます。ベクトルインデックスが構築されているシナリオでは、パフォーマンス向上のために近似一致クエリを使用することを推奨します。ベクトルインデックスは、単一テーブルクエリでのみ使用できます。単一テーブルのベクトルクエリを優先し、JOIN 操作は避けてください。

    • 近似一致クエリ (ベクトルインデックスを使用)

      近似クエリはベクトルインデックスを利用できるため、大量のデータを高い実行効率でスキャンする必要があるシナリオに適しています。デフォルトでは、再現率は 99% 以上です。ベクトルインデックスを使用するには、対応する距離計算関数に approx_ プレフィックスを追加するだけです。対応する距離計算関数は次のとおりです:

      説明
      • 2乗ユークリッド距離とユークリッド距離を使用する近似一致クエリの場合、ベクトルインデックスは ORDER BY distance ASC が指定されている場合にのみ使用されます。降順はサポートされていません。

      • 内積距離を使用する近似一致クエリの場合、ベクトルインデックスは ORDER BY distance DESC が指定されている場合にのみ使用されます。昇順はサポートされていません。

      FLOAT4 pm_approx_squared_euclidean_distance(FLOAT4[], FLOAT4[])
      FLOAT4 pm_approx_euclidean_distance(FLOAT4[], FLOAT4[])
      FLOAT4 pm_approx_inner_product_distance(FLOAT4[], FLOAT4[])

      クエリで使用される関数は、テーブル作成時に指定された proxima_vector パラメーターの distance_method と一致する必要があります。次の例は、上位 N 件の結果をクエリする方法を示しています。近似一致クエリでは、2 番目のパラメーターは定数値である必要があります。

      説明

      インデックスベースのクエリは損失があり、精度が若干低下する可能性があります。デフォルトの再現率は通常 99% を超えます。

      -- 2乗ユークリッド距離に基づいて上位 K 件の結果を計算します。テーブルの proxima_vector プロパティの distance_method パラメーターは SquaredEuclidean に設定する必要があります。
      SELECT pm_approx_squared_euclidean_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance ASC limit 10 ;
      -- ユークリッド距離に基づいて上位 K 件の結果を計算します。テーブルの proxima_vector プロパティの distance_method パラメーターは Euclidean に設定する必要があります。
      SELECT pm_approx_euclidean_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance ASC limit 10 ;
      -- 内積距離に基づいて上位 K 件の結果を計算します。テーブルの proxima_vector プロパティの distance_method パラメーターは InnerProduct に設定する必要があります。
      SELECT pm_approx_inner_product_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance DESC limit 10 ;
    • 完全一致クエリ (ベクトルインデックスを使用しない)

      完全一致クエリは、小規模なデータセットや 100% の再現率が必要な場合に適しています。ユークリッド距離、2乗ユークリッド距離、内積距離の 3 つの距離計算メソッドは、次の 3 つの距離関数に対応しています。

      FLOAT4 pm_squared_euclidean_distance(FLOAT4[], FLOAT4[])
      FLOAT4 pm_euclidean_distance(FLOAT4[], FLOAT4[])
      FLOAT4 pm_inner_product_distance(FLOAT4[], FLOAT4[])

      ターゲットベクトルに最も近い上位 K 件の最近傍を見つけるには、次の SQL クエリを使用できます。

      説明

      次の例は、完全一致計算のための SQL クエリを示しています。実行中、システムは特徴列内のすべてのベクトルをスキャンし、それぞれについて距離を計算し、結果をソートして上位 10 件を返します。このアプローチは、小規模なデータセットや完全な再現率が必要な場合に適しています。

      -- 2乗ユークリッド距離に基づいて最も近い 10 件の最近傍を検索します。
      SELECT pm_squared_euclidean_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance ASC limit 10 ;
      -- ユークリッド距離に基づいて最も近い 10 件の最近傍を検索します。
      SELECT pm_euclidean_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance ASC limit 10 ;
      -- 内積距離が最も大きい 10 件の近傍を検索します。
      SELECT pm_inner_product_distance(feature, '{0.1,0.2,0.3,0.4}') AS distance FROM feature_tb ORDER BY distance DESC limit 10 ;

使用例

次の例は、Proxima Graph インデックスを使用して、100,000 エントリを持つ 4次元ベクトルテーブル内で、2乗ユークリッド距離に基づいて最も近い 40 件の最近傍を見つける方法を示しています。

  1. ベクトルテーブルの作成

    CREATE EXTENSION proxima;
    BEGIN;
    -- シャード数が 4 のテーブルグループを作成します。
    CALL HG_CREATE_TABLE_GROUP ('test_tg_shard_4', 4);
    CREATE TABLE feature_tb (
        id BIGINT,
        feature FLOAT4[] CHECK (array_ndims(feature) = 1 AND array_length(feature, 1) = 4)
    );
    CALL set_table_property ('feature_tb', 'table_group', 'test_tg_shard_4');
    CALL set_table_property ('feature_tb', 'proxima_vectors', '{"feature":{"algorithm":"Graph","distance_method":"SquaredEuclidean","builder_params":
    												{"min_flush_proxima_row_count" : 1000, "min_compaction_proxima_row_count" : 1000, "max_total_size_to_merge_mb" : 2000}}}');
    COMMIT;
  2. データのインポート

    -- (オプション) 大規模なオフラインインポートと ETL には Serverless Computing の使用を推奨します。
    SET hg_computing_resource = 'serverless';
    INSERT INTO feature_tb
    SELECT
        i,
        ARRAY[random(), random(), random(), random()]::FLOAT4[]
    FROM
        generate_series(1, 100000) i;
    ANALYZE feature_tb;
    VACUUM feature_tb;
    -- 不要な SQL ステートメントがサーバーレスリソースを使用しないように構成をリセットします。
    RESET hg_computing_resource;
  3. クエリの実行

    -- (オプション) 大規模なベクトルクエリジョブを実行するために Serverless Computing を使用します。
    SET hg_computing_resource = 'serverless';
    SELECT
        pm_approx_squared_euclidean_distance (feature, '{0.1,0.2,0.3,0.4}') AS distance
    FROM
        feature_tb
    ORDER BY
        distance
    LIMIT 40;
    -- 不要な SQL ステートメントがサーバーレスリソースを使用しないように構成をリセットします。
    RESET hg_computing_resource;

パフォーマンスチューニング

  • ベクトルインデックスを使用するシナリオ

    小規模なデータセット (例:数万エントリ) や、リソースが豊富なインスタンスでの低ボリュームクエリの場合、インデックスなしの直接計算で十分なことがよくあります。直接計算でレイテンシーとスループットの要件を満たせない場合にのみ、Proxima Graph インデックスの使用を検討してください。次の点に注意してください:

    • Proxima インデックスは損失があり、結果の精度を保証しません。計算された距離は不正確である可能性があります。

    • Proxima Graph インデックスは、リクエストされたよりも少ない結果を返すことがあります。たとえば、LIMIT 1000 のクエリが 500 エントリしか返さない場合があります。

    • Proxima Graph インデックスの使用は複雑になる可能性があります。

  • 適切なシャード数の設定

    シャード数が高いと、Proxima Graph インデックス用に作成されるファイルが増え、クエリのスループットが低下する可能性があります。インスタンスのリソースに基づいて、合理的なシャード数を設定することを推奨します。一般的なガイドラインは、シャード数をワーカーノードの数と等しく設定することです。たとえば、64 コアのインスタンスの場合、シャード数は 4 を推奨します。単一クエリのレイテンシーを短縮するためにシャード数を減らすことができますが、これにより書き込みパフォーマンスが低下します。

    -- ベクトルテーブルを作成し、シャード数が 4 のテーブルグループに配置します。
    BEGIN;
    CALL HG_CREATE_TABLE_GROUP ('test_tg_shard_4', 4);
    CREATE TABLE proxima_test (
        id BIGINT NOT NULL,
        vectors FLOAT4[] CHECK (array_ndims(vectors) = 1 AND array_length(vectors, 1) = 128),
        PRIMARY KEY (id)
    );
    CALL set_table_property ('proxima_test', 'proxima_vectors', '{"vectors":{"algorithm":"Graph","distance_method":"SquaredEuclidean","builder_params":{}, "searcher_init_params":{}}}');
    CALL set_table_property ('proxima_test', 'table_group', 'test_tg_shard_4');
    COMMIT;
  • (推奨) フィルター条件のないクエリ

    WHERE 句を使用すると、インデックスの使用に悪影響を及ぼし、パフォーマンスが低下する可能性があります。したがって、フィルター条件なしでクエリを実行することを推奨します。フィルターなしのベクトル検索では、シャードごとにベクトルインデックスファイルが 1 つだけ存在する状態が理想的です。これにより、I/O が最小限に抑えられ、各シャード内でのクエリパフォーマンスが向上します。

    このシナリオでは、次のようなテーブル作成ステートメントを使用します:

    BEGIN;
    CREATE TABLE feature_tb (
        uuid text,
        feature FLOAT4[] NOT NULL CHECK (array_ndims(feature) = 1 AND array_length(feature, 1) = N) --ベクトルを定義
    );
    CALL set_table_property ('feature_tb', 'shard_count', '?'); --ビジネスニーズに基づいてシャード数を指定します。不要な場合は省略できます。
    CALL set_table_property ('feature_tb', 'proxima_vectors', '{"feature":{"algorithm":"Graph","distance_method":"InnerProduct"}}'); --ベクトルインデックスを構築
    END;                 
  • フィルター条件のあるクエリ

    フィルター条件付きのベクトル検索では、次の一般的なシナリオを考慮してください。

    • シナリオ 1:文字列列によるフィルタリング

      一般的なユースケースは、特定のグループ内のベクトルデータを検索することです。たとえば、クラス内の顔データを検索するなどです。クエリの例は次のとおりです:

      SELECT pm_xx_distance(feature, '{1,2,3,4}') AS d FROM feature_tb WHERE uuid = 'x' ORDER BY d limit 10;

      次の最適化を推奨します:

      • uuid を分散キーとして設定します。これにより、同じフィルター値を持つデータが同じシャードに保存されるため、クエリは 1 つのシャードにのみルーティングされます。

      • uuid をテーブルのクラスタリングキーとして設定します。これにより、各ファイル内のデータがクラスタリングキーでソートされます。

    • シナリオ 2:時間フィールドによるフィルタリング

      通常、時間フィールドに基づいてベクトルデータをフィルタリングします。時間フィールド time_field をテーブルのセグメントキーとして設定し、データが保存されているファイルを迅速に見つけることを推奨します。クエリの例は次のとおりです:

      SELECT pm_xx_distance(feature, '{1,2,3,4}') AS d FROM feature_tb WHERE time_field BETWEEN '2020-08-30 00:00:00' AND '2020-08-30 12:00:00' ORDER BY d limit 10;

    フィルター条件付きのベクトル検索の場合、テーブル作成ステートメントは通常次のようになります:

    BEGIN;
    CREATE TABLE feature_tb (
        time_field timestamptz NOT NULL,
        uuid text,
        feature FLOAT4[] NOT NULL CHECK (array_ndims(feature) = 1 AND array_length(feature, 1) = N)
    );
    CALL set_table_property ('feature_tb', 'distribution_key', 'uuid');
    CALL set_table_property ('feature_tb', 'segment_key', 'time_field');
    CALL set_table_property ('feature_tb', 'clustering_key', 'uuid');
    CALL set_table_property ('feature_tb', 'proxima_vectors', '{"feature":{"algorithm":"Graph","distance_method":"InnerProduct"}}');
    COMMIT;
    -- 時間でフィルタリングしない場合は、time_field に関連するインデックスを削除できます。

よくある質問

  • ERROR: function pm_approx_inner_product_distance(real[], unknown) does not exist というエラーが報告された場合はどうすればよいですか?

    原因:このエラーは通常、データベースで CREATE EXTENSION proxima; ステートメントが実行されず、Proxima 拡張機能が初期化されていないために発生します。

    解決策CREATE EXTENSION proxima; ステートメントを実行して、Proxima 拡張機能を初期化します。

  • Writing column: feature with array size: 5 violates fixed size list (4) constraint declared in schema というエラーが報告された場合はどうすればよいですか?

    原因:ベクトル列に書き込まれるデータのディメンションが、テーブルスキーマで定義されたディメンションと一致しません。

    解決策:入力データにディメンションが正しくないベクトルがないか確認してください。

  • The size of two arrays must be the same in DistanceFunction, size of left array: 4, size of right array: というエラーが報告された場合はどうすればよいですか?

    原因pm_xx_distance(left, right) 関数で、left 配列のディメンションが right 配列のディメンションと一致しません。

    解決策pm_xx_distance(left, right) 関数内の left 配列と right 配列のディメンションが同じであることを確認してください。

  • リアルタイム書き込み中に BackPressure Exceed Reject Limit ctxId: XXXXXXXX, tableId: YY, shardId: ZZ というエラーが報告された場合はどうすればよいですか?

    原因:リアルタイム書き込みジョブでボトルネックが発生し、バックプレッシャー例外が生成されました。これは、書き込みジョブのオーバーヘッドが高く、処理が遅いことを示しています。この問題は通常、min_flush_proxima_row_count パラメーターの値が小さいことと、リアルタイム書き込み速度が速いことの組み合わせによって引き起こされます。この構成では、リアルタイムのインデックス構築のオーバーヘッドが高くなり、結果として書き込みプロセスがブロックされます。

    min_flush_proxima_row_count をより大きな値に設定してください。

  • Java を使用してベクトルデータを書き込むにはどうすればよいですか?

    次の例は、Java を使用してベクトルデータを書き込む方法を示しています。

    private static void insertIntoVector(Connection conn) throws Exception {
        try (PreparedStatement stmt = conn.prepareStatement("insert into feature_tb values(?,?);")) {
            for (int i = 0; i < 100; ++i) {
               stmt.setInt(1, i);
               Float[] featureVector = {0.1f,0.2f,0.3f,0.4f};
               Array array = conn.createArrayOf("FLOAT4", featureVector);
               stmt.setArray(2, array);
               stmt.execute();
            }
        }
    }
  • 実行計画から Proxima Graph インデックスが使用されているかを確認するにはどうすればよいですか?

    実行計画を確認することで、Proxima Graph インデックスが使用されていることを検証できます。EXPLAIN ANALYZE ステートメントを実行します。出力に Proxima Filter: ProximaCond が含まれている場合、クエリが Proxima Graph インデックスを使用していることが確認できます。このフィルターが表示されない場合、インデックスは使用されておらず、通常はテーブル定義とクエリ文の間に不一致があることを示します。以下は、Proxima Graph インデックスを使用する 実行計画 の例です:

    test=# explain analyze select  pm_approx_squared_euclidean_distance(feature, array[0.1,0.1,0.1,0.1,0.2]::float4[]) from test_get_ordered_array_according_to_docs order by 1 limit 10;
                                                                  QUERY PLAN
    ---------------------------------------------------------------------------------------------------------------------------------------
     Limit  (cost=0.00..27.64 rows=0 width=4)
      ->  Sort  (cost=0.00..27.56 rows=10 width=4)
            Sort Key: (ProximaDistanceRef)
            [node_id=7; Row_count=10; Avg_Open_Time=0ms; Max_Open_Time=0ms; Min_Open_Time=0ms; Avg_Get_Next_Time=0ms; Max_Get_Next_Time=0ms; Min_Get_Next_Time=0ms]
            ->  Exchange (Gather Exchange)  (cost=0.00..1.68 rows=10 width=4)
                  [node_id=6; Row_count=10; Avg_Open_Time=0ms; Max_Open_Time=0ms; Min_Open_Time=0ms; Avg_Get_Next_Time=0ms; Max_Get_Next_Time=0ms; Min_Get_Next_Time=0ms]
                  ->  Decode  (cost=0.00..1.68 rows=10 width=4)
                        [node_id=4; Row_count=10; Avg_Open_Time=0ms; Max_Open_Time=0ms; Min_Open_Time=0ms; Avg_Get_Next_Time=0ms; Max_Get_Next_Time=0ms; Min_Get_Next_Time=0ms]
                        ->  Result  (cost=0.00..1.58 rows=10 width=4)
                              ->  Index Scan using holo_index:[1] on test_get_ordered_array_according_to_docs  (cost=0.00..0.53 rows=10 width=1)
                                    Proxima Filter: ProximaCond  -> KNN: $5 distance_method: pm_approx_squared_euclidean_distance search_params: {NULL} args: {featureARRAY[$1, $2, $3, $4]}

距離関数

Hologres は、次の 3 つのベクトル距離関数をサポートしています:

  • 2乗ユークリッド距離 (SquaredEuclidean)。数式は次のとおりです。不开方的欧式距离

  • ユークリッド距離 (Euclidean)。数式は次のとおりです。开方的欧氏距离

  • 内積距離 (InnerProduct)。数式は次のとおりです。内积距离

説明

ユークリッドベースの距離を使用する場合、2乗ユークリッド距離は、コストのかかる平方根演算を回避しつつ、同じ上位 K 件のランキングを生成するため、ユークリッド距離よりもパフォーマンスが高くなります。したがって、ユースケースに適合する場合は常に、2乗ユークリッド距離を使用することを推奨します。