DB2 的 CREATE TABLE ... AS (SELECT ...) 語法提供三種強大變體:定義式結果表、物化查詢表 (MQT)、複製表結構。本文詳細說明語法、用途與範例。
僅依查詢結果的欄位定義建立空表,不複製資料:
CREATE TABLE new_table_name AS
(SELECT * FROM source_table)
DEFINITION ONLY;
MQT 類似「預先計算並儲存的查詢結果」,查詢優化器可自動重導向查詢至 MQT 提升效能:
CREATE TABLE mqt_sales_summary AS
(SELECT region, YEAR(sale_date) AS yr, SUM(amount) AS total_sales
FROM sales
GROUP BY region, YEAR(sale_date))
DATA INITIALLY DEFERRED
REFRESH DEFERRED;
-- 首次填入資料
REFRESH TABLE mqt_sales_summary;
關鍵選項:
DATA INITIALLY DEFERRED:建立時不立即填入資料。REFRESH DEFERRED:手動 REFRESH TABLE 更新 (非即時)。REFRESH IMMEDIATE:基表異動時自動同步 (需定義 STAGING TABLE,限制較多)。SYSCAT.TABLES 中 TYPE='S' 表示 MQT。應用場景:資料倉庫彙總表、複雜連接預計算、報表加速。優化器在 CURRENT REFRESH AGE = ANY 時會自動考慮使用 MQT。
完整複製來源表的欄位定義、資料型別、預設值、NOT NULL、隱含約束 (不含索引、主鍵、外鍵、觸發器、權限):
CREATE TABLE new_table_name LIKE source_table;
db2look 擷取 DDL 後執行。| 語法 | 複製資料 | 複製索引/約束 | 自動維護 | 典型用途 |
|---|---|---|---|---|
AS (SELECT) DEFINITION ONLY | 否 | 否 | 否 | 快速建立同結構空表 |
AS (SELECT) DATA INITIALLY DEFERRED REFRESH DEFERRED (MQT) | 手動 REFRESH | 否 | 手動/排程 REFRESH | 報表彙總、查詢加速 |
LIKE source_table | 否 | 否 | 否 | 複製完整欄位定義含預設值 |
-- 開啟 MQT 重導向
SET CURRENT REFRESH AGE = ANY;
SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION = ALL;
-- 執行查詢
EXPLAIN PLAN FOR
SELECT region, yr, total_sales FROM mqt_sales_summary WHERE yr = 2023;
-- 檢視執行計畫是否存取 MQT
SELECT * FROM TABLE(EXPLAIN_STREAM('EXPLAIN_INSTANCE', '...'));
善用 CREATE TABLE ... AS 三種變體,能在「快速建表」、「報表預計算」、「結構複製」三大場景中事半功倍。MQT 是 DB2 資料倉庫效能優化的利器,建議配合 REFRESH DEFERRED 排程更新,並在查詢工作負載中開啟重導向。