ClickHouse查看执行计划(EXPLAIN语法)

1.EXPLAIN 语法示例

EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting = value, ...]

SELECT ... \| tableFunction(...) \[COLUMNS (...)\] \[ORDER BY ...\] \[PARTITION BY ...\] \[PRIMARY KEY\] \[SAMPLE BY ...\] \[TTL ...

]

FORMAT ...

查询计划的类型说明:

AST(抽象语法树):在AST级别优化之后的查询文本

SYNTAX(语法优化):在AST级别优化之后的查询文本,返回优化后的sql

QUERY TREE(查询树):在查询树级别优化之后的查询树

PLAN(执行计划):查询执行计划,默认是此值

PIPELINE(管道):查询执行管道

1.1AST(抽象语法树)

查询语法树执行计划

explain AST SELECT
path,code,v1
FROM
autorun_t_index
WHERE
index_id = 1227
AND cluster_id =27
AND code IN('queue_name', 'queue_allocatedmb', 'queue_availablemb','queue_allocatedvcores','queue_availablevcores')
AND update_date IN(SELECT MAX(update_date) FROM autorun_t_index WHERE index_id = 1227 AND cluster_id = 27 and update_date <='2023-08-04 01:38:48')

展示结果:

SelectQuery (children 3)
ExpressionList (children 3)
Identifier path
Identifier code
Identifier v1
TablesInSelectQuery (children 1)
TablesInSelectQueryElement (children 1)
TableExpression (children 1)
TableIdentifier autorun_t_index
Function and (children 1)
ExpressionList (children 4)
Function equals (children 1)
ExpressionList (children 2)
Identifier index_id
Literal UInt64_1227
Function equals (children 1)
ExpressionList (children 2)
Identifier cluster_id
Literal UInt64_27
Function in (children 1)
ExpressionList (children 2)
Identifier code
Literal Tuple_('queue_name', 'queue_allocatedmb', 'queue_availablemb', 'queue_allocatedvcores', 'queue_availablevcores')
Function in (children 1)
ExpressionList (children 2)
Identifier update_date
Subquery (children 1)
SelectWithUnionQuery (children 1)
ExpressionList (children 1)
SelectQuery (children 3)
ExpressionList (children 1)
Function MAX (children 1)
ExpressionList (children 1)
Identifier update_date
TablesInSelectQuery (children 1)
TablesInSelectQueryElement (children 1)
TableExpression (children 1)
TableIdentifier autorun_t_index
Function and (children 1)
ExpressionList (children 3)
Function equals (children 1)
ExpressionList (children 2)
Identifier index_id
Literal UInt64_1227
Function equals (children 1)
ExpressionList (children 2)
Identifier cluster_id
Literal UInt64_27
Function lessOrEquals (children 1)
ExpressionList (children 2)
Identifier update_date
Literal '2023-08-04 01:38:48'
Identifier TabSeparatedWithNamesAndTypes

1.2SYNTAX(语法优化)

语法优化前执行sql

explain SYNTAX SELECT
path,code,v1
FROM
autorun_t_index
WHERE
index_id = 1227
AND cluster_id =27
AND code IN('queue_name', 'queue_allocatedmb', 'queue_availablemb','queue_allocatedvcores','queue_availablevcores')
AND update_date IN(SELECT MAX(update_date) FROM autorun_t_index WHERE index_id = 1227 AND cluster_id = 27 and update_date <='2023-08-04 01:38:48')

语法优化后推荐的sql

SELECT
path,
code,
v1
FROM autorun_t_index
WHERE (index_id = 1227) AND (cluster_id = 27) AND (code IN ('queue_name', 'queue_allocatedmb', 'queue_availablemb', 'queue_allocatedvcores', 'queue_availablevcores')) AND (update_date IN ((
SELECT max(update_date)
FROM autorun_t_index
WHERE (index_id = 1227) AND (cluster_id = 27) AND (update_date <= '2023-08-04 01:38:48')
) AS _subquery132))

1.3QUERY TREE(查询树)

1.4PLAN(执行计划)

默认值就是PLAN,一般用来查看sql的执行计划,是否使用引擎,分区,索引等信息

未添加索引前

explain PLAN SELECT
path,code,v1
FROM
autorun_t_index
WHERE
index_id = 1227
AND cluster_id =27
AND code IN('queue_name', 'queue_allocatedmb', 'queue_availablemb','queue_allocatedvcores','queue_availablevcores')
AND update_date IN(SELECT MAX(update_date) FROM autorun_t_index WHERE index_id = 1227 AND cluster_id = 27 and update_date <='2023-08-04 01:38:48')

未添加索引查询计划

Expression (Projection)
CreatingSets (Create sets before main query execution)
Expression (Before ORDER BY)
Filter (WHERE)
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromStorage (Log)
CreatingSet (Create set for subquery)
Expression ((Projection + Before ORDER BY))
Aggregating
Expression (Before GROUP BY)
Filter (WHERE)
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromStorage (Log)

添加引擎,分区后优化结果

Expression ((Projection + Before ORDER BY))
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromMergeTree

1.5PIPELINE(管道)

官网示例

EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 4;

执行结果:

(Expression)
ExpressionTransform
(Aggregating)
Resize 4 → 1
AggregatingTransform × 4
(Expression)
ExpressionTransform × 4
(SettingQuotaAndLimits)
(ReadFromStorage)
NumbersMt × 4 0 → 1

相关推荐
qq19257230273 分钟前
商品库存管理系统(MYSQL)
数据库·mysql
什么都不会的Tristan21 分钟前
Feed流(关注推送)
java·前端·数据库
wu_jing_sheng021 分钟前
黑龙江省保险补贴Shapefile转换工具:GIS数据处理自动化实践
大数据·数据库·人工智能
GrowingYi43 分钟前
分布式数据库事务实现
数据库·分布式·database
托尼吴1 小时前
milvus 向量数据库学习笔记-基础认识
数据库·学习·milvus
徐同保1 小时前
使用n8n中的HTTP Request节点清空pinecones向量数据库
数据库·网络协议·http
小北方城市网1 小时前
第 9 课:Python 全栈项目性能优化实战|从「能用」到「好用」(企业级优化方案|零基础落地)
开发语言·数据库·人工智能·python·性能优化·数据库架构
ChineHe1 小时前
Redis入门篇001_Redis简介与特性
数据库·redis·缓存
仓颉也为难1 小时前
全表扫和索引在哪种场景哪个效率高、基线分水岭在哪
数据库
Anthony_2311 小时前
MySql常用SQL命令
服务器·数据库·sql·mysql·http·oracle·udp