文章目录

  • 一、Explain
    • 1. 功能版本及语法
      • 1.1 版本
      • 1.2 语法
    • 2.Explain Types
      • 2.1 Types
      • 2.2.AST
        • simple query
        • complex query
      • 2.3.SYNTAX
        • 多表联查会优化成 CROSS JOIN
        • 三元运算符优化
      • 2.4.PLAN
        • simple query
        • complex query
        • open all param
      • 2.5.PIPLINE
  • 二、Explain Estimate
  • 三、老版本查看执行计划
    • 执行计划

一、Explain

1. 功能版本及语法

1.1 版本
20.6之后
1.2 语法
EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]

2.Explain Types

2.1 Types
  1. AST — Abstract syntax tree (抽象语法树)

  2. SYNTAX — Query text after AST-level optimizations(在 AST 级优化后查询文本。)

  3. PLAN — Query execution plan(查询执行计划)

  4. PIPLINE — Query execution pipeline(查询执行管道)

2.2.AST
  1. simple query
    EXPLAIN AST SELECT 1;┌─explain───────────────────────────┐
    │ SelectWithUnionQuery (children 1) │
    │  ExpressionList (children 1)      │
    │   SelectQuery (children 1)        │
    │    ExpressionList (children 1)    │
    │     Literal UInt64_1              │
    └───────────────────────────────────┘
    
  2. complex query
    EXPLAIN AST ALTER TABLE t1 DELETE WHERE date = today();┌─explain──────────────────────────┐
    │ AlterQuery  t1 (children 1)      │
    │  ExpressionList (children 1)     │
    │   AlterCommand 32 (children 1)   │
    │    Function equals (children 1)  │
    │     ExpressionList (children 2)  │
    │      Identifier date             │
    │      Function today (children 1) │
    │       ExpressionList             │
    └──────────────────────────────────┘
    
2.3.SYNTAX

返回语法优化后的查询,这个是我们开发过程中经常用到的,可以看下面两个例子

  1. 多表联查会优化成 CROSS JOIN
    EXPLAIN SYNTAX SELECT * FROM system.numbers AS a, system.numbers AS b, system.numbers AS c;┌─explain────────────────────────────┐
    │ SELECT                             │
    │     `--a.number` AS `a.number`,    │
    │     `--b.number` AS `b.number`,    │
    │     number AS `c.number`           │
    │ FROM                               │
    │ (                                  │
    │     SELECT                         │
    │         number AS `--a.number`,    │
    │         b.number AS `--b.number`   │
    │     FROM system.numbers AS a       │
    │     CROSS JOIN system.numbers AS b │
    │ ) AS `--.s`                        │
    │ CROSS JOIN system.numbers AS c     │
    └────────────────────────────────────┘
  2. 三元运算符优化
    #查看优化
    EXPLAIN SYNTAX SELECT number = 1 ? 'ck' : (number = 2 ? 'hbase' : 'hive') FROM numbers(10);┌─explain──────────────────────────────────────────────────────┐
    │ SELECT if(number = 1, 'ck', if(number = 2, 'hbase', 'hive')) │
    │ FROM numbers(10)                                             │
    └──────────────────────────────────────────────────────────────┘#开启三元运算符优化
    SET optimize_if_chain_to_multiif = 1;
    #再次查看优化后效果
    EXPLAIN SYNTAX SELECT number = 1 ? 'ck' : (number = 2 ? 'hbase' : 'hive') FROM numbers(10);┌─explain───────────────────────────────────────────────────────┐
    │ SELECT multiIf(number = 1, 'ck', number = 2, 'hbase', 'hive') │
    │ FROM numbers(10)                                              │
    └───────────────────────────────────────────────────────────────┘可以看到优化后的已经将 多个  `if()`函数替换为 `multiIf()` 函数
2.4.PLAN

