一、表类型选型(优先级 + 场景)
表格
| 表类型 | 关键字 | 适用场景 | 关键特性 |
|---|---|---|---|
| 列存储表(推荐) | COLUMN TABLE |
大数据、报表、聚合、分析查询 | 默认自动合并、支持分区 / 压缩,HANA 主流 |
| 行存储表 | ROW TABLE |
小配置表、码表、单条全字段查询 | 默认类型,不适合海量数据 |
| 历史表(时间旅行) | HISTORY COLUMN TABLE |
需查询历史数据、数据回溯 | 必须建主键;仅支持查询,会话需开启历史模式 |
| 全局临时表 | GLOBAL TEMPORARY |
跨会话共用表结构、会话隔离数据 | 元数据持久,会话结束数据清空;支持增删改查 |
| 本地临时表 | LOCAL TEMPORARY |
仅当前会话使用 | 结构 + 数据会话隔离,会话结束自动清理 |
口诀:分析用列存,小表用行存,回溯用历史表,临时业务用全局临时表
二、基础语法模板
1. 常规建表(列定义)
sql
-- 列存储(通用业务表)
CREATE COLUMN TABLE 模式名.表名 (
列名 数据类型 [约束] [DEFAULT 默认值],
列名 数据类型 [GENERATED ALWAYS AS 表达式], -- 计算列
[表级约束]
)
[LOGGING | NO LOGGING] -- 日志开关
[AUTO MERGE | NO AUTO MERGE] -- 增量合并开关
[PARTITION BY 分区规则] -- 分区
[AT LOCATION '主机:端口']; -- 分布式指定节点
2. 复制表结构 / 数据
sql
-- 仅复制结构(默认 WITH NO DATA)
CREATE TABLE 新表 LIKE 源表;
-- 结构+数据全复制
CREATE TABLE 新表 LIKE 源表 WITH DATA;
-- 基于查询结果建表(仅继承 NOT NULL 约束)
CREATE TABLE 新表 AS (SELECT 列 FROM 源表) [WITH NO DATA | WITH DATA];
三、列与约束规范
1. 常用数据类型
- 整型:
TINYINT/SMALLINT/INTEGER/BIGINT - 浮点 / 精度数值:
DECIMAL/REAL/DOUBLE - 字符:
VARCHAR(单字节) /NVARCHAR(多语言 / 推荐) - 时间:
DATE/TIME/SECONDDATE/TIMESTAMP - 大对象:
BLOB(二进制)、CLOB/NCLOB(大文本)
2. 约束(索引类型)
NULL/NOT NULL:是否允许空,默认NULLUNIQUE:唯一约束PRIMARY KEY:主键(非空 + 唯一,历史表强制要有)- 索引后缀:
BTREE(普通 B + 树)、CPBTREE(压缩前缀 B + 树,长字符 / 复合键优先)
3. 特殊列
- 默认值:
列名 类型 DEFAULT '值' - 计算列:
列名 类型 GENERATED ALWAYS AS (表达式)
四、核心开关配置
- 日志模式
LOGGING(默认):记录事务日志,支持故障恢复;正式业务表必选NO LOGGING:无日志、写入更快,异常数据丢失风险高;仅临时 / 中间表使用
- 增量合并
AUTO MERGE(默认):列存表自动合并 Delta 区,常规场景保留NO AUTO MERGE:关闭自动合并,大批量导入数据时临时使用
五、分区语法(海量数据必备)
1. 分区类型 & 用法
-
RANGE 范围分区 :时间、有序数值(最常用)
sql
PARTITION BY RANGE(分区列) ( PARTITION '2024-01-01' <= VALUES < '2025-01-01', PARTITION VALUE = '2025-02-01', PARTITION OTHERS -- 兜底分区 ) -
HASH 哈希分区 :数据均匀打散,无顺序要求
sql
PARTITION BY HASH(列1,列2) PARTITIONS 分区数 -
ROUNDROBIN 轮询分区 :纯均衡分发,不依赖字段
sql
PARTITION BY ROUNDROBIN PARTITIONS 分区数
2. 多级分区:支持 HASH+RANGE 组合
六、临时表操作限制
- GLOBAL TEMPORARY 支持:建表、重命名、增删改查、索引、视图、同义词、TRUNCATE/DROP 限制:无数据时才能删表;数据会话隔离
- LOCAL TEMPORARY 支持:建表、增删改查、TRUNCATE/DROP 限制:结构 & 数据仅当前会话可见,功能少于全局临时表
七、历史表「时间旅行」用法
-
前提:表为
HISTORY COLUMN TABLE+ 建有主键 -
会话级回溯(整会话查询历史数据) sql
SET HISTORY SESSION TO UTCTIMESTAMP 'UTC时间戳'; -- 或基于提交ID SET HISTORY SESSION TO COMMIT ID 数值; -- 退出历史会话:执行 COMMIT / ROLLBACK -
语句级回溯(单条查询指定时间点) sql
SELECT * FROM 历史表 AS OF UTCTIMESTAMP 'UTC时间戳'; -
补充规则
- 历史会话必须关闭自动提交
- 非历史表始终查询当前数据
- 仅允许
SELECT,不可 DML/DDL
八、生产最佳实践(落地规范)
- 常规业务表:统一使用
COLUMN TABLE,必建主键,保留LOGGING + AUTO MERGE - 小字典 / 配置表:使用
ROW TABLE - 需数据回溯审计:选用
HISTORY COLUMN TABLE,提前规划主键 - 会话级临时计算数据:优先
GLOBAL TEMPORARY - 千万级以上大表:强制分区,时间维度优先 RANGE 分区
- 大批量导入场景:临时开启
NO AUTO MERGE + NO LOGGING,导入完成改回默认 - 字符字段:多语言环境统一用
NVARCHAR
九、高频示例(直接复制运行)
sql
-- 1. 标准列存业务表
CREATE COLUMN TABLE TEST_USER (
USER_ID INT PRIMARY KEY,
USER_NAME NVARCHAR(50) NOT NULL,
CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) LOGGING AUTO MERGE;
-- 2. 时间范围分区表
CREATE COLUMN TABLE SALE_DATA (
ID INT,
SALE_DATE DATE,
AMOUNT DECIMAL(18,2),
PRIMARY KEY(ID, SALE_DATE)
) PARTITION BY RANGE(SALE_DATE) (
PARTITION '2025-01-01' <= VALUES < '2025-07-01',
PARTITION OTHERS
);
-- 3. 全局临时表
CREATE GLOBAL TEMPORARY TABLE TMP_DATA (
COL1 INT,
COL2 NVARCHAR(100)
);
-- 4. 历史回溯表
CREATE HISTORY COLUMN TABLE HIS_LOG (
LOG_ID INT PRIMARY KEY,
CONTENT NCLOB
);