Clickhouse 学习笔记(7)—— 查看执行计划

在 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,紧凑打印,默认开启

PLAN

简单查询:

执行语句

sql 复制代码
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;

该语句中涉及到聚合、过滤、分组、排序以及limit

其执行计划如下:

打开参数

sql 复制代码
EXPLAIN header=1, actions=1,description=1 select arrayJoin([1,2,3,null,null]);

结果如下:

与不加参数对比,描述更详细了些

AST 语法树

sql 复制代码
EXPLAIN AST select arrayJoin([1,2,3,null,null]);

SYNTAX 语法优化

以一个三元组查询为例:

sql 复制代码
SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') FROM numbers(10);

查询结果如上,从字段名也可以看出内部具体是执行的怎样的语句

查看语法优化计划

sql 复制代码
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 <name>

  • changed 只显示和默认值不同的参数,也就是被改动过的(查看参数的变动情况)
  • LIKE 模糊匹配,区分大小写
  • ILIKE 模糊匹配,不区分大小写 insensitive like

参考:Clickhouse 设置和查看参数值set和show settings -- 老紫竹的家

再次查询,结果如下:

可以看到,使用了一个multiIf函数来执行:

这样我们执行查询的时候就可以直接使用优化后的语句了;

multiif的用法:

Conditional Functions | ClickHouse Docs

PIPELINE

以一个有group by的语句为例:

sql 复制代码
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 将查询结果重定向到空设备吞掉,以便观察日志

相关推荐
泛联新安32 分钟前
软件定义汽车时代,如何让AI研发“可信”?——泛联新安构建汽车企业级可信AI体系的落地路径
大数据·人工智能·安全·网络安全·汽车·漏洞挖掘·代码安全
杨云龙UP37 分钟前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
SelectDB技术团队2 小时前
一条日志两套引擎的账:把 Elasticsearch 检索与分析合并到同一份数据的落地写法
大数据·数据库·elasticsearch·搜索引擎·全文检索·日志·apache doris
大大大大晴天2 小时前
每天认识一个组件:远端数据服务Apache Celeborn
大数据
拔剑纵狂歌2 小时前
ClickHouse system.query_log 字段详解与排障实践
后端·clickhouse·1024程序员节
幂律智能3 小时前
海外业务不同,合同系统该怎么建?
大数据·人工智能
Leo.yuan3 小时前
数据开发即质量检测:FineDataLink 5.0 在生产数据链路中的一体化实践
大数据
哲霖软件3 小时前
非标机械设备公司怎么做信息化?破解通用ERP水土不服难题
大数据·运维
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐:基于大数据的杭州亚运会社交媒体互动数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·课程设计·数据分析数据可视化
Leo.yuan4 小时前
2026中国数据处理平台行业研究:实时、质量与一体化能力成为竞争重点
大数据