表是 Hologres 儲存和組織資料的基本單位。通過合理地設定儲存模式、表索引及屬性,可以為您提供高效的即時資料處理和大規模分析能力。
快速上手
準備工作
已建立資料庫。
已串連Hologres目標資料庫,推薦串連HoloWeb並執行查詢。
建表
推薦使用 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 | 否,如需修改請重建立表。 |
distribution_key | 分布鍵,設定表資料的分布策略。詳情參見分布鍵Distribution Key。 | 預設為主鍵,根據業務情境修改。 | 預設為主鍵。 | 預設為主鍵。 | 主鍵的子集,建議只選擇一列。 | |
clustering_key | 聚簇索引,用於提升查詢效能,詳情參見聚簇索引Clustering Key。 | 預設為空白。 | 預設為主鍵。 | 預設為空白。 | 建議最多選擇一列,且僅支援asc序。 | |
event_time_column | 分段鍵,用於提升查詢效能,詳情參見Event Time Column(Segment Key)。 | 預設為第一個非空時間戳記欄位。 | 不支援。 | 預設為第一個非空時間戳記欄位。 | 建議時間戳記欄位。 | |
table_group | 邏輯儲存概念,用於管理Shard數。詳情參見Table Group與Shard Count操作指南。 | 預設為 | 預設即可。 | 否,如需修改請重建立表或者Resharding。 | ||
bitmap_columns | 位元影像索引。詳情參見位元影像索引Bitmap。 | 按需使用。 | 不支援。 | 按需使用。 | 建議用於等值比較的列,一般10列以下。 | 是,詳情請參見ALTER TABLE。 |
字典編碼。 | 按需使用。 | 不支援。 | 按需使用。 | 建議低基數列,一般10列以下。 | 是,詳情請參見ALTER TABLE。 | |
設定表的資料生命週期,單位為秒。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 null與nullable互轉)。儲存布局屬性:一經建立,
orientation、distribution_key、clustering_key、event_time_column不支援更改。
支援修改的專案:
bitmap_columns和dictionary_encoding_columns可以在建表後更改。