ClickHouse进阶(九):Clickhouse数据查询-3

news2024/11/26 4:53:44

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频


目录

1. explain查询执行计划

2. WHERE与PRWHERE子句

3. GROUP BY 子句


1. explain查询执行计划

clickhouse在版本20.6.3之后支持explain查看执行计划。explain基本语法如下:

EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]

对以上解释如下:

  1. AST:用于查看语法树。
  2. SYNTAX:用于查询clickhouse优化后的语法。
  3. PLAN:用于查看执行计划,默认值。
  4. PIPELINE:用于查看PIPELINE计划,相对于PLAN更加详细。

1) AST查看语法树:

node1 :) EXPLAIN AST SELECT id,name,age,local FROM mr_tbl;

2) SYNTAX查看优化后语法,比较常用。

node1 :) EXPLAIN SYNTAX SELECT t.id,t.name FROM (SEELCT id,name FROM person_info) t WHERE t.id <3;

3) PLAN:用于查看执行计划,默认值。

在使用PLAN时有一些设置:

  • header:打印计划中各个步骤的输出头,默认关闭,默认值0。
  • description:打印计划中各个步骤的描述,默认开启,默认值1。
  • indexes:打印计划中使用的索引,默认关闭,默认值0,支持MergeTree表引擎。
  • actions:打印计划中各个步骤的详细信息,默认关闭,默认值0.
  • json:打印计划步骤时使用json格式展示,默认关闭,默认值0,建议使用默认TSVRaw格式,避免不必要的开销。
node1 :) EXPLAIN  PLAN  SELECT id ,name ,age FROM mr_tbl;

#设置一些属性后查询结果node1 :) EXPLAIN PLAN header=1,description=1,indexes=1,actions=1,json=1 SELECT id ,name ,age FROM mr_tbl;​编辑

以上关于json中详细的字段解释可以参照官网解释:EXPLAIN Statement | ClickHouse Docs

4) PIPELINE:用于查看PIPELINE计划,相当于是PLAN更详细的描述。

在执行pipeline是也可以设置一些参数:

  • header:打印计划中各个步骤的输出头,默认关闭,默认值0。
  • graph:使用DOT图形语言描述管道图,默认关闭,默认值0。
  • compact:如果graph开启,以紧凑模式打印管道图,默认开启,默认值1。
node1 :) EXPLAIN PIPELINE header=1 SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 4;

2. WHERE与PRWHERE子句

Where 子句基于条件表达式来实现数据过滤,如果过滤条件恰好是主键字段,则能够借助索引加速查询。例如:

创建MergeTree引擎表mt_tbl,设置id为主键,并插入数据,操作如下:

#创建表 mt_tbl

node1 :) CREATE TABLE mt_tbl

(

    `id` UInt8,

    `name` String,

    `age` UInt8,

    `loc` String,

    `birthday` Date

)

ENGINE = MergeTree()

PARTITION BY toYYYYMM(birthday)

ORDER BY id



#向表中插入以下数据

node1 :) insert into mt_tbl values (1,'zs',18,'beijing','2021-01-01'),(2,'ls',18,'shanghai','2021-02-01'),(3,'ww',18,'tianjin','2021-03-01'),(4,'ml',18,'nanjing','2021-01-02'),(5,'tq',18,'wuhan','2021-01-03'),(6,'gb',18,'beijing','2021-01-04'),(7,'a1',18,'shanghai','2021-03-01'),(8,'a2',18,'guanzhou','2021-04-01'),(9,'a3',18,'sehnzhen','2021-04-01'),(10,'a4',18,'beijing','2021-03-01');

对以上表进行如下查询,where中包含主键,说明能够使用索引过滤数据区间。

node1 :) select id,name,age from mt_tbl where id = 8;

┌─id─┬─name─┬─age─┐

│  8 │ a2   │  18 │

└────┴──────┴─────┘

可以通过执行计划,来查看是否使用索引:

node1 :) explain plan indexes=1  select id,name,age from mt_tbl where id = 8;

除了where子句中包含主键能使用索引加快查询速度之外,clickhouse还提供了PREWHERE子句。

