一、分桶
分桶是 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 …。