全部產品
Search
文件中心

Hologres:CREATE TABLE

更新時間:Jan 27, 2026

表是 Hologres 儲存和組織資料的基本單位。通過合理地設定儲存模式、表索引及屬性,可以為您提供高效的即時資料處理和大規模分析能力。

快速上手

建表

推薦使用 V2.1 版本起支援的 CREATE TABLE WITH 文法。此樣本示範一張遵循分層命名規範、欄位豐富且包含完善注釋的交易明細表

BEGIN;

-- 建立交易明細事實表(基礎普通表)
-- 顯式指定 public schema,並在表名上體現分層規範 (dwd_xxx)
CREATE TABLE IF NOT EXISTS public.dwd_trade_orders (
    order_id BIGINT NOT NULL,           -- 訂單唯一標識
    shop_id INT NOT NULL,              -- 店鋪ID
    user_id TEXT NOT NULL,             -- 使用者ID
    order_amount NUMERIC(12, 2) DEFAULT 0.00,       -- 訂單金額
    payment NUMERIC(12, 2) DEFAULT 0.00,         -- 實付金額
    payment_type INT DEFAULT 0,                     -- 支付類型(0:未支付, 1:支付寶, 2:微信, 3:信用卡)
    is_delivered BOOLEAN DEFAULT false,             -- 是否發貨
    dt TEXT NOT NULL,                               -- 業務日期
    order_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 下單時間
    PRIMARY KEY (order_id)                          -- 設定主鍵,保證資料唯一性
)
WITH (
    orientation = 'column',                         -- 設定為列存模式:適用于海量資料的即時分析(OLAP)情境
    distribution_key = 'order_id',                  -- 設定分布鍵:資料按 order_id 分區儲存
    clustering_key = 'order_time:asc',              -- 設定聚簇索引:資料在檔案內按時間升序排列
    event_time_column = 'order_time',               -- 設定分段鍵:利用檔案級裁剪快速過濾時間區間
    bitmap_columns = 'shop_id,payment_type,is_delivered', -- 設定位元影像索引:針對低基數列加速等值過濾
    dictionary_encoding_columns = 'user_id:auto'    -- 設定字典編碼:加速字串列的彙總與過濾
);

-- 添加中繼資料注釋
COMMENT ON TABLE public.dwd_trade_orders IS '交易訂單明細基礎事實表';
COMMENT ON COLUMN public.dwd_trade_orders.order_id IS '訂單唯一標識';
COMMENT ON COLUMN public.dwd_trade_orders.shop_id IS '店鋪唯一ID';
COMMENT ON COLUMN public.dwd_trade_orders.user_id IS '購買者使用者ID';
COMMENT ON COLUMN public.dwd_trade_orders.dt IS '業務日期, 格式 YYYYMMDD';
COMMENT ON COLUMN public.dwd_trade_orders.order_time IS '訂單建立精確時間戳記';

COMMIT;

查詢表結構

您可以執行如下命令查看TABLE的具體DDL:

SELECT hg_dump_script('public.dwd_trade_orders');

插入資料

Hologres 相容標準 DML 文法。以下插入 10 條類比生產環境的詳細資料。

INSERT INTO public.dwd_trade_orders (order_id, shop_id, user_id, order_amount, payment, payment_type, is_delivered, dt, order_time) VALUES 
(50001, 101, 'U678', 299.00, 280.00, 1, true,  '20231101', '2023-11-01 10:00:01+08'),
(50002, 102, 'U992', 59.00,  59.00,  2, false, '20231101', '2023-11-01 10:05:12+08'),
(50003, 101, 'U441', 150.00, 145.00, 1, true,  '20231101', '2023-11-01 10:10:45+08'),
(50004, 105, 'U219', 888.00, 888.00, 3, true,  '20231101', '2023-11-01 10:20:11+08'),
(50005, 102, 'U883', 35.00,  30.00,  1, false, '20231101', '2023-11-01 10:32:00+08'),
(50006, 110, 'U007', 120.50, 120.50, 2, true,  '20231101', '2023-11-01 10:45:33+08'),
(50007, 101, 'U321', 210.00, 210.00, 1, true,  '20231101', '2023-11-01 11:02:19+08'),
(50008, 108, 'U556', 45.00,  45.00,  2, false, '20231101', '2023-11-01 11:15:04+08'),
(50009, 101, 'U112', 300.00, 290.00, 3, true,  '20231101', '2023-11-01 11:25:55+08'),
(50010, 105, 'U449', 99.90,  99.90,  1, true,  '20231101', '2023-11-01 11:40:22+08');