PREWHERE子句目前只能用于MergeTree系列表引擎,可以看成是where的优化,作用也是来过滤数据。与where不同之处在于PREWHERE只会读取指定的列字段数据,用于数据过滤的条件判断,待数据过滤之后再读取SELECT声明的列字段以补全其余属性。所以在一些场合,PREWHERE相对于Where来说,处理的数据量更少,性能更高。

可以执行如下操作来对比where 与Prewhere之间的差异:

#首先执行set optimize_move_to_prewhere=0强制关闭自动优化,在clickhouse中此参数默认开启,在执行一些sql时,clickhouse会自动将where转换成prewhere,这里关闭这个功能,方便测试

node1 :) set optimize_move_to_prewhere=0;



#执行如下where语句:

node1 :) select WatchID,Title,GoodEvent FROM datasets.hits_v1 WHERE RequestNum>3000;

815411 rows in set. Elapsed: 2.143 sec. Processed 8.87 million rows, 891.17 MB (4.14 million rows/s., 415.86 MB/s.)



#执行如下prewhere 语句:

node1 :) select WatchID,Title,GoodEvent FROM datasets.hits_v1 PREWHERE RequestNum>3000;

815411 rows in set. Elapsed: 2.094 sec. Processed 8.87 million rows, 684.71 MB (4.24 million rows/s., 326.91 MB/s.)

我们可以看到相同SQL语句使用where和prewhere查询的数据量一样,但是使用prewhere的效率很高,每秒读取数据吞吐量极大。

在clickhouse中不必将所有的where都替换成prewhere,clickhouse实现了自动优化的功能,在条件合适情况下,会将where替换成prewhere。如果想开启这项特性,需要将optimize_move_to_prewhere设置为1,默认即为1,开启优化功能。

我们可以重新在clickhouse中将optimize_move_to_prewhere参数设置为1,查看clickhouse对where的自动优化:

#设置optimize_move_to_prewhere=1

node1 :) set optimize_move_to_prewhere=1;



#查看如下SQL的优化语句

node1 :) explain syntax select WatchID,Title,GoodEvent FROM datasets.hits_v1 WHERE RequestNum>3000;

以下场景中Where不会自动优化成Prewhere:

  • 使用常量表达式:
select id,name,age from tbl where 1=1 
  • 使用Alias字段:
select id ,name ,age from tbl where avg_age = 10

注意:avg_age是其他查询 as的字段
  • 包含arrayjoin的查询
select id,name,local from tbl array join local where id =2
  • select 查询的列字段与where谓词完全相同
select id  from tbl where id = 1
  • 使用了主键字段
select id from  tbl where id = 1

​​​​​​​3. GROUP BY 子句

Group By子句又称聚合查询,与MySQL或者Hive中的使用方式一样,但是需要注意一点在Select查询中如果有聚合查询,例如max,min等,与聚合查询出现的字段一定要出现在Group by中,否则语句报错。

clickhouse中的Group by 还可以配合WITH ROLLUP、WITH CUBE、WITH TOTALS三种修饰符获取额外的汇总信息。

创建表mt_tbl2 并加载数据:

#创建表mt_tbl2

node1 :) CREATE TABLE mt_tbl2

(

    `province` String,

    `city` String,

    `item` String,

    `totalcount` UInt32

)

ENGINE = MergeTree()

ORDER BY (province, city)



#向表中插入如下数据:

node1 :)   insert into mt_tbl2 values ('北京','海淀','苹果手机',100),('上海','黄浦','小米手机',200),('北京','丰台','苹果手机',300),('北京','大兴','华为手机',400),('上海','嘉定','华为手机',500),('

北京','海淀','华为手机',600),('上海','黄浦','小米手机',700),('北京','大兴','苹果手机',800),('上海','嘉定','华为手机',900),('北京','海淀','小米手机',1000);

  • WITH ROLLUP

ROLLUP 能够按照聚合键从右向左上卷数据,基于聚合函数依次生成分组小计和总计。操作如下:

node1 :) select province,city,item,sum(totalcount) as total from mt_tbl2 group by province,city,item with rollup;

  • WITH CUBE

CUBE 是立方体意思,WITH CUBE会基于聚合键之间所有的组合生成小计信息。操作如下:

