第 9 章 · JOIN 与字典

交互式演示:JOIN 算法决策树 / JOIN vs Dictionary 性能对比 / 字典布局选型 / ASOF JOIN 时序匹配

JOIN 算法选择决策树

根据右表大小、可用内存、是否分布式,逐步点选,得到推荐的 join_algorithm 设置。

右表行数大概是?

JOIN vs Dictionary 性能对比

同样的「订单 × 商品维表」聚合查询,分别用 JOIN 和 Dictionary 实现。滑动「右表大小」改变维表行数,看耗时与内存。

1,000,000

耗时对比 (ms)

内存峰值对比 (MB)

结论:右表越大,JOIN 的耗时和内存几乎线性暴涨;Dictionary 几乎是常数。
姿势原理耗时模型内存模型
JOIN (hash)右表全装内存哈希表O(R) build + O(L) probeO(R)
JOIN (parallel_hash)右表分桶并行 buildO(R/N) build + probeO(R)
JOIN (grace_hash)分桶 + 必要时 spill 磁盘慢(磁盘 IO)受 max_bytes_in_join 限制
Dictionary常驻内存 KV,O(1) 查表O(L) probe常驻 (与查询无关)

字典布局选型

ClickHouse 的 Dictionary 提供 10+ 种 LAYOUT 适应不同业务模式。点击卡片查看适用场景与 SQL。

ASOF JOIN 时序匹配演示

左表 trades(每笔交易),右表 quotes(报价)。`ASOF LEFT JOIN ... ON t.ts >= q.ts` 表示「为每笔 trade 找时间最近的、不晚于 trade 的报价」。点击「播放」看匹配过程。

匹配结果表

trade_tstrade_pricematched_quote_tsquote_bidquote_ask
关键:ASOF JOIN 的最后一个不等条件就是 ASOF 键。 改变上面的比较符,注意结果如何变化(向前找 vs 向后找)。

SQL 等价写法

SELECT t.ts, t.price, q.ts AS quote_ts, q.bid, q.ask
FROM trades t
ASOF LEFT JOIN quotes q
  ON t.symbol = q.symbol
  AND t.ts >= q.ts;