查詢資料

-- 統計各店鋪成交額並按金額降序排列
SELECT 
    shop_id, 
    COUNT(1) as total_orders, 
    SUM(payment) as total_payment 
FROM public.dwd_trade_orders 
GROUP BY shop_id 
ORDER BY total_payment DESC;

查詢結果:

shop_id	total_orders	total_payment
105	2	987.90
101	4	925.00
110	1	120.50
102	1	59.00
108	1	45.00

文法說明

建表文法說明

Hologres 提供兩種設定表屬性及添加註釋的文法:

  • 標準文法(推薦 V2.1+ 使用)

    使用 WITH 關鍵字定義屬性,結構緊湊且效能更佳,備註陳述式通常緊隨建表語句,完整樣本請參見建表

    BEGIN;
    
    CREATE TABLE [ IF NOT EXISTS] [schema_name.]table_name ([
        { 
        column_name column_type [column_constraints, [...]]
        | table_constraints
        [,...]
        }
    ])
    [WITH (
        property = 'value',
        [, ...]
    )]
    ;
    [COMMENT ON COLUMN <[schema_name.]tablename.column> IS '<value>';]
    [COMMENT ON TABLE <[schema_name.]tablename> IS '<value>';]
    
    COMMIT;
  • 相容文法(全版本支援)

    通過 CALL 方式set_table_property設定屬性和COMMENT注釋,必須與 CREATE TABLE 處於同一個事務塊(BEGIN...COMMIT)中。

    BEGIN;
    
    CREATE TABLE [ IF NOT EXISTS] [schema_name.]table_name ([
        { 
        column_name column_type [column_constraints, [...]]
        | table_constraints
        [,...]
        }
    ]);
    
    CALL set_table_property('[schema_name.]<table_name>', '<property>', '<value>');
    COMMENT ON COLUMN <[schema_name.]tablename.column> IS '<value>';
    COMMENT ON TABLE <[schema_name.]tablename> IS '<value>';
    
    COMMIT;

表屬性

參數

說明

列存表

行存表

行列共存表

建議值

建表後是否可修改

orientation

設定表格儲存體格式。詳情參見表格儲存體格式:列存、行存、行列共存

column(預設值)

參考樣本:海量資料即時分析情境(事實表)

row

參考樣本:高並發主鍵點查情境(維表)

row,column

參考樣本:混合負載情境(行列共存)

column

否,如需修改請重建立表。

distribution_key

分布鍵,設定表資料的分布策略。詳情參見分布鍵Distribution Key

預設為主鍵,根據業務情境修改。

預設為主鍵。

預設為主鍵。

主鍵的子集,建議只選擇一列。

clustering_key

聚簇索引,用於提升查詢效能,詳情參見聚簇索引Clustering Key

預設為空白。

預設為主鍵。

預設為空白。

建議最多選擇一列,且僅支援asc序。

event_time_column

分段鍵,用於提升查詢效能,詳情參見Event Time Column(Segment Key)

預設為第一個非空時間戳記欄位。

不支援。

預設為第一個非空時間戳記欄位。

建議時間戳記欄位。

table_group

邏輯儲存概念,用於管理Shard數。詳情參見Table Group與Shard Count操作指南

預設為default table group

預設即可。

否,如需修改請重建立表或者Resharding。

bitmap_columns

位元影像索引。詳情參見位元影像索引Bitmap

按需使用。

不支援。

按需使用。

建議用於等值比較的列,一般10列以下。

是,詳情請參見ALTER TABLE

dictionary_encoding_columns

字典編碼。

按需使用。

不支援。

按需使用。

建議低基數列,一般10列以下。

是,詳情請參見ALTER TABLE

time_to_live_in_seconds

設定表的資料生命週期,單位為秒。TTL並非精確時間,生產業務中不建議使用TTL來管理資料的生命週期,建議採用分區表,具體詳情請參見CREATE PARTITION TABLE

按需使用。

預設即可,無需設定。

是,詳情請參見ALTER TABLE

dictionary_encoding_columns

