真实对同一条查询跑SYNTAX/PLAN/PIPELINE/ESTIMATE四种EXPLAIN模式,看清楚它们真实分别对应从SQL写法到物理执行细节的四个不同层次。
代码EXPLAIN SYNTAX SELECT sum(v) FROM demo.threadtest WHERE k > 100 GROUP BY k % 10; EXPLAIN PLAN SELECT sum(v) FROM demo.threadtest WHERE k > 100 GROUP BY k % 10; EXPLAIN PIPELINE SELECT sum(v) FROM demo.threadtest WHERE k > 100 GROUP BY k % 10; EXPLAIN ESTIMATE SELECT sum(v) FROM demo.threadtest WHERE k > 100;
EXPLAIN SYNTAX(语法层:运算符被重写成函数调用)
→ SELECT sum(v) FROM demo.threadtest WHERE greater(k, 100) GROUP BY modulo(k, 10)
EXPLAIN PLAN(逻辑计划:抽象的执行步骤)
→ Aggregating
Keys: k MOD 10 | Aggregates: sum(v)
└──ReadFromMergeTree (demo.threadtest)
Parts: 2 | Granules: 245
EXPLAIN PIPELINE(物理管线:真实的并行度细节)
→ (Expression) ExpressionTransform × 10
(Aggregating) AggregatingTransform × 10
(Expression) ExpressionTransform × 10
(ReadFromMergeTree) MergeTreeSelect(...) × 10
EXPLAIN ESTIMATE(预估:不真正执行,只给数量级)
→ demo threadtest 2(parts) 2000000(rows) 245(marks)四条EXPLAIN真实对应四个由浅到深的层次:SYNTAX只做语法层面的重写,还没有涉及任何执行细节;PLAN给出的是逻辑上"要做哪几步",但不涉及并行度这类物理执行细节;PIPELINE真实展开成了物理执行图,×10精确对应本系列前面《max_threads》验证过的本机10核并行度;ESTIMATE真实完全不执行查询本身,只是快速给出一个"大概要碰多少数据"的数量级预估。
每一步都是本文上面用真实4种EXPLAIN模式跑出来的原始结果。
EXPLAIN SYNTAX/PLAN/PIPELINE/ESTIMATE