使用運算式的虛擬資料欄最佳化查詢

本頁說明如何使用資料欄引擎中的運算式虛擬資料欄,加快查詢速度。

資料欄引擎可以具體化並快取常用運算式的結果。AlloyDB 會預先計算並儲存這些結果,避免在多個查詢中重複剖析及評估相同運算式。這個程序可提升查詢效能並降低 CPU 耗用量,特別是處理大型資料集的分析工作負載。

以下是運算式虛擬資料欄的一些用途:

  • 依據 JSON 屬性篩選:經常依據 JSON 欄中的特定鍵/值組合篩選查詢。
  • 複雜運算式評估:適用於涉及複雜或運算密集型運算式的查詢。

啟用運算式掃描的虛擬資料欄後,系統會自動最佳化使用資料欄引擎且含有常用運算式的查詢。在重新整理基礎資料欄時,直欄引擎會自動重新整理這些虛擬資料欄。

虛擬欄中支援的運算式

在 (預先發布版) 中,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 控制台的「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  2. 在「Resource name」(資源名稱) 欄中,按一下叢集名稱。

  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 替換為資料表中以半形逗號分隔的運算式清單,格式與新增運算式時相同。