基本语法
EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]
- PLAN:用于查看执行计划,默认值
- header打印计划中各个步骤的head说明,默认关闭,默认值0
- description打印计划中各个步骤的描述,默认开启,默认值1
- actions打印计划中各个步骤的详细信息,默认关闭,默认值0
- AST:用于查看语法树
- SYNTAX:用于优化语法
- PIPELINE:用于查看PIPELINE计划
- header打印计划中各个步骤的head说明,默认关闭
- graph用DOT图形语言描述管道图,默认关闭,需要查看相关的图形需要配合graphviz查看
- actions如果开启了graph,紧凑打印打,默认开启
案例
- 查看PLAN
复杂SQL的执行计划
explain plan select arrayJoin([1,2,3,null,null]);
输出
┌─explain───────────────────────────────────────────────────────────────────┐
│ Expression ((Projection + Before ORDER BY)) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromStorage (SystemOne) │
└───────────────────────────────────────────────────────────────────────────┘
缩进就是一步一步的走
打开全部的参数的执行计划
explain select database,table,count(1) cnt from system.parts where database in ('datasets','system') group by database,table order by database,cnt desc limit 2 by database;
explain header=1, actions=1,description=1 SELECT number from system.numbers limit 10;
- AST语法树
explain ast select number from system.numbers limit 10;
- SYNTAX语法优化
查看优化之后的语法是啥样
// 先做一次查询
select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
// 查看语法优化
explain syntax select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
// 开启三元运算符优化
set optimize_if_chain_to_multiif = 1;
// 再次查看语法优化
explain syntax select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
// 返回优化后的语句
select multiIf(number = 1, 'hello', number = 2, 'world', 'atguigu') from numbers(10);
- 查看PIPELINE
explain pipeline select sum(number) from numbers_mt(100000) group by number % 20;
// 打开其他参数
explain pipeline header=1,graph=1 select sum(number) from numbers_mt(10000) group by number%20;
老版本查看执行计划
clickhouse-client -h 主机名 --send_logs_level=trace <<< "sql" > /dev/null
其中,send_logs_level
参数指定日志等级为 trace,<<<
将 SQL 语句重定向至 clickhouse-client 进行查询,
>/dev/null
将查询结果重定向到空设备吞掉,以便观察日志
注意:
- 通过将 ClickHouse 的服务日志,设置到 DEBUG 或者 TRACE 级别,才可以变相实现 EXPLAIN 查询的作用。
- 需要真正的执行 SQL 查询,CH 才能打印计划日志,所以如果表的数据量很大,最好借助LIMIT子句,减小查询返回的数据量。