补得挺全,numbers() 造数和 Too many parts 这两个确实是新手最先遇到的问题,多数人卡在灌数据阶段,也正因为这两点。顺着物化视图那段,我再补三个容易出问题的地方。
SummingMergeTree 只对 ORDER BY 之外的数值列求和,非数值列和维度列在合并时只会取任意一行的值。因此,版块名、日期这类维度字段必须全部放进 ORDER BY,否则合并后数据会和原表对不上;聚合列最好显式声明 SummingMergeTree((pv, uv, stay_ms)),不要依赖默认行为,否则哪天新增一个数值列,它会被悄悄当成求和列。
物化视图是写入触发器,不是自动回填。建完 MV 后,历史数据一条都不会进去,得手动 INSERT INTO agg SELECT ... FROM page_views 回填一次;同时聚合表本身也要配 TTL,很多人只给源表配了 TTL,结果明细过期清干净了,聚合表越积越大。另外,大批量 INSERT 时 MV 是同步计算的,会拖慢写入,所以灌历史数据前先临时禁用 MV 会快不少。
如果应用侧确实攒不了批,比如实时打点,可以在连接串加 async_insert=1&wait_for_async_insert=1,让服务端自己合并小写入,能避免 part 数量失控,代价是延迟会略有增加。
顺带说一句,造数用 numbers_mt 多线程会更快;另外 rand() 造出来的时间分布太均匀,用来测「近 7 天趋势」这类带时间过滤的查询,结果和真实数据差得比较多,建议 event_time 用 now() - rand() % (86400*90) 制造出倾斜。

正式会员
认证极客









