式に仮想列を使用してクエリを最適化する

このページでは、カラム型エンジンの式に仮想列を使用してクエリを高速化する方法について説明します。

カラム型エンジンは、頻繁に使用される式の結果を具体化してキャッシュに保存できます。AlloyDB は、これらの結果を事前に計算して保存することで、複数のクエリで同じ式を繰り返し解析して評価することを回避します。このプロセスにより、特に大規模なデータセットの分析ワークロードで、クエリのパフォーマンスが向上し、CPU 使用率が低下します。

式用の仮想列のユースケースは次のとおりです。

  • JSON 属性のフィルタリング: JSON 列内の特定の Key-Value ペアに基づいてクエリを頻繁にフィルタする場合。
  • 複雑な式の評価: 複雑な式や計算量の多い式を含むクエリの場合。

式スキャンの仮想列を有効にすると、カラム型エンジンを使用し、頻繁に使用される式を含むクエリが自動的に最適化されます。カラム型エンジンは、ベース列を更新するときにこれらの仮想列を自動的に更新します。

仮想列でサポートされている式

AlloyDB は、(プレビュー)リリースで JSON 列と JSONB 列の -> 演算子と ->> 演算子をサポートしています。

始める前に

  1. AlloyDB クラスタのカラム型エンジンを有効にします。詳細については、カラム型エンジンを構成するをご覧ください。

  2. クエリ分析情報を使用して、AlloyDB クエリで頻繁に使用される式を特定します。

  3. 式のベース列をカラム型エンジンに追加します。詳細については、カラム型ストア コンテンツを手動で管理するをご覧ください。

式の仮想列を有効にする

gcloud beta alloydb instances update コマンドを使用して、インスタンスの式の仮想列のサポートを有効にできます。

gcloud CLI を使用するには、Google Cloud CLI をインストールして初期化するか、Cloud Shell を使用します。

    gcloud beta alloydb instances update INSTANCE_ID \
        --region=REGION_ID \
        --cluster=CLUSTER_ID \
        --project=PROJECT_ID \
        --update-mode=INPLACE \
        --add-database-flags="google_columnar_engine.enable_virtual_columns_scan=on"

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

  • INSTANCE_ID: AlloyDB インスタンス ID。
  • REGION_ID: AlloyDB インスタンスのリージョン。
  • CLUSTER_ID: AlloyDB インスタンスのクラスタ ID。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。

セッションレベルでこのフラグを設定するには、次のコマンドを実行します。

SET google_columnar_engine.enable_virtual_columns_scan=on;

式の仮想列を追加する

よく使用される式をカラム型エンジンに追加するには、psql クライアントを使用して google_columnar_engine_add 関数を呼び出します。これらの式は、データベースにすでに存在する列に加えて、列としてカラム型エンジンに設定されます。

複数の式をカンマ区切りの値として指定できます。

    SELECT google_columnar_engine_add(
    relation => 'DB.SCHEMA.TABLE_NAME',
    columns => 'COLUMN_NAME, COLUMN_NAME',
    expressions => 'EXP1, EXP2, EXP3'
    );

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

  • DB.SCHEMA: テーブルが保存されているデータベース スキーマ。
  • TABLE_NAME: 列が保存されているテーブルの名前。
  • COLUMN_NAME: 式を含む列の名前。
  • EXP1, EXP2, EXP3 は、式のカンマ区切りのリストに置き換えます。サポートされている JSON 抽出式は ->->> です。

    たとえば、public スキーマの employee テーブルに user ->> 'email' 式と user ->> 'name' 式を追加するには、次のクエリを使用します。

        SELECT google_columnar_engine_add(
        relation => 'postgres.public.employee',
        expressions => '"user ->> ''email''", "user ->> ''name''"'
        );
    

    式の構文:

    • 式全体を単一引用符で囲みます(例: expressions => 'EXP1,EXP2,EXP3')。
    • 複数の式はカンマで区切ります。
    • 個々の式は二重引用符で囲みます。
    • 式内の単一引用符は、別の単一引用符を使用してエスケープします。

    たとえば、col -> 'level1' 式と col -> 'level1' ->> 'level2' 式を追加するには、次の形式を使用します。

        expressions => '"col -> ''level1''", "col -> ''level1'' ->> ''level2''"'
    

式の仮想列の例

この例では、式に仮想列を使用する方法を示します。profile JSONB 列を含む users テーブルを作成し、サンプルデータを入力します。次に、クエリ分析に基づいて、google_columnar_engine_add 関数を使用して、頻繁に使用される profile ->> 'email' 式をカラム型エンジンに追加します。カラム型エンジンは、この頻繁な式を使用して、後続のクエリの最適化に役立てます。

この頻出表現の例を列エンジンに追加する手順は次のとおりです。

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. [リソース名] 列で、クラスタの名前をクリックします。

  3. ナビゲーション パネルで [AlloyDB Studio] をクリックします。

  4. profile JSONB 列を含む users テーブルを作成するには、次のコマンドを実行します。

    CREATE TABLE users (
    id int,
    username TEXT,
    profile JSONB
    );
    
  5. users テーブルにサンプルデータを入力するには、次のコマンドを実行します。

    INSERT INTO users (id, username, profile)
    SELECT
        i,
        'user' || i,
        jsonb_build_object(
            'name', 'User ' || i,
            'email', 'user' || i || '@example.com',
            'active', (i % 2 = 0)
        )
    FROM generate_series(1, 100000) AS i;
    
  6. 頻繁に使用される式を含むクエリのパフォーマンスを向上させるには、profile ->> 'email' 式をカラム型エンジンに追加します。

    SELECT google_columnar_engine_add(
        relation => 'users',
        columns => 'username, profile',
        expressions => '"profile ->> ''email''"'
    );
    
  7. 頻繁な式を使用するクエリを実行し、クエリの完了にかかる時間を観察します。

    SELECT username
    FROM users
    WHERE profile->>'email' = 'user50000@example.com';
    
  8. 式用の仮想列機能を有効にします。

    SET google_columnar_engine.enable_virtual_columns_scan=on;
    
  9. 頻繁な式を使用するクエリを再実行し、クエリの完了にかかる時間を観察します。

    SELECT username
    FROM users
    WHERE profile->>'email' = 'user50000@example.com';
    

式に仮想列を有効にすると、クエリの実行時間が短縮されます。

式の仮想列を表示する

特定のテーブルに追加されたすべての式を見つけるには、g_columnar_virtual_columns ビューをクエリします。

    SELECT * FROM g_columnar_virtual_columns;

出力は次のようになります。description フィールドには、テーブル(リレーション)に追加されたすべての式が表示されます。

SELECT * FROM g_columnar_virtual_columns;
category           | expression
database_name      | testdb
schemas            | {public}
relations          | {users}
description        | profile->>'email'
column_data_type   | text
status             | Usable
last_accessed_time | 2026-02-04 06:25:32.499601+00
num_times_accessed | 1

式の仮想列を削除する

式を削除するには、google_columnar_engine_drop() 関数を呼び出します。

    SELECT google_columnar_engine_drop(
      relation => 'DB.SCHEMA.TABLE_NAME',
      expressions => 'EXP1, EXP2, EXP3'
    );

EXP1, EXP2, EXP3 は、式を追加するときに使用したのと同じ形式で、テーブル内の式のカンマ区切りリストに置き換えます。