設定字典編碼Dictionary Encoding,命令文法如下所示。Dictionary Encoding指定列的值構建字典映射。字典編碼可以將字串的比較轉成數位比較,加速Group By、Filter等查詢。預設列存表所有TEXT資料類型的欄位都會被設定為Dictionary Encoding列 ,在Hologres V0.9及之後版本,會根據資料特徵自動選擇是否建立字典編碼。

CALL set_table_property('table_name', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]');

time_to_live_in_seconds

設定表的資料生命週期(TTL),單位為秒,命令文法如下所示。

  • TTL到期時間是按照資料寫入的時間開始計算,不是按照資料更新時間計算。不設定TTL的時候,預設為100年,Hologres從 V1.3.24版本開始,TTL允許的最小值是一天,即86400秒。TTL的詳細使用說明請參見SQL命令列表

  • TTL不是精確的時間,即到期後資料會在某一段時間(不是固定時間)刪除(只刪除資料,表還會存在),因此可能會出現PK重複或者查詢結果不一致等問題。

CALL set_table_property('table_name', 'time_to_live_in_seconds', '<non_negative_literal>');

情境樣本

樣本:基於業務日期的分區表

情境描述:隨著業務增長,日增訂單量可能達到千萬甚至億級。此時,若繼續使用快速上手中的單表結構(dwd_trade_orders),在大規模資料刪除(如清理歷史資料)或針對特定日期查詢時,系統負載會較高。本樣本將普通表升級為分區表。它繼承了基礎資料表的所有欄位定義和索引設定,但通過 PARTITION BY 將資料按天物理隔離。這不僅支援通過 DROP TABLE 秒級清理到期分區,還能在查詢時實現精準的“分區裁剪”,是生產環境管理超大規模即時資料的推薦方案。

BEGIN;

-- 升級版:建立分區表父表
-- 結構完全繼承自快速上手樣本,但 Primary Key 必須包含分區鍵 dt
CREATE TABLE IF NOT EXISTS public.dwd_trade_orders_partitioned (
    order_id BIGINT NOT NULL,
    shop_id INT NOT NULL,
    user_id TEXT NOT NULL,
    order_amount NUMERIC(12, 2) DEFAULT 0.00,
    payment NUMERIC(12, 2) DEFAULT 0.00,
    payment_type INT DEFAULT 0,
    is_delivered BOOLEAN DEFAULT false,
    dt TEXT NOT NULL,                               -- 分區鍵
    order_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (order_id, dt)                      -- 複合主鍵:包含業務主鍵和分區鍵
) 
PARTITION BY LIST (dt)                              -- 開啟列表分區
WITH (
    orientation = 'column',
    distribution_key = 'order_id',
    event_time_column = 'order_time',
    clustering_key = 'order_time:asc'
);

COMMIT;

-- 1. 建立子表:為特定日期建立實體儲存體空間
CREATE TABLE IF NOT EXISTS public.dwd_trade_orders_20231101 
PARTITION OF public.dwd_trade_orders_partitioned FOR VALUES IN ('20231101');

-- 2. 寫入資料:應用端邏輯與基礎資料表一致,資料會自動路由至 20231101 子表
INSERT INTO public.dwd_trade_orders_partitioned (order_id, shop_id, user_id, order_amount, payment, payment_type, is_delivered, dt, order_time) VALUES 
(50001, 101, 'U678', 299.00, 280.00, 1, true,  '20231101', '2023-11-01 10:00:01+08'),
(50002, 102, 'U992', 59.00,  59.00,  2, false, '20231101', '2023-11-01 10:05:12+08'),
(50003, 101, 'U441', 150.00, 145.00, 1, true,  '20231101', '2023-11-01 10:10:45+08'),
(50004, 105, 'U219', 888.00, 888.00, 3, true,  '20231101', '2023-11-01 10:20:11+08'),
(50005, 102, 'U883', 35.00,  30.00,  1, false, '20231101', '2023-11-01 10:32:00+08'),
(50006, 110, 'U007', 120.50, 120.50, 2, true,  '20231101', '2023-11-01 10:45:33+08'),
(50007, 101, 'U321', 210.00, 210.00, 1, true,  '20231101', '2023-11-01 11:02:19+08'),
(50008, 108, 'U556', 45.00,  45.00,  2, false, '20231101', '2023-11-01 11:15:04+08'),
(50009, 101, 'U112', 300.00, 290.00, 3, true,  '20231101', '2023-11-01 11:25:55+08'),
(50010, 105, 'U449', 99.90,  99.90,  1, true,  '20231101', '2023-11-01 11:40:22+08');

