運算式的虛擬資料欄可加快資料欄引擎查詢的速度,重複評估相同的運算式,例如 JSON 屬性的篩選器。這項功能適用於 PostgreSQL 16 以上版本。
資料欄引擎可以具體化及快取常用運算式的結果。AlloyDB 會預先計算並儲存這些結果,避免在多個查詢中重複剖析及評估相同的運算式。這項程序可提升查詢效能並減少 CPU 消耗,特別是大型資料集的分析工作負載。
運算式虛擬資料欄的用途如下:
- 篩選 JSON 屬性:經常根據 JSON 資料欄中的特定鍵/值組合篩選查詢。
- 複雜運算式評估:適用於涉及複雜或運算密集運算式的查詢。
啟用運算式虛擬資料欄掃描功能後,系統會自動最佳化使用資料欄引擎且包含常用運算式的查詢。資料欄引擎重新整理基本資料欄時,會自動重新整理這些虛擬資料欄。
虛擬資料欄支援的運算式
AlloyDB 支援在 JSON 和 JSONB 資料欄上使用 -> 和 ->> 運算子 (預先發布版)。
事前準備
為 AlloyDB 叢集啟用資料欄引擎。詳情請參閱「設定資料欄引擎」。
使用查詢洞察,找出 AlloyDB 查詢中常用的運算式。
將運算式的基本資料欄新增至資料欄引擎。詳情請參閱「手動管理資料欄儲存庫內容」。
啟用運算式的虛擬資料欄
系統預設會啟用運算式虛擬資料欄支援功能 (google_columnar_engine.enable_virtual_columns_scan=on)。如果先前停用了這個旗標,可以使用 gcloud alloydb instances update 指令為執行個體啟用。
如要使用 gcloud CLI,您可以安裝並初始化 Google Cloud CLI,也可以使用 Cloud Shell。
gcloud alloydb instances update INSTANCE_ID \
--region=REGION_ID \
--cluster=CLUSTER_ID \
--project=PROJECT_ID \
--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''"'- 請以單引號括住整個運算式值,例如
運算式虛擬資料欄範例
這個範例說明如何使用運算式虛擬資料欄功能。建立 users 資料表,其中包含 profile JSONB 資料欄,並填入範例資料。接著,根據查詢分析,使用 google_columnar_engine_add 函式將常用的 profile ->> 'email' 運算式新增至資料欄引擎。接著,資料欄引擎會使用這個常用運算式,協助最佳化後續查詢。
如要將這個範例常用運算式新增至資料欄引擎,請按照下列步驟操作:
前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。
在「Resource name」(資源名稱) 欄中,按一下叢集名稱。
在導覽窗格中,點選「AlloyDB Studio」。
如要建立含有
profileJSONB 資料欄的users資料表,請執行下列指令:CREATE TABLE users ( id int, username TEXT, profile JSONB );如要使用範例資料填入
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;如要提升包含常用運算式的查詢效能,請將
profile ->> 'email'運算式新增至資料欄引擎:SELECT google_columnar_engine_add( relation => 'users', columns => 'username, profile', expressions => '"profile ->> ''email''"' );停用運算式虛擬資料欄功能,建立效能基準,然後執行使用常用運算式的查詢,並觀察查詢完成所需的時間。
SET google_columnar_engine.enable_virtual_columns_scan=off; SELECT username FROM users WHERE profile->>'email' = 'user50000@example.com';啟用運算式虛擬資料欄功能。
SET google_columnar_engine.enable_virtual_columns_scan=on;重新執行使用常用運算式的查詢,並觀察查詢完成所需的時間。
SELECT username FROM users WHERE profile->>'email' = 'user50000@example.com';
為運算式啟用虛擬資料欄後,查詢執行階段會加快。
查看運算式的虛擬資料欄
如要找出為特定資料表新增的所有運算式,請查詢 g_columnar_virtual_columns 檢視表:
SELECT * FROM g_columnar_virtual_columns;
輸出內容大致如下,其中 description 欄位會顯示為資料表 (關係) 新增的所有運算式:
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 替換為表格中以半形逗號分隔的運算式清單,格式與新增運算式時使用的格式相同。