查看执行计划,相对hive比较简洁

  1. simple query
    explain plan select arrayJoin([1,2,3,null,null]);┌─explain───────────────────────────────────────────────────────────────────┐
    │ Expression ((Projection + Before ORDER BY))                               │
    │   SettingQuotaAndLimits (Set limits and quota after reading from storage) │
    │     ReadFromStorage (SystemOne)                                           │
    └───────────────────────────────────────────────────────────────────────────┘
  2. complex query
    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─────────────────────────────────────────────────────────────────────────────────────┐
    │ Expression (Projection)                                                                     │
    │   LimitBy                                                                                   │
    │     Expression (Before LIMIT BY)                                                            │
    │       MergingSorted (Merge sorted streams for ORDER BY)                                     │
    │         MergeSorting (Merge sorted blocks for ORDER BY)                                     │
    │           PartialSorting (Sort each block for ORDER BY)                                     │
    │             Expression (Before ORDER BY)                                                    │
    │               Aggregating                                                                   │
    │                 Expression (Before GROUP BY)                                                │
    │                   Filter (WHERE)                                                            │
    │                     SettingQuotaAndLimits (Set limits and quota after reading from storage) │
    │                       ReadFromStorage (SystemParts)                                         │
    └─────────────────────────────────────────────────────────────────────────────────────────────┘
    

    大体的一个执行路线
    limit -> merge sort (order by 归并排序) -> agg(count() 聚合) -> filter(where 过滤 )

    ​ 另外, explain 默认就是explain plain

  3. open all param

    打开其他参数

    EXPLAIN header=1, actions=1,description=1 SELECT number from system.numbers limit 10;┌─explain───────────────────────────────────────────────────────────────────┐
    │ Expression ((Projection + Before ORDER BY))                               │
    │ Header: number UInt64                                                     │
    │ Actions: INPUT :: 0 -> number UInt64 : 0                                  │
    │ Positions: 0                                                              │
    │   SettingQuotaAndLimits (Set limits and quota after reading from storage) │
    │   Header: number UInt64                                                   │
    │     Limit (preliminary LIMIT (without OFFSET))                            │
    │     Header: number UInt64                                                 │
    │     Limit 10                                                              │
    │     Offset 0                                                              │
    │       ReadFromStorage (SystemNumbers)                                     │
    │       Header: number UInt64                                               │
    └───────────────────────────────────────────────────────────────────────────┘
2.5.PIPLINE