-- 3. 分區裁剪:查詢時指定 dt 條件,系統僅掃描相關子表,避免全表掃描
SELECT COUNT(*) FROM public.dwd_trade_orders_partitioned WHERE dt = '20231101';

-- 4. 快速清理:刪除到期資料時,直接 DROP 子表,秒級回收空間
-- DROP TABLE public.dwd_trade_orders_20231101; 

樣本:海量資料即時分析情境(事實表)

情境描述:用於即時大盤匯總。此類表通常資料量極大,核心需求是統計彙總效能(如計算 GMV、訂單量)。

BEGIN;

-- 顯式指定 public schema
CREATE TABLE IF NOT EXISTS public.dwd_order_summary (
    order_id BIGINT PRIMARY KEY,
    category_id INT NOT NULL,
    gmv NUMERIC(15, 2),
    order_time TIMESTAMPTZ NOT NULL
) WITH (
    orientation = 'column',             -- 儲存模式:列存。海量彙總分析的首選,提供高壓縮比和高效的列掃描
    distribution_key = 'order_id',      -- 分布鍵:按 order_id 分區,確保資料均勻分布;關聯其他訂單表時可實現 Local Join
    event_time_column = 'order_time',   -- 分段鍵:通常設為時間欄位。系統會按此欄位劃分檔案段,加速按時間範圍的過濾
    clustering_key = 'order_time:asc'   -- 聚簇索引:物理上按時間升序排列。在查詢“最近1小時”或“某天”的資料時,減少磁碟 I/O
);

-- 添加中繼資料注釋,便於後續資料治理
COMMENT ON TABLE public.dwd_order_summary IS '訂單匯總明細事實表';
COMMENT ON COLUMN public.dwd_order_summary.order_id IS '唯一訂單ID';
COMMENT ON COLUMN public.dwd_order_summary.category_id IS '品類ID';
COMMENT ON COLUMN public.dwd_order_summary.gmv IS '成交額';
COMMENT ON COLUMN public.dwd_order_summary.order_time IS '下單時間';

COMMIT;

樣本:高並發主鍵點查情境(維表)

情境描述:根據 user_id 毫秒級回顯使用者畫像。此類表側重於高 QPS 下的極低延遲響應。

BEGIN;

-- 顯式指定 public schema
CREATE TABLE IF NOT EXISTS public.dim_user_persona (
    user_id TEXT PRIMARY KEY,           -- 主鍵:點查情境的核心,必須設定
    user_level INT,
    persona_jsonb JSONB 
) WITH (
    orientation = 'row'                 -- 儲存模式:行存。專門為基於主鍵的點查(Point Lookup)最佳化,響應速度可達毫秒級
    -- 說明:行存表會自動將主鍵設為分布鍵和聚簇索引,無需額外設定
);

-- 添加中繼資料注釋
COMMENT ON TABLE public.dim_user_persona IS '使用者畫像維度資料表';
COMMENT ON COLUMN public.dim_user_persona.user_id IS '唯一使用者ID';
COMMENT ON COLUMN public.dim_user_persona.user_level IS '使用者等級';
COMMENT ON COLUMN public.dim_user_persona.persona_jsonb IS '使用者特徵畫像JSON';

COMMIT;

樣本:混合負載情境(行列共存)

情境描述:物流售後系統。既要對物流狀態進行分析匯總(分析類),也要根據訂單 ID 瞬間調取物流詳情(點查類)。

BEGIN;

-- 顯式指定 public schema
CREATE TABLE IF NOT EXISTS public.ads_shipping_info (
    order_id BIGINT PRIMARY KEY,
    shipping_status INT,
    receiver_address TEXT,
    update_time TIMESTAMPTZ
) WITH (
    orientation = 'row,column',         -- 儲存模式:行列共存。同時擁有行存的毫秒級點查和列存的高效彙總分析能力
    distribution_key = 'order_id',      -- 分布鍵:決定資料在 Shard 間的分布邏輯
    bitmap_columns = 'shipping_status'  -- 位元影像索引:針對狀態欄位等低基數列設定,極大加速“狀態過濾”類的查詢
);

