在 clickhouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到,并且只能真正执行sql,在执行日志里面查看。 在20.6版本引入了原生的执行计划的语法。 在20.6.3版本成为正式版本的功能

基本语法

  1. EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]
  1. PLAN:用于查看执行计划,默认值
  • header打印计划中各个步骤的head说明,默认关闭,默认值0
  • description打印计划中各个步骤的描述,默认开启,默认值1
  • actions打印计划中各个步骤的详细信息,默认关闭,默认值0
  1. AST:用于查看语法树
  1. SYNTAX:用于优化语法
  1. PIPELINE:用于查看PIPELINE计划
  • header打印计划中各个步骤的head说明,默认关闭
  • graph用DOT图形语言描述管道图,默认关闭,需要查看相关的图形需要配合graphviz查看
  • actions如果开启了graph,紧凑打印打,默认开启

案例

  1. 查看PLAN
简单查询
  1. explain plan select arrayJoin([1,2,3,null,null]);
  2. 输出
  3. ┌─explain───────────────────────────────────────────────────────────────────┐
  4. Expression ((Projection + Before ORDER BY))
  5. SettingQuotaAndLimits (Set limits and quota after reading from storage)
  6. ReadFromStorage (SystemOne)
  7. └───────────────────────────────────────────────────────────────────────────┘
  8. 缩进就是一步一步的走
复杂SQL的执行计划
  1. 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;
打开全部的参数的执行计划
  1. explain header=1, actions=1,description=1 SELECT number from system.numbers limit 10;
  1. AST语法树
  1. explain ast select number from system.numbers limit 10;
  1. SYNTAX语法优化

查看优化之后的语法是啥样

  1. // 先做一次查询
  2. select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
  3. // 查看语法优化
  4. explain syntax select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
  5. // 开启三元运算符优化
  6. set optimize_if_chain_to_multiif = 1;
  7. // 再次查看语法优化
  8. explain syntax select number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') from numbers(10);
  9. // 返回优化后的语句
  10. select multiIf(number = 1, 'hello', number = 2, 'world', 'atguigu') from numbers(10);
  1. 查看PIPELINE
  1. explain pipeline select sum(number) from numbers_mt(100000) group by number % 20;
  2. // 打开其他参数
  3. explain pipeline header=1,graph=1 select sum(number) from numbers_mt(10000) group by number%20;

老版本查看执行计划

  1. clickhouse-client -h 主机名 --send_logs_level=trace <<< "sql" > /dev/null

其中,send_logs_level 参数指定日志等级为 trace,<<<将 SQL 语句重定向至 clickhouse-client 进行查询,

>/dev/null 将查询结果重定向到空设备吞掉,以便观察日志

注意:

  1. 通过将 ClickHouse 的服务日志,设置到 DEBUG 或者 TRACE 级别,才可以变相实现 EXPLAIN 查询的作用。
  2. 需要真正的执行 SQL 查询,CH 才能打印计划日志,所以如果表的数据量很大,最好借助LIMIT子句,减小查询返回的数据量。