ClickHouse查看执行计划

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

本文档基于目前较新稳定版2 1.7.3.14

1 . 基本语法

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

2. 新版本使用 EXPLAIN

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

官网在线测试链接:https://play.clickhouse.tech/?file=welcome

1)查看PLAIN

简单查询

explain plan select arrayJoin(1,2,3,null,null);

复杂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;

打开全部的参数的执行计划

EXPLAIN header=1, actions=1,description=1 SELECT number from system.numbers limit 10;

2)AST语法树

EXPLAIN AST SELECT number from system.numbers limit 10;

3)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\', \'xyz\')`
`FROM numbers(10)

4)查看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;`
`

3. 老版本查看执行计划

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

相关推荐
白露与泡影5 小时前
慢 SQL 不一定是 SQL 慢:一次 MySQL 连接池耗尽的故障定位
数据库·sql·mysql
数据库小学妹6 小时前
数据库架构入门到进阶:单机、主从、分库分表到分布式的选型实战
数据仓库·分布式数据库·数据治理·数据库架构·架构设计·数据分层
ruxshui7 小时前
微服务下单跨服务数据不一致问题分析笔记
sql·微服务·架构
阿坤带你走近大数据7 小时前
Oracle新老SQL写法对比
数据库·sql·oracle
HackTwoHub8 小时前
某单位 CMS 完整渗透链、SQL 注入→后台拿权→绕过宝塔 Waf 上线 shell
数据库·人工智能·sql·安全·网络安全·系统安全·安全架构
Elastic 中国社区官方博客8 小时前
使用 Elasticsearch 作为 Grafana 的直接替代 Prometheus 后端
大数据·数据库·sql·elasticsearch·搜索引擎·grafana·prometheus
灯澜忆梦9 小时前
【MySQL1】| DDL 数据定义语言
数据库·sql·mysql
衍生星球1 天前
SpringBoot3 + Vue3 + 微信小程序如何学习,以及学哪些技术,组件
sql·微信小程序·uni-app·vue·springboot
PawSQL1 天前
PawSQL 技术月报 | 2026年6月
数据库·sql·tdsql·pawsql·sql审核