本文为您介绍如何通过科学设计表结构(包括表类型、分桶、主键、排序键及分区)来榨干 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),避免数据倾斜。严禁使用时间列: 避免使用
DATE 或 TIMESTAMP 作为分桶键。否则,查询最近数据时压力会集中在少数桶,导致“一核有难,多核围观”。本地 Join 优化:将经常需要相互关联(Join)的字段设为分桶键。当两张表以相同分桶键关联时,可触发 Colocated Join,省去昂贵的数据网络传输(Shuffle)。
查询裁剪: 优先选择
WHERE 条件中高频出现的过滤字段。主键
主键不仅是数据的唯一标识,更是实现高效更新(Upsert/Delete)的基石。
核心规则
更新必备: 只有定义了主键的表才支持
UPDATE 和 DELETE 操作。字段精简: 推荐使用数值类型(如
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 ...。