在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能
可以看到,并且只能真正执行 sql,在执行日志里面查看
在20.6版本之后可以通过explain语句查看执行计划
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,紧凑打印,默认开启
简单查询:
执行语句
explain plan select arrayJoin([1,2,3,null,null]);
复杂语句:
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;
该语句中涉及到聚合、过滤、分组、排序以及limit
其执行计划如下:
EXPLAIN header=1, actions=1,description=1 select arrayJoin([1,2,3,null,null]);
结果如下:
与不加参数对比,描述更详细了些
EXPLAIN AST select arrayJoin([1,2,3,null,null]);
以一个三元组查询为例:
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;
或者在查询语句后面加上settings optimize_if_chain_to_multiif = 1
;表示在此次查询中暂时开启三元运算符优化
如何设置和查看参数值:
设置参数:
set param=value;
查看参数:
SHOW [CHANGED] SETTINGS LIKE|ILIKE
- changed 只显示和默认值不同的参数,也就是被改动过的(查看参数的变动情况)
- LIKE 模糊匹配,区分大小写
- ILIKE 模糊匹配,不区分大小写 insensitive like
参考:Clickhouse 设置和查看参数值set和show settings – 老紫竹的家
再次查询,结果如下:
可以看到,使用了一个multiIf函数来执行:
这样我们执行查询的时候就可以直接使用优化后的语句了;
multiif的用法:
Conditional Functions | ClickHouse Docs
以一个有group by的语句为例:
EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 20;
结果如下:
其中×4则代表着当前机器有4个CPU被使用(clickhouse默认使用的CPU是16,如果少于16则全部使用)
开启参数:
clickhouse-client -h 主机名 --send_logs_level=trace <<< "sql" > /dev/null
其中,send_logs_level 参数指定日志等级为 trace,<<<将 SQL 语句重定向至 clickhouse-client 进行查询,> /dev/null 将查询结果重定向到空设备吞掉,以便观察日志