供应链场景使用ClickHouse最佳实践
内容提要
ClickHouse是供应链数字化团队使用的实时数据存储工具,具有命名约定和建表约定。数据写入约定建议使用JDQ队列进行解耦和共享。DTS任务命名规则为' sc_digital_${集群ID}_${分布式表名}'。数据查询约定包括使用prewhere替代where、尽量包含分区键和主键索引前缀字段、避免使用Select *、where和group by顺序统一、避免使用JOIN、使用final去重和二级索引的使用注意事项。
延伸解读
命名约定如何提升运维效率
文章强调表名、字段名和DTS任务名的统一约定,能带来三项实际好处:通过CK表名快速定位对应的DTS任务和JDQ topic;通过字段前缀追溯数据来自哪个业务表;快速统计团队或集群的DTS任务数量,避免运维遗漏。这些约定对不熟悉业务的人员尤其有帮助,降低了排查和交接成本。
写入链路解耦与批次控制
供应链场景没有让Flink直接写ClickHouse,而是先发送到JDQ队列,再由DTS任务消费写入。这样做实现了加工与存储解耦,JDQ消息可共享,需要主备存储时只需新建DTS任务订阅同一队列写入备用集群。批次方面建议每次插入约50万行,最多不超过100万行,因为MergeTree引擎频繁少量插入会导致data part过多、合并不过来。
查询性能优化的关键点
查询约定围绕减少IO和利用索引展开:用prewhere替代where,且仅MergeTree系列表引擎支持;where条件尽量包含分区键和主键索引前缀字段,遵循最左原则;避免SELECT *,只选需要的列;where和group by的列顺序要与order by一致并放在最前面,以形成连续公共前缀。此外应避免JOIN,必须使用时右表选小表。
去重与二级索引的注意事项
去重查询建议使用final,尽量不要用argMax。二级索引有两个限制:可变值字段不能添加二级索引,否则按该字段查询会先走索引再合并数据,查出额外的中间态数据;增加二级索引只对后续新增数据生效,若要让历史数据也走索引,需要按分区刷新数据。这些细节直接影响查询结果的准确性和性能。
Q&A
ClickHouse在供应链数字化中有什么应用?
ClickHouse用于存储实时数据,帮助供应链数字化团队进行数据管理和分析。
如何命名ClickHouse的DTS任务?
DTS任务命名规则为'sc_digital_${集群ID}_${分布式表名}'。
在ClickHouse中,如何优化数据查询性能?
建议使用prewhere替代where,避免使用SELECT *,并确保where和group by的列顺序与建表语句一致。
ClickHouse的表命名约定是什么?
本地表命名必须以_local结尾,分布式表命名必须以_all结尾。
在ClickHouse中,如何设置分区键?
大表建议按天分区,小表按月分区,分区键应使用date和datetime字段,避免使用string类型。
ClickHouse中如何处理新增列的操作?
新增列时,本地表可直接修改,分布式表需根据数据写入情况分步骤进行修改。