ClickHouse查看执行计划

860 阅读2分钟

一、概述

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

二、基本语法

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 和 PIPELINE 还可以进行额外的显示设置,如上参数所示。

三、案例实操

3.1 新版本使用EXPLAIN

可以再安装一个 20.6 以上版本,或者直接在官网的在线 demo,选择高版本进行测试。

(1)查看PLAIN

  • 简单查询
explain plan select arrayJoin([1,2,3,null,null]);

09.ClickHouse查看执行计划01.jpg

  • 复杂 SQL 的执行计划
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;

09.ClickHouse查看执行计划02.jpg

  • 打开全部的参数的执行计划
EXPLAIN header=1, actions=1,description=1 SELECT number from system.numbers limit 10;

09.ClickHouse查看执行计划03.jpg

(2)AST 语法树

EXPLAIN AST SELECT number from system.numbers limit 10;

09.ClickHouse查看执行计划04.jpg

(3)SYNTAX 语法优化

  • 先做一次查询

    SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'leefs') FROM numbers(10);
    

    09.ClickHouse查看执行计划05.jpg

  • 查看语法优化

    EXPLAIN SYNTAX SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'leefs') FROM numbers(10);
    

    09.ClickHouse查看执行计划06.jpg

  • 开启三元运算符优化

    SET optimize_if_chain_to_multiif = 1;
    
  • 再次查看语法优化

    EXPLAIN SYNTAX SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'leefs') FROM numbers(10);
    

09.ClickHouse查看执行计划07.jpg

(4)查看PIPELINE

EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 20;

09.ClickHouse查看执行计划08.jpg

  • 打开其他参数
EXPLAIN PIPELINE header=1,graph=1 SELECT sum(number) FROM numbers_mt(10000) GROUP BY number%20;

3.2 老版本查看执行计划

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子句,减小查询返回的数据量。