node1 :) select province,city,item,sum(totalcount) as total from mt_tbl2 group by province,city,item with cube;

  • WITH TOTALS

WITH TOTALS 会基于聚合键生成结果外,还会附带一行Totals汇总统计。操作如下:

node1 :) select province,city,item,sum(totalcount) as total from mt_tbl2 group by province,city,item with totals;


👨‍💻如需博文中的资料请私信博主。


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

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

相关文章

node socket.io

装包&#xff1a; yarn add socket.io node后台&#xff1a; const express require(express) const http require(http) const socket require(socket.io) const { getUserInfoByToken } require(../../utils/light/tools)let app express() const server http.createS…

武汉芯源半导体CW32F030系列MCU在电焊机的应用

随着工业技术的发展&#xff0c;单片机在许多领域都发挥了重要的作用。在电焊机中应用单片机&#xff0c;通过编写特定的程序&#xff0c;可以实现自动化控制、提高焊接质量和效率。 电焊机是一种用于金属焊接的设备&#xff0c;利用电弧热将金属熔化实现焊接。电焊机主要由电源…

Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。

1.场景 我们在调用接口时&#xff0c;很多时候会同时调用多个接口&#xff0c;接口都是异步执行&#xff0c;我们很难知道调用的多个接口哪个会最后执行完成&#xff0c;我们有时候需要对最后一个接口执行完成的时机监听&#xff0c;所以基于该需求&#xff0c;设计了CombineE…

反序列化漏洞复现(typecho)

文章目录 执行phpinfogetshell 执行phpinfo 将下面这段代码复制到一个php文件&#xff0c;命名为typecho_1.0-14.10.10_unserialize_phpinfo.php&#xff0c;代码中定义的类名与typecho中的类相同&#xff0c;是它能识别的类&#xff1a; <?php class Typecho_Feed{const…

IPv6改造深化之路

01 IPv6改造问题及整体改造思路 随着“十四五”期间国家政策对IPv6深化改造及规模部署的推动&#xff0c;在IPv6改造过程中出现了越来越多的系统性问题&#xff0c;如图1所示。 图1 关于IPv6改造的各种疑问所有跨设备通信的IT软硬件系统均需要处理IP地址&#xff0c;各领域均需…

LeetCode —— 复写零(双指针)

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 将数组中出现的每个零复写一遍&#xff0c;然后将其他元素向右平移&#xff0c;数组长度不能改变。 法一&#xff1a;使用额外空间的做法 class Solution { public:void duplica…

以指标管理为抓手,亿信华辰助力锦州银行打造全行级数据应用

随着金融数字化转型的持续深入&#xff0c;数据智能的业务化应用等正逐步受到行业关注。锦州银行携手亿信华辰&#xff0c;开展全行级指标管理体系建设&#xff0c;实现指标数据统一管理、统一标准、统一来源、统一汇总、统一加工、统一呈现&#xff0c;以及持续推动基础数据治…

Day56|动态规划part16:647. 回文子串、516. 最长回文子序列、动态规划总结篇

647. 回文子串 leetcode链接&#xff1a;力扣题目链接 视频链接&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过…

Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引

索引的概念 在MySQL中&#xff0c;索引是一种数据结构&#xff0c;它被用于快速查找、读取或插入数据。索引能够极大地提高数据库查询的速度。 索引的工作方式类似于图书的索引。如果你想在图书馆找到一本书&#xff0c;你可以按照书名进行查找。书名就像是一个索引&#xf…

0012Java程序设计-springboot基于微信小程序的校园智慧帮系统的设计与实现

摘要目录相关技术2.1 MySQL数据库2.2 SpringBoot框架2.3 uniapp框架2.4 B/S架构 系统设计系统实现开发环境 摘要 随着移动互联网高速发展&#xff0c;手机、移动智能终端设备在生活中有着越来越重要的地位。在高校推崇以人为本的今天&#xff0c;也逐渐重视“移动互联网”技术…

微信小程序集成腾讯im,会话列表数据过多(长列表),卡顿问题的解决

