ClickHouse之Explain查看执行计划

news2024/11/18 23:46:19

文章目录

  • 前言
  • 基本语法
  • EXPLAIN 类型
    • EXPLAIN PLAN
    • EXPLAIN AST
    • EXPLAIN SYNTAX
    • EXPLAIN PIPELINE
    • EXPLAIN ESTIMATE
  • 补充
  • 忠告

前言

在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能 可以看到,并且只能真正执行 sql,在执行日志里面查看。在 20.6 版本引入了原生的执行计 划的语法。在 20.6.3 版本成为正式版本的功能。

基本语法

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 ...]

示例:

explain select * from td_xplatform.stats_sd_campaign where profileId = 113434409578602 and date between '20220101' and '20220101';
-- 结果
Expression ((Projection + Before ORDER BY))
  ReadFromMergeTree (td_xplatform_local.stats_sd_campaign)

注意:ClickHouse官网也并没有过多讲解执行计划具体详细的解释,通过对sql执行的步骤分析出ClickHouse的执行计划是从底部往上逐一执行。

EXPLAIN 类型

  • PLAN:用于查看执行计划,默认值。
  • AST:用于查看语法树;
  • SYNTAX:用于优化语法,有时我们指定的查询语句未必是最优的,那么 ClickHouse 在底层会进行优化,EXPLAIN SYNTAX 可以返回对一条 SQL 语句进行优化后的结果。通过对比优化前和优化后的 SQL 语句,可以有助于我们理解 ClickHouse 的优化机制
  • PIPELINE:用于查看 PIPELINE 计划。
  • ESTIMATE:显示处理查询时要从表中读取的估计行数、标记数和部分数

注意:
explain默认值PLAN的结果不是那么的通俗易懂,可以使用setting进行查看详细的执行计划,判断sql是否合理化。

EXPLAIN PLAN

用于查看执行计划,默认值。以下是setting的key:

  • header:打印计划中各个步骤的 head 说明,默认关闭,默认值 0;
  • description:打印计划中各个步骤的描述,默认开启,默认值 1;
  • actions:打印计划中各个步骤的详细信息,默认关闭,默认值0。
  • json:以JSON格式将查询计划步骤打印为一行。默认:0
  • indexes:显示使用的索引、过滤部分的数量以及应用的每个索引的过滤颗粒数。默认值:0。支持MergeTree表。
    • **NameSkip :**索引名称(目前仅用于索引)。
    • **Keys :**索引使用的列数组。
    • Condition:使用情况。
    • DescriptionSkip:索引描述(目前仅用于索引)。
    • Parts:应用索引之前/之后的部分数。
    • Granules:应用索引之前/之后的颗粒数。

示例如下:

explain actions=1
select id,sum(totalCost) Spend
from xplatform_sd.sd_campaign ca
join td_xplatform.stats_sd_campaign report on ca.amazon_campaign_id = report.campaignId
where profileId = 113434409578602
group by id
order by Spend desc ;

-- 执行计划
Expression (Projection)
Actions: INPUT :: 0 -> id Int32 : 0
         INPUT : 1 -> sum(totalCost) Nullable(Decimal(38, 2)) : 1
         ALIAS sum(totalCost) :: 1 -> Spend Nullable(Decimal(38, 2)) : 2