查看执行管道

  1. 不带参数

    EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(10000) GROUP BY number % 20;┌─explain───────────────────────┐
    │ (Expression)                  │
    │ ExpressionTransform           │
    │   (Aggregating)               │
    │   AggregatingTransform        │
    │     (Expression)              │
    │     ExpressionTransform       │
    │       (SettingQuotaAndLimits) │
    │         (ReadFromStorage)     │
    │         Limit                 │
    │           Numbers 0 → 1       │
    └───────────────────────────────┘
    
  2. 其他参数

    EXPLAIN PIPELINE header=1,graph=1 SELECT sum(number) FROM numbers_mt(10000) GROUP BY number%20;┌─explain─────────────────────────────────────┐
    │ digraph                                     │
    │ {                                           │
    │   rankdir="LR";                             │
    │   { node [shape = rect]                     │
    │         n2 [label="Limit"];                 │
    │         n1 [label="Numbers"];               │
    │     subgraph cluster_0 {                    │
    │       label ="Aggregating";                 │
    │       style=filled;                         │
    │       color=lightgrey;                      │
    │       node [style=filled,color=white];      │
    │       { rank = same;                        │
    │         n4 [label="AggregatingTransform"];  │
    │       }                                     │
    │     }                                       │
    │     subgraph cluster_1 {                    │
    │       label ="Expression";                  │
    │       style=filled;                         │
    │       color=lightgrey;                      │
    │       node [style=filled,color=white];      │
    │       { rank = same;                        │
    │         n3 [label="ExpressionTransform"];   │
    │       }                                     │
    │     }                                       │
    │     subgraph cluster_2 {                    │
    │       label ="Expression";                  │
    │       style=filled;                         │
    │       color=lightgrey;                      │
    │       node [style=filled,color=white];      │
    │       { rank = same;                        │
    │         n5 [label="ExpressionTransform"];   │
    │       }                                     │
    │     }                                       │
    │   }                                         │
    │   n2 -> n3 [label="                         │
    │ number UInt64 UInt64(size = 0)"];           │
    │   n1 -> n2 [label="                         │
    │ number UInt64 UInt64(size = 0)"];           │
    │   n4 -> n5 [label="                         │
    │ modulo(number, 20) UInt8 UInt8(size = 0)    │
    │ sum(number) UInt64 UInt64(size = 0)"];      │
    │   n3 -> n4 [label="                         │
    │ number UInt64 UInt64(size = 0)              │
    │ modulo(number, 20) UInt8 UInt8(size = 0)"]; │
    │ }                                           │
    └─────────────────────────────────────────────┘

二、Explain Estimate

显示在处理查询时要从表中读取的估计行数标记数和部分数适用于MergeTree family.

  1. 创建表

    CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0;
    INSERT INTO ttt SELECT number FROM numbers(128);
    OPTIMIZE TABLE ttt;
    
  2. 查询

    EXPLAIN ESTIMATE SELECT * FROM ttt;
    
  3. 结果

    ┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐
    │ default  │ ttt   │     1 │  128 │     8 │
    └──────────┴───────┴───────┴──────┴───────┘
    

三、老版本查看执行计划

  1. 执行计划

    clickhouse-client -h 主机名 --send_logs_level=trace <<< "sql" > /dev/null
    

    send_logs_level 设置日志等级,<<<将SQL语句重定向至clickhouse-client进行查询,> /dev/null将查询结果重定向到空设备吞掉,以便观察日志

    另外,日志级别除了trace可以,也可以为debug;此外,这种方式只能是在日志中查看,并且只能在SQL语句真正执行的时候,如果线上数据量比较大,建议添加 limit

Clickhouse Explain相关推荐

  1. ClickHouse 使用EXPLAIN 分析 SQL 执行计划

    1.1. 使用 EXPLAIN 分析 SQL 执行计划 本节介绍如何使用EXPLAIN命令分析SQL语句的执行计划. 1.1.1. EXPLAIN概述 执行计划是进行SQL查询调优的重要参考.在Cli ...

  2. 【ClickHouse SQL 极简教程】使用EXPLAIN 分析 SQL 执行计划

    1.1. 使用 EXPLAIN 分析 SQL 执行计划 本节介绍如何使用EXPLAIN命令分析SQL语句的执行计划. 1.1.1. EXPLAIN概述 执行计划是进行SQL查询调优的重要参考.在Cli ...

  3. 最近很火的 ClickHouse 是什么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 这里有个[1024]红包等你来领取 ClickHouse ...

  4. Clickhouse 在腾讯的应用实践

    今天给大家介绍 Clickhouse 在腾讯的应用实践, 主要分为两部分内容: Clickhouse 的部署和管理 Clickhouse 在腾讯业务线的应用实践 Clickhouse  的部署和管理 ...

  5. 【clickhouse】clickhouse 副本与分片 分片详解

    1.概述 转载:[clickhouse]clickhouse 副本与分片 分片详解 clickhouse 中每个服务器节点都可以被称为一个 shard(分片). 假设有 N 台服务器,每个服务器上都有 ...

  6. 【clickhouse】clickhouse强大智能的 Projection (投影) 功能

    1.概述 转载:ClickHouse王炸功能来袭,性能轻松提升40倍 各位,今年 ClickHouse 最王炸的功能来啦,没错,就是期待已久的 Projection (投影) 功能.ClickHous ...

  7. clickhouse初学以及利用ck实现BI系统的增量更新

    文章目录 概述 适用场景 库引擎(部分) 1.Atomic 2.Lazy 3.Mysql.SQLite.PostergreSQL等一系列 数据类型(部分) 表引擎-合并树系列 ReplacingMer ...

  8. clickhouse 在货拉拉的应用实践,千亿级别数据实现秒级查询

    作者:扬大平仔 前携程.网易高级工程师,现为货拉拉高级工程师.热爱技术,敢于将新技术用于项目实践. 前言 为了解决线上问题定位慢,相应不及时等问题.所以我们决定开发一套智能问题定位系统.对于我们的一些 ...

  9. 如何合理使用ClickHouse分区表

    当我们处理连续数据并需要基于移动窗口(如,仅使用过去三个月数据)计算时使用分区功能非常有用,因为分区无需删除数据,就能高效避过不使用的(或过期)数据.本文介绍分区表原理,对比查询.插入性能,了解分区的 ...

最新文章

  1. 2022-2028年中国房地产金融行业投资分析及前景预测报告
  2. java ADT生成带签名的apk
  3. Xorequ(BZOJ3329+数位DP+斐波那契数列)
  4. VirtualBox安装及Linux基本操作(操作系统实验一)
  5. python中xlrd.open_workbook_python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题...
  6. 大数据之-hadoop知识体系架构---大数据之hadoop工作笔记0001
  7. 【毕业答辩】毕业论文答辩有技巧!
  8. 微型计算机在硬件上是由,208可打印本资料微机原理与汇编期末考试试卷A卷答案...
  9. Excel:VBA编程入门(一)
  10. fd抓包数据类型_终端抓包神器 | tcpdump参数解析及使用
  11. Python之判断闰年
  12. 蓝桥杯 Java 自行车停放(双向链表解法)
  13. 快速上手Flask(一) 认识框架Flask、项目结构、开发环境
  14. Button 英文大写问题
  15. 大数据 搜索 ES 一
  16. Java编写的教室管理系统 带详细设计报告 功能非常齐全 完整源码
  17. 总投资2185.38亿元,澜沧江水电站传来好消息
  18. flash as3使用,播放声音和加载外部声音文件
  19. matlab阻尼震动论文,基于MATLAB的平方阻尼振动研究
  20. 技嘉Z68升级UEFI BIOS后要注意的事项

热门文章

  1. 一文简述用php实现爬虫(下载英雄联盟所有英雄图片)
  2. bzoj 4451: [Cerc2015]Frightful Formula 数学+排列组合
  3. 配音学霸都在用的配音练习技巧,配音七大技巧
  4. 【圣诞树demo】html+css+js+svg实现圣诞树
  5. 服装ERP——企业资源方案
  6. 【记录】如何备份Google浏览器的历史记录?
  7. IBM Lenovo ServerGuide download
  8. android方法注释,android 注解的使用
  9. 安装WPS后office出现报错的情况
  10. mysql刷盘命令_MySQL延迟问题和数据刷盘