ClickHouse实时分析(八)- ClickHouse Explain详解

原文地址:https://program-park.github.io/2022/03/30/clickhouse_9/

1. 执行计划简介

  执行计划是进行查询调优的重要参考。ClickHouse 中,可以使用explain语句很方便的查看 SQL 语句的执行计划。
  在 ClickHouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到,并且只能真正执行 SQL,在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法,在 20.6.3 版本成为正式版本的功能。

2. 基本语法

EXPLAIN [AST | SYNTAX | PLAN | PIPELINE | TABLE OVERRIDE] [setting = value, ...]
    [
      SELECT ... |
      tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [TTL ...]
    ]
    [FORMAT ...]
  • AST: 用于查看语法树;
    • 支持查看所有类型的语句,不光是 select 语句:
    explain ast select number from system.numbers limit 10;
    
  • SYNTAX: 查询优化后的 SQL 语句;
    EXPLAIN SYNTAX SELECT * FROM system.numbers AS a, system.numbers AS b, system.numbers AS c;
    
  • PLAN: 用于查看执行计划,可以指定五个参数;
    • header:打印计划中各个步骤的 header 说明,默认 0(关闭);
    • description:打印计划中各个步骤的描述,默认 1(开启);
    • indexes:显示索引使用情况,默认 0(关闭);
    • actions:打印计划中各个步骤的详细信息,默认 0(关闭);
    • json:以 JSON 格式打印执行计划的详细信息,默认 0(关闭);
    EXPLAIN SELECT sum(number) FROM numbers(10) GROUP BY number % 4;
    EXPLAIN json = 1, description = 0 SELECT 1 UNION ALL SELECT 2 FORMAT TSVRaw;
    
  • PIPELINE: 用于查看 pipeline 计划,可以指定三个参数;
    • header:打印计划中各个步骤的 header 说明,默认 0(关闭);
    • graph:用 DOT 图形语言描述管道图,默认 0(关闭);
    • compact:如果开启了 graph,紧凑打印行,默认 1(开启);
    EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 4;
    

3. 案例实操

3.1 查看PLAN

  简单查询:

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;

在这里插入图片描述

3.2 AST语法树

EXPLAIN AST SELECT number from system.numbers limit 10;

在这里插入图片描述

3.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)

在这里插入图片描述

3.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;

在这里插入图片描述

参考文献

  【1】https://clickhouse.com/docs/zh/
  【2】https://www.bilibili.com/video/BV1Yh411z7os?from=search&seid=4579023877699743987&spm_id_from=333.337.0.0
  【3】https://clickhouse.com/docs/zh/

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大Null

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值