Clickhouse学习笔记(9)—— 语法优化

news2024/11/25 9:47:35

ClickHouse 的 SQL 优化规则是基于 RBO(Rule Based Optimization)实现的

官方数据集的使用

为了方便测试CK的语法优化规则,尝试使用官方提供的数据集;

需要使用的数据集是visits_v1hints_v1

Anonymized Web Analytics Data | ClickHouse Docs

hits_v1 表有 130 多个字段,880 多万条数据

visits_v1 表有 180 多个字段,160 多万条数据

使用步骤如下: 

1.将下载的数据集上传到服务器

2.将数据集解压到clickhouse 数据路径下:/var/lib/clickhouse(权限不够的话切换root用户)

sudo tar -xvf hits_v1.tar -C /var/lib/clickhouse
sudo tar -xvf visits_v1.tar -C /var/lib/clickhouse

可以看到数据集的文件目录:

解压之后会和clickhouse文件夹下的相应目录合并:

3.修改数据集所属用户

sudo chown -R clickhouse:clickhouse /var/lib/clickhouse/data/datasets
sudo chown -R clickhouse:clickhouse /var/lib/clickhouse/metadata/datasets

4.查看是否导入成功

/var/lib/clickhouse/data路径下可以看到导入的datasets数据库

则导入成功

COUNT优化

在调用 count 函数时,如果使用的是 count() 或者 count(*),且没有 where 条件,则会直接使用 system.tables 的 total_rows

EXPLAIN SELECT count()FROM visits_v1;

可以看到对count进行了优化;

但如果是count(UserID),则没有优化效果:

消除重复字段

消除子查询重复字段

EXPLAIN SYNTAX SELECT 
a.UserID,
b.VisitID,
a.URL,
b.UserID
FROM
hits_v1 AS a 
LEFT JOIN ( 
   SELECT 
   UserID, 
   UserID as HaHa, 
   VisitID 
   FROM visits_v1) AS b 
USING (UserID)
limit 3;

重复的字段会被消除:

,即使是重命名也不可以

删除重复的 order by key

EXPLAIN SYNTAX
SELECT *
FROM visits_v1
ORDER BY
 UserID ASC,
 UserID ASC,
 VisitID ASC,
 VisitID ASC

优化后的语法:

删除重复的 limit by key

有关limit by的用法:

LIMIT BY Clause | ClickHouse Docs

EXPLAIN SYNTAX
SELECT *
FROM visits_v1
LIMIT 3 BY
 VisitID,
 VisitID
LIMIT 10

优化后的语法:

删除重复的 USING Key

EXPLAIN SYNTAX
SELECT
 a.UserID,
 a.UserID,
 b.VisitID,
 a.URL,
 b.UserID
FROM hits_v1 AS a
LEFT JOIN visits_v1 AS b USING (UserID, UserID)

优化后的语法:

SELECT 
 UserID,
 UserID,
 VisitID,
 URL,
 b.UserID
FROM hits_v1 AS a
ALL LEFT JOIN visits_v1 AS b USING (UserID)

谓词下推

简单来说就是提前过滤条件

EXPLAIN SYNTAX SELECT UserID FROM visits_v1 GROUP BY UserID HAVING UserID = '8585742290196126178';

原sql中是先分组,再根据having的条件过滤,但优化后的sql是先通过where过滤,再分组:

谓词下推同样适用于复杂的查询语句,以子查询为例:

EXPLAIN SYNTAX
SELECT *
FROM 
(
 SELECT UserID
 FROM visits_v1
)
WHERE UserID = '8585742290196126178'

会将where过滤提前到子查询内部去执行:

但不会删除原位置的where语句;

聚合计算外推

聚合函数内的计算会外推

EXPLAIN SYNTAX
SELECT sum(UserID * 2)
FROM visits_v1

会首先将UserID加和,再×2:

聚合函数消除

如果对聚合键,也就是 group by key 使用 min、max、any 聚合函数,则将函数消除

EXPLAIN SYNTAX
SELECT
 max(UserID),
 min(UserID),
 any(UserID),
 avg(UserID),
 sum(UserID)
FROM visits_v1
GROUP BY UserID;

可以看到:

因为对于分组的key来说,同一组的数据key相同,因此对其求最大、最小值等操作无意义;

标量替换

如果子查询只返回一行数据,在被引用的时候用标量替换

EXPLAIN SYNTAX
WITH 
 (
 SELECT sum(bytes)
 FROM system.parts
 WHERE active
 ) AS total_disk_usage
