真实用只在单个节点有数据的维度表对比普通IN和GLOBAL IN,验证GLOBAL IN真实如何通过广播机制避开分布式JOIN同样的静默漏算问题。
代码-- 真实清空node3本地的dim_local,只剩node1有完整数据 TRUNCATE TABLE demo.dim_local; -- 在node3上执行 -- 普通IN:子查询会在哪里执行? SELECT count() FROM demo.dist_tbl WHERE k IN (SELECT id FROM demo.dim_local WHERE id < 500); -- GLOBAL IN SELECT count() FROM demo.dist_tbl WHERE k GLOBAL IN (SELECT id FROM demo.dim_local WHERE id < 500);
普通IN :SELECT count() FROM demo.dist_tbl WHERE k IN (...) → 50 GLOBAL IN:SELECT count() FROM demo.dist_tbl WHERE k GLOBAL IN (...) → 100
跟上一篇《分布式JOIN为什么容易变慢》验证的现象真实是同一个根源:普通IN子查询会被真实下推到每个分片各自执行,分片2(node3)执行这个子查询时用的是它自己本地(已清空)的dim_local,子查询结果是空集,所以分片2对WHERE k IN (...)的判断全部为假,真实一行都没匹配上,最终只有分片1的50行被算进了结果。
每一步都是本文上面用真实分布式集群跑出来的原始结果。
IN 与 GLOBAL IN 在数据分布不均时的行为差异