-- 添加中繼資料注釋
COMMENT ON TABLE public.ads_shipping_info IS '物流狀態查詢應用表';
COMMENT ON COLUMN public.ads_shipping_info.order_id IS '訂單ID';
COMMENT ON COLUMN public.ads_shipping_info.shipping_status IS '物流狀態(1:待發貨, 2:運輸中, 3:已簽收)';
COMMENT ON COLUMN public.ads_shipping_info.receiver_address IS '收貨地址';

COMMIT;

使用限制

主鍵設定限制

  • 複合主鍵:支援將多個欄位設定為Primary Key。必須為not nullable,且只能在一條語句中設定。

    BEGIN;
    CREATE TABLE public.test (
     "id" text NOT NULL,
     "ds" text NOT NULL,
    PRIMARY KEY (id,ds)
    );
    CALL SET_TABLE_PROPERTY('public.test', 'orientation', 'column');
    COMMIT;
  • 類型限制:不支援 Float、Double、Numeric、Array、Json、Date 等複雜類型。

  • 修改限制:不支援修改主鍵,需重構。

  • 儲存依賴:行存表和行列共存表必須有主鍵,列存表可選。

約束支援情況

參數

column_constraints

table_constraints

primary key

支援

支援

not null

支援

-

null

支援

-

unique

不支援

不支援

check

不支援

不支援

default

支援

不支援

關鍵字、大小寫與轉義限制

  • 命名規範:列名不能以hg_開頭;Schema不能以holo_hg_pg_開頭。

  • 轉義情境:關鍵字、保留字、系統欄位(如ctid)、大小寫敏感名稱、特殊字元、數字開頭名稱必須加雙引號("")。

  • V2.0版本文法最佳化:

    • 開關舊文法:

      -- session層級開啟舊文法開關
      set hg_disable_parse_holo_property = on;
      -- DB層級開啟舊文法開關
      alter database <db_name> set hg_disable_parse_holo_property = on;
    • 轉義列設定屬性的樣本:

      create table "TBL" (a int);
      select relname from pg_class where relname = 'TBL';
      insert into "TBL" values (-1977);
      select * from "TBL";
      ------------------------------------------------------------------
      -- Hologres V2.0版本起,為需要轉義的列設定表屬性的文法
      begin;
      create table tbl (c1 int not null);
      call set_table_property('tbl', 'clustering_key', '"c1":asc'); 
      commit;
      -- Hologres V2.0版本前,為需要轉義的列設定表屬性的文法
      begin;
      create table tbl (c1 int not null);
      call set_table_property('tbl', 'clustering_key', '"c1:asc"'); 
      commit;
      ------------------------------------------------------------------
      -- Hologres V2.1版本起,為多列(包含大寫)設定表屬性的文法
      begin;
      create table tbl ("C1" int not null, c2 text not null) with (clustering_key = '"C1",c2');
      commit;
      -- Hologres V2.0版本起,為多列(包含大寫)設定表屬性的文法
      begin;
      create table tbl ("C1" int not null, c2 text not null);
      call set_table_property('tbl', 'clustering_key', '"C1",c2'); 
      commit;
      -- Hologres V2.0版本前,為多列(包含大寫)設定表屬性的文法
      begin;
      create table tbl ("C1" int not null, c2 text not null);
      call set_table_property('tbl', 'clustering_key', '"C1,c2"'); 
      commit;
      ------------------------------------------------------------------
      create table "Tab_$A%*" (a int);
      select relname from pg_class where relname = 'Tab_$A%*';
      insert into "Tab_$A%*" values (-1977);
      select * from "Tab_$A%*";
      ------------------------------------------------------------------
      create table tbl ("2c" int not null);
      insert into tbl values (3), (4);
      select "2c" from tbl;

建表邏輯限制

配置項

指定 IF NOT EXISTS

不指定 IF NOT EXISTS

存在同名表

提示 NOTICE 並跳過,返回成功

返回異常 ERROR

不存在同名表

返回成功

返回成功

修改限制

  • 長度限制:表名不能超過127位元組。

  • 不支援修改的專案:

    • 不支援修改資料類型。

    • 不支援調整列順序。

    • 不支援修改空值約束(not nullnullable互轉)。

    • 儲存布局屬性:一經建立,orientationdistribution_keyclustering_keyevent_time_column 不支援更改。

  • 支援修改的專案:bitmap_columns 和 dictionary_encoding_columns 可以在建表後更改。