表设计

最近更新时间:2026-05-06 16:28:12

我的收藏
本文为您介绍如何通过科学设计表结构(包括表类型、分桶、主键、排序键及分区)来榨干 TCHouse-X 的性能,实现查询加速与存储成本的平衡。

分桶

分桶是 TCHouse-X 实现并行计算的核心。通过 PARTITIONED BY SPEC(BUCKET(n, column)),数据会根据指定列的 Hash 值分布到不同的节点上。

示例代码

CREATE TABLE supplier (
s_suppkey INT NOT NULL,
s_name STRING NOT NULL,
s_nationkey INT NOT NULL,
PRIMARY KEY (s_suppkey)
)
PARTITIONED BY SPEC (
BUCKET(128, s_suppkey) -- 建议分桶数为 2 的幂次方
);

最佳实践与避坑

高基数列优先: 选择值分布均匀的字段(如 user_id, order_id),避免数据倾斜
严禁使用时间列: 避免使用 DATETIMESTAMP 作为分桶键。否则,查询最近数据时压力会集中在少数桶,导致“一核有难,多核围观”。
本地 Join 优化:将经常需要相互关联(Join)的字段设为分桶键。当两张表以相同分桶键关联时,可触发 Colocated Join,省去昂贵的数据网络传输(Shuffle)。
查询裁剪: 优先选择 WHERE 条件中高频出现的过滤字段。

主键

主键不仅是数据的唯一标识,更是实现高效更新(Upsert/Delete)的基石。

核心规则

更新必备: 只有定义了主键的表才支持 UPDATEDELETE 操作。
字段精简: 推荐使用数值类型(如 BIGINT)作为主键。主键越短,索引维护成本越低。
包含关系主键必须包含所有的分桶键和分区键。建议将分桶键/分区键放在组合主键的前部。

排序

底层存储会按照 SORT BY LEXICAL 指定的列进行物理排序,这就像为图书馆的图书编码。

收益分析

查询加速: 排序键能显著收窄扫描范围。对于范围查询(><BETWEEN),TCHouse-X 可以快速跳过不相关的数据块(Block Skipping)。
压缩效率: 相同或相似的值由于物理位置相邻,压缩算法能获得更高的压缩比,降低存储开销。

分区

分区是数据管理的第一层边界,通常按时间或业务大类划分。

最佳实践

规避方案:分区不支持函数表达式

目前不支持 PARTITIONED BY SPEC(HOUR(ts)) 这种写法。
解决方案: 冗余分区列。
建表时显式增加分区字段:start_time_hour INT
写入时手动计算:INSERT INTO ... VALUES (..., HOUR(now()))

规避方案:不支持 INSERT OVERWRITE 目标分区

若需刷新特定分区数据:
标准流程: ALTER TABLE ... DROP PARTITION (...) INSERT INTO ...