AI 関数を使用してクエリのパフォーマンスを向上させる

AlloyDB for PostgreSQL の AI 関数のスマートバッチ処理を使用すると、AI モデルを呼び出す SQL クエリを実行する際のパフォーマンスを最適化できます。複雑なバッチ処理クエリを作成しなくても、 配列ベースの関数 と同等以上のパフォーマンスを実現できます。AI 関数の詳細については 、 AI 関数の概要をご覧ください。

スマートバッチ処理は、次の AI 関数をサポートしています。

  • ai.if: スマートバッチ処理は、関数が WHERE 句にある SELECT クエリにのみ適用されます。スキャンごとに 1 つの ai.if 関数をサポートし、シーケンシャル スキャン、インデックス スキャン、ビットマップ ヒープ スキャンで動作します。クエリに複数のテーブル スキャン(異なるテーブル、リレーション、共通テーブル式(CTE)など)が含まれている場合は、スキャンごとに 1 つの ai.if 関数を高速化できます。
  • ai.rank: スマートバッチ処理は、関数が ORDER BY 句にある SELECT クエリにのみ適用されます。スキャンごとに 1 つの ai.rank 関数をサポートします。クエリに複数のテーブル スキャン(異なるテーブル、リレーション、CTE など)が含まれている場合は、スキャンごとに 1 つの ai.rank 関数を高速化できます。

AI 関数のスマートバッチ処理を有効にする

AI 関数のスマートバッチ処理を有効にするには、 google_ml_integration.enable_ai_function_acceleration フラグを on に設定します。このフラグはデフォルトで無効になっており、クエリ エグゼキュータが、高速化のために AI 関数の適用ノードに適切な AI オペレーションをオフロードできるかどうかを制御します。 設定しない場合、または off に設定した場合、すべてのクエリ オペレーションは標準の PostgreSQL エグゼキュータによって実行されます。

このフラグは、セッション レベルまたはインスタンス レベルで構成できます。

インスタンス レベルで AI 関数のスマートバッチ処理を有効にするには、gcloud alloydb instances update コマンドを使用します。

gcloud alloydb instances update INSTANCE_ID \
  --database-flags google_ml_integration.enable_ai_function_acceleration=on \
  --region=REGION_ID \
  --cluster=CLUSTER_ID \
  --project=PROJECT_ID

次のように置き換えます。

  • INSTANCE_ID: 更新するインスタンスの ID。
  • REGION_ID: クラスタが配置されているリージョンの ID。詳細については、サポート対象の地域をご覧ください。
  • CLUSTER_ID: クラスタの ID。
  • PROJECT_ID: プロジェクトの ID。

インスタンス レベルのフラグを設定する方法については、データベース フラグを構成するをご覧ください。

AI 関数のスマートバッチ処理を確認する

AI 関数のスマートバッチ処理が有効になっていることを確認するには、EXPLAIN ステートメントを使用してクエリを分析します。

ai.if クエリの AI 関数のスマートバッチ処理を確認する

次の例は、現在のセッションで AI 関数のスマートバッチ処理を有効にし、ai.if 関数を使用してクエリを実行する方法を示しています。

SET google_ml_integration.enable_ai_function_acceleration = on;

EXPLAIN (COSTS OFF) SELECT r.name
FROM restaurant_reviews r
WHERE ai.if('Is the following a positive review? Review: '||r.review) AND r.city = 'Los Angeles'
GROUP BY r.name
HAVING count(*) > 20
ORDER BY r.name;

EXPLAIN ステートメントを使用してクエリを分析すると、クエリプランに AI Function Apply ノードが表示されます。

                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 GroupAggregate
   Group Key: name
   Filter: (count(*) > 20)
   ->  Sort
         Sort Key: name
         ->  AI Function Apply
               Filter: ai.if((('Is the following a positive review? Review: '::text || review)), NULL::character varying)
               ->  Index Scan using idx_restaurant_reviews_city on restaurant_reviews r
                     Index Cond: ((city)::text = 'Los Angeles'::text)

ai.rank クエリの AI 関数のスマートバッチ処理を確認する

次の例は、現在のセッションで AI 関数のスマートバッチ処理を有効にし、ai.rank 関数を使用してクエリを実行する方法を示しています。

SET google_ml_integration.enable_ai_function_acceleration = on;

EXPLAIN (COSTS OFF) SELECT r.name, r.review
FROM restaurant_reviews r
WHERE r.city = 'Los Angeles'
ORDER BY ai.rank('Rank these reviews based on how much they emphasize high-quality ingredients. Review: ' || r.review) DESC
LIMIT 50;

EXPLAIN ステートメントを使用してクエリを分析すると、クエリプランに AI Function Apply ノードが表示されます。

                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 Limit
  ->  Sort
        Sort Key: (ai.rank(('Rank these reviews based on how much they emphasize high-quality ingredients. Review: ' || r.review'), NULL)) DESC
        ->  AI Function Apply
              ->  Bitmap Heap Scan on restaurant_reviews r
                    Recheck Cond: (city = 'Los Angeles')
                    ->  Bitmap Index Scan on idx_restaurant_reviews_city
                          Index Cond: (city = 'Los Angeles')

クエリプランの AIFunctionApply ノードは、クエリが AI 関数のスマートバッチ処理を使用したことを示します。このノードが存在しない場合、クエリは標準の PostgreSQL 実行を使用しました。

制限事項

  • 関数の基本的な引数のみがサポートされています。ai.if と ai.rank の場合、prompt 引数は列参照または列参照と連結された文字列リテラルにする必要があります。他の引数は定数にする必要があります。 サポートされている prompt 引数の例を次に示します。
    • ai.if(r.review)
    • ai.if('Is this true? : ' || r.review)
    • ai.rank(r.review)
    • ai.rank('Rate this review: ' || r.review)
  • WHERE 句に ai.if がある SELECT クエリ、または ORDER BY 句に ai.rank があるクエリのみがサポートされています。
  • テーブル スキャンごとに 1 つの AI 関数のみがサポートされています。
  • デフォルトの Gemini モデルのみがサポートされています。詳細については、Gemini モデルをご覧ください。別のモデルを使用するには、google_ml_integration.default_llm_model フラグを使用するモデルの ID に設定します。
  • この機能は、gemini-2.5-flash-lite モデルをサポートするリージョン、または google_ml_integration.default_llm_model フラグを使用して設定した LLM モデルのリージョンでのみ使用できます。詳細については、サポート対象の地域をご覧ください。

次のステップ