Positions: 0 2
  Sorting (Sorting for ORDER BY)
  Sort description: sum(totalCost) DESC
    Expression (Before ORDER BY)
    Actions: INPUT :: 0 -> id Int32 : 0
             INPUT :: 1 -> sum(totalCost) Nullable(Decimal(38, 2)) : 1
    Positions: 0 1
      Aggregating
      Keys: id
      Aggregates:
          sum(totalCost)
            Function: sum(Nullable(Decimal(9, 2))) → Nullable(Decimal(38, 2))
            Arguments: totalCost
            Argument positions: 1
        Expression (Before GROUP BY)
        Actions: INPUT :: 0 -> id Int32 : 0
                 INPUT :: 1 -> totalCost Nullable(Decimal(9, 2)) : 1
        Positions: 0 1
          Filter (WHERE)
          Filter column: equals(profileId, 113434409578602) (removed)
          Actions: INPUT :: 0 -> id Int32 : 0
                   INPUT : 1 -> profileId Int64 : 1
                   INPUT :: 2 -> totalCost Nullable(Decimal(9, 2)) : 2
                   COLUMN Const(UInt64) -> 113434409578602_8 UInt64 : 3
                   FUNCTION equals(profileId :: 1, 113434409578602_8 :: 3) -> equals(profileId, 113434409578602) UInt8 : 4
          Positions: 0 2 4
            Join (JOIN)
              Expression (Before JOIN)
              Actions: INPUT :: 0 -> id Int32 : 0
                       INPUT :: 1 -> amazon_campaign_id Nullable(Int64) : 1
                       INPUT : 2 -> profile_id Nullable(Int64) : 2
                       COLUMN Const(UInt64) -> 113434409578602 UInt64 : 3
                       FUNCTION equals(profile_id :: 2, 113434409578602 :: 3) -> equals(profile_id, 113434409578602) Nullable(UInt8) : 4
              Positions: 0 1 4
                SettingQuotaAndLimits (Set limits and quota after reading from storage)
                  ReadFromStorage (MySQL)
              Expression ((Joined actions + Rename joined columns))
              Actions: INPUT : 0 -> profileId Int64 : 0
                       INPUT : 1 -> campaignId Int64 : 1
                       INPUT : 2 -> totalCost Nullable(Decimal(9, 2)) : 2
                       ALIAS profileId :: 0 -> profileId Int64 : 3
                       ALIAS campaignId :: 1 -> campaignId Int64 : 0
                       ALIAS totalCost :: 2 -> totalCost Nullable(Decimal(9, 2)) : 1
              Positions: 0 3 1
                SettingQuotaAndLimits (Set limits and quota after reading from storage)
                  Expression ((Projection + Before ORDER BY))
                  Actions: INPUT :: 0 -> profileId Int64 : 0
                           INPUT :: 1 -> campaignId Int64 : 1
                           INPUT :: 2 -> totalCost Nullable(Decimal(9, 2)) : 2
                  Positions: 0 1 2
                    SettingQuotaAndLimits (Set limits and quota after reading from storage)
                      ReadFromMergeTree
                      ReadType: Default
                      Parts: 843
                      Granules: 936

简单解释一下特殊的名词:

  • SettingQuotaAndLimits: Set limits and quota after reading from storage(从存储读取后设置限制和配额)
  • Positions:当前执行计划的位置
  • ReadFromMergeTree:从MergeTree读取数据
  • ReadFromStorage:从存储读取数据
  • Filter (WHERE):是 WHERE 或 HAVING 的实现。拦截过滤数据
  • Sorting (Sorting for ORDER BY):排序
  • Expression:计算列上的函数,例如 x, y -> x + 1, y * 2。使用 explain actions = 1 select … 查看更多详细信息
  • Aggregating:负责 GROUP BY。

EXPLAIN AST

查看查询的抽象语法树(AST)。支持所有类型的查询,而不仅仅是 SELECT。

示例如下:

EXPLAIN AST ALTER TABLE t1 DELETE WHERE date = today();
--执行计划
AlterQuery  t1 (children 1)
   ExpressionList (children 1)
    AlterCommand 27 (children 1)
     Function equals (children 1)
      ExpressionList (children 2)
       Identifier date
       Function today (children 1)
        ExpressionList

EXPLAIN SYNTAX

在语法优化后返回查询。

可以使用此语法进行判断sql是否是当前查询方式的最佳性能,可以查看一些sql是会进行谓词下推

示例如下:

explain syntax
select target.expression,
       sum(totalCost) Spend
from (select targetId, totalCost,date from td_xplatform.stats_sd_target where  profileId = 113434409578602) report
left join (select amazon_target_id,expression from xplatform_sd.sd_product_ad_target where profile_id = 113434409578602) target on report.targetId = target.amazon_target_id
where date between '20220101' and '20220202'
group by target.expression
order by Spend;
-- 执行计划如下
SELECT
    expression,
    sum(totalCost) AS Spend
FROM
(
    SELECT
        targetId,
        totalCost,
        date
    FROM td_xplatform.stats_sd_target
    WHERE (profileId = 113434409578602) AND ((date <= '20220202') AND (date >= '20220101'))
) AS report
ALL LEFT JOIN
(
    SELECT
        amazon_target_id,
        expression
    FROM xplatform_sd.sd_product_ad_target
    WHERE profile_id = 113434409578602
) AS target ON targetId = amazon_target_id
WHERE (date >= '20220101') AND (date <= '20220202')
GROUP BY expression
ORDER BY Spend ASC

EXPLAIN PIPELINE

  • header: 打印计划中各个步骤的 head 说明,默认关闭;
  • graph: 用DOT图形语言描述管道图,默认关闭,需要查看相关的图形需要配合graphviz 查看;
  • compact:如果开启了 graph,紧凑打印行开关。1:开启(默认值),0:关闭;

示例如下:

explain pipeline 
select sum(totalCost) 
from td_xplatform.stats_sd_campaign 
where profileId = 113434409578602
group by campaignId;
-- 结果如下
(SettingQuotaAndLimits)
  (Expression)
  ExpressionTransform
    (Aggregating)
    Resize 41
      AggregatingTransform × 4
        StrictResize 44
          (Expression)
          ExpressionTransform × 4
            (SettingQuotaAndLimits)
              (ReadFromMergeTree)
              MergeTreeThread × 4 01