说明 我这边用小程序集成im&#xff0c;然后结合公司的需求&#xff0c;做了一个聊天的小程序&#xff0c;在测试上线的时候没有问题&#xff0c;结果到客户那边&#xff0c;因为他们聊天的人多&#xff0c;会话列表达到了300多条&#xff0c;然后点击会话列表&#xff0c;进入…

【字符串匹配】暴力匹配算法

​ 一、暴力匹配算法原理 暴力匹配算法&#xff0c;也称为朴素字符串匹配算法&#xff0c;是一种简单但不高效的字符串匹配方法。它的原理非常直观&#xff0c;其主要思想是逐个字符地比较文本串和模式串&#xff0c;从文本串的每个可能的起始位置开始&#xff0c;依次检查是…

ESD实时监控监测系统通常包括哪些功能

ESD实时监控监测系统是一种用于监测和控制静电放电的系统。静电放电&#xff08;Electrostatic Discharge&#xff0c;ESD&#xff09;是指由于电荷的不平衡而引起的突发放电现象&#xff0c;可能对电子元器件、设备和工作环境造成损害。 ESD实时监控监测系统通常包括以下功能…

6000+药品靶点在研数据库-<查询工具推荐>

了解在研药物靶点数据对于药物研发、靶点发现和验证、药物安全性评估以及治疗策略优化都具有重要的意义&#xff0c;可以为科学家提供有价值的信息和指导。如在研药物靶点数据为药物研发提供了重要的指导。了解当前正在研究的药物靶点可以帮助科学家了解当前研究的热点领域&…

九州未来入选“AIGC算力产业全景图”

日前&#xff0c;量子位智库发布《AIGC算力全景与趋势报告》&#xff08;以下简称报告&#xff09;&#xff0c;通过广泛调研与深度分析&#xff0c;系统性分析了AIGC算力构成、产业链条&#xff0c;进一步指出了AIGC算力的五新趋势及三大阶段发展预测。其中&#xff0c;九州未…

华为云云服务器评测|初始化配置SSH连接 安装MySQL的docker镜像 安装redis以及主从搭建 7.2版本redis.conf配置文件

目录 引出初始化使用&#xff0c;SSH连接控制台设置密码和配置开放连接的端口在finalshell中建立连接 安装docker&#xff0c;运行MySQL安装docker拉取运行mysql容器 redis的拉取运行redis.conf的配置&#xff08;7.2.0版本&#xff09;准备挂载文件和运行redis的主从搭建&…

企业如何建设主数据管理体系?这篇文章说清楚了

主数据是企业核心的基本业务数据&#xff0c;数据长期存在且应用于多个系统(ERP系统、MES系统、OA系统等)系统内的编码数量成几十万个&#xff0c;并且在不断增长。由于缺乏统一的标准规范&#xff0c;各系统内由于实施商不同、使用单位不同&#xff0c;同数据在各系统内编码不…

8851-LC-MT GE 具有便于现场布线的螺丝端子

8851-LC-MT GE 具有便于现场布线的螺丝端子 例如,两个UDS-TCS提供了与基于PCI的解决方案相同的功能,该解决方案采用16通道板、螺杆终端外壳和屏蔽电缆,但成本将减少247美元(29%)。相对于镍公司基于usb的热电偶产品(usb-9211),USB-TC提供了两倍的通道,但成本降低了24%。 支持…

VB(Visual Basic)程序设计

一&#xff1a;前言 1.发展方向 1.1 学习方向 Web前端学习路线 Java学习路线 嵌入式开发学习路线 如何知道企业的需求技术&#xff1a;去招聘软件看企业的要求 前端、后端、测试、运维、UI、网络安全、游戏开发..... 1.2 学习平台 程序员视频学习平台 1.3 计算机学习资源 …

【C++漂流记】结构体的定义和使用、结构体数组、结构体指针、结构体做函数参数以及结构体中const的使用

结构体&#xff08;struct&#xff09;是C语言中一种重要的数据类型&#xff0c;它由一组不同类型的成员组成。结构体可以用来表示一个复杂的数据结构&#xff0c;比如一个学生的信息、一个员工记录或者一个矩形的尺寸等。 结构体定义后&#xff0c;可以声明结构体变量&#xf…