Clickhouse Explain
文章目录
- 一、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
AST — Abstract syntax tree (抽象语法树)
SYNTAX — Query text after AST-level optimizations(在 AST 级优化后查询文本。)
PLAN — Query execution plan(查询执行计划)
PIPLINE — Query execution pipeline(查询执行管道)
2.2.AST
simple query
EXPLAIN AST SELECT 1;┌─explain───────────────────────────┐ │ SelectWithUnionQuery (children 1) │ │ ExpressionList (children 1) │ │ SelectQuery (children 1) │ │ ExpressionList (children 1) │ │ Literal UInt64_1 │ └───────────────────────────────────┘
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
返回语法优化后的查询,这个是我们开发过程中经常用到的,可以看下面两个例子
多表联查会优化成 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 │ └────────────────────────────────────┘
三元运算符优化
#查看优化 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比较简洁
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) │ └───────────────────────────────────────────────────────────────────────────┘
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
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
查看执行管道
不带参数
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 │ └───────────────────────────────┘
其他参数
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.
创建表
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;
查询
EXPLAIN ESTIMATE SELECT * FROM ttt;
结果
┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐ │ default │ ttt │ 1 │ 128 │ 8 │ └──────────┴───────┴───────┴──────┴───────┘
三、老版本查看执行计划
执行计划
clickhouse-client -h 主机名 --send_logs_level=trace <<< "sql" > /dev/null
send_logs_level 设置日志等级,<<<将SQL语句重定向至clickhouse-client进行查询,> /dev/null将查询结果重定向到空设备吞掉,以便观察日志
另外,日志级别除了trace可以,也可以为debug;此外,这种方式只能是在日志中查看,并且只能在SQL语句真正执行的时候,如果线上数据量比较大,建议添加 limit
Clickhouse Explain相关推荐
- ClickHouse 使用EXPLAIN 分析 SQL 执行计划
1.1. 使用 EXPLAIN 分析 SQL 执行计划 本节介绍如何使用EXPLAIN命令分析SQL语句的执行计划. 1.1.1. EXPLAIN概述 执行计划是进行SQL查询调优的重要参考.在Cli ...
- 【ClickHouse SQL 极简教程】使用EXPLAIN 分析 SQL 执行计划
1.1. 使用 EXPLAIN 分析 SQL 执行计划 本节介绍如何使用EXPLAIN命令分析SQL语句的执行计划. 1.1.1. EXPLAIN概述 执行计划是进行SQL查询调优的重要参考.在Cli ...
- 最近很火的 ClickHouse 是什么?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 这里有个[1024]红包等你来领取 ClickHouse ...
- Clickhouse 在腾讯的应用实践
今天给大家介绍 Clickhouse 在腾讯的应用实践, 主要分为两部分内容: Clickhouse 的部署和管理 Clickhouse 在腾讯业务线的应用实践 Clickhouse 的部署和管理 ...
- 【clickhouse】clickhouse 副本与分片 分片详解
1.概述 转载:[clickhouse]clickhouse 副本与分片 分片详解 clickhouse 中每个服务器节点都可以被称为一个 shard(分片). 假设有 N 台服务器,每个服务器上都有 ...
- 【clickhouse】clickhouse强大智能的 Projection (投影) 功能
1.概述 转载:ClickHouse王炸功能来袭,性能轻松提升40倍 各位,今年 ClickHouse 最王炸的功能来啦,没错,就是期待已久的 Projection (投影) 功能.ClickHous ...
- clickhouse初学以及利用ck实现BI系统的增量更新
文章目录 概述 适用场景 库引擎(部分) 1.Atomic 2.Lazy 3.Mysql.SQLite.PostergreSQL等一系列 数据类型(部分) 表引擎-合并树系列 ReplacingMer ...
- clickhouse 在货拉拉的应用实践,千亿级别数据实现秒级查询
作者:扬大平仔 前携程.网易高级工程师,现为货拉拉高级工程师.热爱技术,敢于将新技术用于项目实践. 前言 为了解决线上问题定位慢,相应不及时等问题.所以我们决定开发一套智能问题定位系统.对于我们的一些 ...
- 如何合理使用ClickHouse分区表
当我们处理连续数据并需要基于移动窗口(如,仅使用过去三个月数据)计算时使用分区功能非常有用,因为分区无需删除数据,就能高效避过不使用的(或过期)数据.本文介绍分区表原理,对比查询.插入性能,了解分区的 ...
最新文章
- 2022-2028年中国房地产金融行业投资分析及前景预测报告
- java ADT生成带签名的apk
- Xorequ(BZOJ3329+数位DP+斐波那契数列)
- VirtualBox安装及Linux基本操作(操作系统实验一)
- python中xlrd.open_workbook_python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题...
- 大数据之-hadoop知识体系架构---大数据之hadoop工作笔记0001
- 【毕业答辩】毕业论文答辩有技巧!
- 微型计算机在硬件上是由,208可打印本资料微机原理与汇编期末考试试卷A卷答案...
- Excel:VBA编程入门(一)
- fd抓包数据类型_终端抓包神器 | tcpdump参数解析及使用
- Python之判断闰年
- 蓝桥杯 Java 自行车停放(双向链表解法)
- 快速上手Flask(一) 认识框架Flask、项目结构、开发环境
- Button 英文大写问题
- 大数据 搜索 ES 一
- Java编写的教室管理系统 带详细设计报告 功能非常齐全 完整源码
- 总投资2185.38亿元,澜沧江水电站传来好消息
- flash as3使用,播放声音和加载外部声音文件
- matlab阻尼震动论文,基于MATLAB的平方阻尼振动研究
- 技嘉Z68升级UEFI BIOS后要注意的事项
热门文章
- 一文简述用php实现爬虫(下载英雄联盟所有英雄图片)
- bzoj 4451: [Cerc2015]Frightful Formula 数学+排列组合
- 配音学霸都在用的配音练习技巧,配音七大技巧
- 【圣诞树demo】html+css+js+svg实现圣诞树
- 服装ERP——企业资源方案
- 【记录】如何备份Google浏览器的历史记录?
- IBM Lenovo ServerGuide download
- android方法注释,android 注解的使用
- 安装WPS后office出现报错的情况
- mysql刷盘命令_MySQL延迟问题和数据刷盘