简单解释一下特殊的名词:

  • SettingQuotaAndLimits: Set limits and quota after reading from storage(从存储读取后设置限制和配额)
  • AggregatingTransform x 4:4次聚合转换,是 Group By 高性能的核心所在。原因是因为ClickHouse是一个很耗cpu的数据库,会在不同的线程上进行统计计算,有多少线程取决于ClickHouse服务器多少核,多少线程。
  • ReadFromMergeTree:从MergeTree读取数据到内存中

EXPLAIN ESTIMATE

显示处理查询时要从表中读取的估计行数、标记数和部分数。使用MergeTree系列中的表。

示例如下:

explain estimate select sum(totalCost) from td_xplatform.stats_sd_target where profileId = 113434409578602 and date between '20220101' and '20220202';

ClickHouse之Explain查看执行计划 - Java技术债务

补充

  • CreatingSets 为 IN(子查询)或哈希连接(在此查询中)填充哈希表。
  • ReadFromPreparedSource 实际上是从远程表中读取。
  • Union 是 UNION 的一个实现,或者只是来自多个来源
  • MergingAggregated 也是 GROUP BY 的一部分,它将来自不同来源(这里是远程和本地)的聚合函数状态合并在一起。

忠告

  • 尽量将查询条件靠近表
  • 尽量避免join,使用in代替join
  • 如果join的话,尽量join子查询,必须带上primary key
  • 右表尽可能的小

--------------------------------------------------------------欢迎叨扰此地址---------------------------------------------------------------

本文作者:Java技术债务
原文链接:https://cuizb.top/myblog/article/detail/1683518225
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快商通联合创始人李稀敏入选“科技专家库专家名单”

3月10&#xff0c;厦门市科学技术局关于2023年第一批拟入选科技专家库专家名单进行公示。经过层层审核&#xff0c;快商通联合创始人李稀敏入选“科技专家库专家名单”。 据了解&#xff0c;厦门市科学技术局的“科技专家库专家名单”是由市科技局精心挑选的一批优秀专家&…

Unsupervised Domain Adaption (UDA)及domain shift介绍

UDA UDA想解决的问题是目标域上数据标签的缺乏&#xff0c;具体而言&#xff0c;存在着源域和目标域&#xff0c;源域上存在大量的标注样本对 D s { ( X i , y i ) } D_s\{(X_i,y_i)\} Ds​{(Xi​,yi​)}&#xff0c;我们可以在上面以有监督的方式训练各种模型&#xff0c;但此…

常见舆情监测系统的分类和特点

随着网络和社交媒体的发展&#xff0c;舆情监测系统逐渐成为企业和政府机构必备的工具之一。舆情监测系统可以帮助企业和政府机构全面了解公众对其品牌、产品、政策等的反应和态度&#xff0c;及时发现和解决问题&#xff0c;提高公信力和形象。本文将介绍常见的舆情监测系统的…

Python Tox

tox其核心作用是支持创建隔离的 Python 环境&#xff0c;在里面可以安装不同版本的 Python 解释器与各种依赖库&#xff0c;以此方便开发者做自动化测试、打包、持续集成等事情。 简单来说&#xff0c;tox 是一个管理测试虚拟环境的命令行工具。 我介绍一种应用场景&#xff…

如何在Jetpack Compose中设置渐变背景

如何在Jetpack Compose中设置渐变背景 只需几步即可通过平滑渐变增强应用程序的用户界面 虽然它经常出现在网络前端的世界中&#xff0c;但渐变背景可以为您的移动应用程序增添专业和美观的触感&#xff0c;使其对您的用户更具吸引力。 第 1 步&#xff1a;创建渐变画笔 为…

Semantic Segmentation using Adversarial Networks

首次将GAN用于语义分割&#xff0c;用于辨别分割图是来自GT还是来自分割网络。作者的想法来自借助GAN可以检测和矫正GT和模型分割图的高阶不一致。最后在Standford和PASCAL VOC 数据集上验证了想法。 对抗学习&#xff1a; 使用两个权重和的混合损失函数进行优化&#xff0c;第…

从win7升级到win10过程中遇到的问题:安装工具无法运行、卸载VMware

目录 1. 概述2. 微软官方安装工具无法运行3. 控制面板的卸载程序里面找不到VMware4. 输入产品密钥5. 安装完后仍然未激活6. 雨林木风 1. 概述 因为新电脑还没有到&#xff0c;把上学时候的笔记本翻出来顶一顶。旧笔记本还是win7&#xff0c;我的鼠标没办法使用&#xff0c;干脆…

HDCTF web复现