SELECT
 (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
 table
FROM system.parts
GROUP BY table
ORDER BY table_disk_usage DESC
LIMIT 10;

优化后:

由于with中sum(bytes)的结果为0,因此使用标量来进行替换;

identity:标识函数

Other Functions | ClickHouse Docs

cast:类型转换函数(cast(x,T))

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

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

相关文章

Mysql基本知识

1.SQL分类 DDL【data definition language】 数据定义语言,用来维护存储数据的结构 代表指令: create, drop, alter DML【data manipulation language】 数据操纵语言,用来对数据进行操作 代表指令: insert,delete,up…

MapInfo Pro “偏移”命令

偏移对象的用途是什么? 将一个或多个地图对象移动特定距离和/或方向,并将其放置在可编辑层中。对象可以来自任何层。您可以在选择操作后聚合数据。 ​ “偏移对象”何时处于活动状态? 当“贴图”窗口为活动窗口时,该窗口具有可编…

2023数字科技生态大会-数字安全论坛 学习笔记

监管合规->价值创造的方向,在安全领域的发展方向-安全运营服务型 ICT->数字->数据 数字安全:网络安全数据安全 传统信息化以计算为核心,数字化以数据为核心 数字安全技术发展十大趋势: 一、 数字安全技术政策环境将不…

电热毯电热床上用品上架亚马逊美国站UL964测试标准要求

美国是一个对安全要求非常严格的国家,美国本土的所有电子产品生产企业早在很多年前就要求有相关检测。而随着亚马逊在全球商业的战略地位不断提高,境外的电子设备通过亚马逊不断涌入美国市场。“为保证消费者得安全,亚马逊始终强调带电得产品…

一文了解芯片测试项目和检测方法 -纳米软件

芯片检测是芯片设计、生产、制造成过程中的关键环节,检测芯片的质量、性能、功能等,以满足设计要求和市场需求,确保芯片可以长期稳定运行。芯片测试内容众多,检测方法多样,今天纳米软件将为您介绍芯片的检测项目都有哪…

【EDAS论文投稿】

背景 第一次使用这个系统投稿,不是很熟练甚至差点错过了投稿时间,所以记录一下投稿过程中出现的致命问题。 注册、登录就不用说了 登陆后选择自己的会议的symposia 添加文章信息;依次添加作者信息 在第三步长传文件时,系统提示…

Ultipa 支持OpenCypher,助力企业级应用发展

OpenCypher 是欧美图数据库厂家 Neo4j 基于其图查询语言Cypher 开发的一套开源图查询语言,该语言也是开发者们较为熟悉的图查询语言之一。 Ulitpa Graph(嬴图)于2022年6月实现的对OpenCypher 的支持,旨在让用户能够通过自己熟悉的…

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…

使用责任链模式实现登录风险控制

责任链模式 责任链模式是是设计模式中的一种行为型模式。该模式下,多个对象通过next属性进行关系关联,从而形成一个对象执行链表。当发起执行请求时,会从首个节点对象开始向后依次执行,如果一个对象不能处理该请求或者完成了请求…

福建科立讯通信 指挥调度管理平台RCE漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设…

一文让你了解网络刷卡器的特点和优势

网络刷卡器一款高性能的多协议电子标签读写器,保持高识读率的同时实现对电子标签的快速读写处理,广泛应用于物流追踪、个人身份识别、人员管理、智能停车场、门禁考勤、公交一卡通、餐饮、金融等多个领域。 特点和优势: 1)低功耗、…

知识管理工具zotero的数据迁移工作

工作中一直使用zotero来管理一些有价值的文档,时间长了这个数据库的大小也是很大的,如果有调整电脑的需求,那么这个数据库就要随之迁移,zotero有两种数据迁移方式,一种是云同步,需要买zotero的容量&#xf…

【FastCAE源码阅读8】调用gmsh生成网格

FastCAE使用gmsh进行网格划分,划分的时候直接启动一个新的gmsh进程,个人猜测这么设计是为了规避gmsh的GPL协议风险。 进行网格划分时,其大体运行如下图: 一、Python到gmshModule模块 GUI操作到Python这步不再分析,比…

C++学习第三十七天----第十章--对象和类

10.2.2 C中的类 类是一种将抽象转换未用户定义类型的C工具,它将数据表示和操作数据的方法合成一个整洁的包。 接口:一个共享框架,供两个系统交互时使用。 1.访问控制 使用类对象的程序可以直接访问类的公有部分,但只能通过公有…

单片机定时器讲解和实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么?二、单片机定时器结构2.1***两个8位如何合成16位,16位如何分成两个8位***2.2 计数器的位数组合?2.3 定时功…

用python将csv表格数据做成热力图

python的开发者为处理表格和画图提供了库的支持,使用pandas库可以轻松完成对csv文件的读写操作,使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数,然后设置自定义色条的各种属性如颜色,位置,…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…

Maya v2024(3D动画制作软件)

Maya 2024是一款三维计算机图形动画制作软件。它被广泛应用于电影、电视、游戏、动画等领域中,用于创建各种三维模型、场景、特效和动画。 以下是Maya的主要特点: 强大的建模工具:Maya提供了各种建模工具,如多边形建模、NURBS建模…

VsCode 安装 GitHub Copilot插件 (最新)

##在线安装: 打开Vscode扩展商店,输入 "GitHub Copilot " ,选择下载人数最多的那个。(这个是你写一部分代码或者注释,Ai自动帮你提示/补全代码),建议选择这个 注意下面有个和他类似的 "GitHub Copilo…