[HDCTF 2023]SearchMaster 传data 使用{if}标签闭合达到命令执行的效果 {if phpinfo()}{/if} NSSCTF{f578f8ba-246e-452b-b070-22bc4fc4313d} Smarty模板注入&CVE-2017-1000480 - 先知社区 (aliyun.com) [HDCTF 2023]YamiYami 非预期解 第一个连接 跳转到百度&#xf…

远程访问(内网穿透)

文章目录 介绍cpolar安装使用终端访问远程桌面访问 仅靠ssh&#xff0c;等只能实现同局域网下的服务器访问&#xff0c;本文介绍使用cpolar内网穿透工具实现非同局域网下的访问 介绍 远程&#xff1a;1804 ubuntu 软件依赖&#xff1a;ssh&#xff0c;xrdp&#xff0c; cpolar…

【K8s】资源管理与实战入门

文章目录 一、资源管理1、资源管理介绍2、YAML语言语法3、资源管理方式4、命令式对象管理--kubectl5、命令式对象配置6、声明式对象配置7、报错 二、实战入门1、namespace2、Pod3、Label4、deployment5、Service 一、资源管理 1、资源管理介绍 在kubernetes中&#xff0c;所有…

如何有效的向 AI 提问 ?

文章目录 〇、导言一、Base LLM 与 Instruction Tuned LLM二、如何提出有效的问题 &#xff1f;1. 明确问题&#xff1a;2. 简明扼要&#xff1a;3. 避免二义性&#xff1a;4. 避免绝对化的问题&#xff1a;5. 利用引导词&#xff1a;6. 检查语法和拼写&#xff1a;7. 追问细节…

7天获邀请函|环境科学研究学者持加拿大麦吉尔大学Offer申报CSC

I老师要求2周内获得邀请函且指定加拿大。我们只用了7天时间就获得加拿大排名榜首的麦吉尔大学邀请函&#xff0c;整整提前了一半时间&#xff0c;效率奇高。 I老师背景&#xff1a; 申请类型&#xff1a;CSC访问学者 工作背景&#xff1a;某研究所研究人员 教育背景&#xf…

g++编译静态库与动态库

该文目的是基本理清一个在linux在c静态库与动态库的编译和使用 一个非常基础的一节&#xff0c;简单的整合了一下目前已有的文章 前提准备&#xff1a; 文件: touch SoDemoTest.h one.cpp two.cpp three.cpp main.cpp代码 /* SoDemoTest.h */ #ifndef _SO_DEMO_TEST_HEADE…

【Ubuntu22.04】内网部署Ubuntu Server 22.04.2

镜像下载 方式一&#xff1a;官网下载 https://ubuntu.com/download/server 方式二&#xff1a;清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.2/ 方式三&#xff1a;百度网盘 链接: https://pan.baidu.com/s/1g24PDfAiPVsxMm7DVpERdg?pwd1020 …

myql的三种删除方式:delete truncate drop

前言 在 MySQL 中&#xff0c;删除的方法总共有 3 种&#xff1a;delete、truncate、drop&#xff0c;而三者的用法和使用场景又完全不同&#xff0c;接下来我们具体来看。 1.delete detele 可用于删除表的部分或所有数据&#xff0c;它的使用语法如下&#xff1a; delete …

独立产品灵感周刊 DecoHack #052 - 100个AI 工具导航网站

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 ❤️ 刚换工作再加上个人原因有些自己的事…

消息队列中间件 - 详解RabbitMQ6种模式

RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数进行讲解&#xff0c;PHP代码作为实例。 安装 客户端实现&#xff1a;添加扩展&#xff0c;执行composer.phar install命令 {"require":…

SSM框架学习-bean实例化

实例化bean的三种方式 1. 构造方法&#xff08;常用&#xff09; Spring创建bean调用的是无参的构造方法&#xff0c;且无论该无参构造方法是公有还是私有的&#xff0c;都可以调用&#xff08;底层实现原理为反射&#xff09; 2. 静态工厂&#xff08;了解&#xff09; 要配置…

【论文阅读-Low-code LLM】使用LLM进行可视化编程

Low-code LLM: Visual Programming over LLMs link: https://arxiv.org/abs/2304.08103 repository: https://github.com/microsoft/TaskMatrix/tree/main/LowCodeLLM 摘要 大规模预训练模型&#xff08;LLMs&#xff09;在解决困难问题仍具有很大的挑战。这篇文章提出了可以…

lua | 数据类型与变量

目录 一、数据类型 8个基本类型 1.nil(空&#xff09; 2.boolean&#xff08;布尔&#xff09; 3.number(数字&#xff09; 4.string(字符串&#xff09; 5.table&#xff08;表 &#xff09; 6.function&#xff08;函数&#xff09; 7.thread(线程&#xff09; 8.u…