详解 ClickHouse 的语法优化规则

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

一、count 优化

--1. count()、count(1) 和 count(*),且没有 where 条件,则会直接使用 system.tables 的 total_rows
EXPLAIN SELECT count()FROM datasets.hits_v1;--2. count(column),没有 Optimized trivial count 优化
EXPLAIN SELECT count(CounterID) FROM datasets.hits_v1;

二、消除子查询重复字段

--编写的 sql 中查询了重复字段
EXPLAIN SYNTAX SELECT a.UserID, b.VisitID, a.URL, b.UserID FROM hits_v1 AS a
LEFT JOIN (SELECTUserID,UserID as uid,VisitIDFROM visits_v1
) AS b USING (UserID)
limit 3;--在 hive 中会直接查询展示两个重复字段的值--但在 clickhouse 中会优化去除重复字段
SELECTUserID,VisitID,URL,b.UserID
FROM hits_v1 AS a
ALL LEFT JOIN
(SELECTUserID,VisitIDFROM visits_v1
) AS b USING (UserID)
LIMIT 3;

三、谓词下推

通俗的说是指提前过滤

--1. 当 group by 有 having 子句,但是没有 with cube、with rollup 或者 with totals 修饰的时,having 过滤会下推到 where 提前过滤
EXPLAIN SYNTAX SELECT UserID FROM hits_v1 GROUP BY UserID HAVING UserID = '8585742290196126178';--返回优化语句
SELECT UserID FROM hits_v1 WHERE UserID = '8585742290196126178' GROUP BY UserID--2. 子查询的谓词下推 (ps:hive 中子查询不会谓词下推)
EXPLAIN SYNTAX
SELECT *
FROM
(SELECT UserIDFROM visits_v1
)
WHERE UserID = '8585742290196126178'--返回优化后的语句
SELECT UserID
FROM
(SELECT UserIDFROM visits_v1WHERE UserID = '8585742290196126178'
)
WHERE UserID = '8585742290196126178'EXPLAIN SYNTAX
SELECT * FROM 
(SELECT*FROM(SELECTUserIDFROM visits_v1)UNION ALLSELECT* FROM(SELECTUserIDFROM visits_v1)
)
WHERE UserID = '8585742290196126178'--返回优化后的语句
SELECT UserID
FROM
(SELECT UserIDFROM(SELECT UserIDFROM visits_v1WHERE UserID = '8585742290196126178')WHERE UserID = '8585742290196126178'UNION ALLSELECT UserIDFROM(SELECT UserIDFROM visits_v1WHERE UserID = '8585742290196126178')WHERE UserID = '8585742290196126178'
)
WHERE UserID = '8585742290196126178'

四、聚合计算外推

--聚合函数内的计算,会外推 (ps:hive中不会外推)
EXPLAIN SYNTAX SELECT sum(UserID * 2) FROM visits_v1;--返回优化后的语句
SELECT sum(UserID) * 2 FROM visits_v1

五、聚合函数消除

--对于无意义的聚合函数会优化消除
EXPLAIN SYNTAX
SELECTsum(UserID * 2),max(VisitID),max(UserID)
FROM visits_v1
GROUP BY UserID--返回优化后的语句
SELECTsum(UserID) * 2,max(VisitID),UserID
FROM visits_v1
GROUP BY UserID

六、不同语法删除重复的 key

--order by
EXPLAIN SYNTAX
SELECT *
FROM visits_v1
ORDER BYUserID ASC,UserID ASC,VisitID ASC,
VisitID ASC--返回优化后的语句:
select*
FROM visits_v1
ORDER BYUserID ASC,
VisitID ASC--limit by
EXPLAIN SYNTAX
SELECT *
FROM visits_v1
LIMIT 3 BYVisitID,VisitID
LIMIT 10--返回优化后的语句:
select*
FROM visits_v1
LIMIT 3 BY VisitID
LIMIT 10--using
EXPLAIN SYNTAX
SELECTa.UserID,a.UserID,b.VisitID,a.URL,b.UserID
FROM hits_v1 AS a
LEFT JOIN visits_v1 AS b USING (UserID, UserID)--返回优化后的语句:
SELECTUserID,UserID,VisitID,URL,b.UserID
FROM hits_v1 AS a
ALL LEFT JOIN visits_v1 AS b USING (UserID)

七、标量替换

--如果子查询只返回一行数据,在被引用的时候用标量替换
EXPLAIN SYNTAX
WITH
(SELECT sum(bytes)FROM system.partsWHERE 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 CAST(0, 'UInt64') 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

八、三元运算符优化

--开启 optimize_if_chain_to_multiif 参数,会进行三元运算符优化
EXPLAIN SYNTAX
SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu')
FROM numbers(10)
settings optimize_if_chain_to_multiif = 1;--返回优化后的语句:
SELECT multiIf(number = 1, 'hello', number = 2, 'world', 'atguigu')
FROM numbers(10) SETTINGS optimize_if_chain_to_multiif = 1

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

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

相关文章

一款有趣的Python库绘制风向图,小白容易上手

利用 Python 绘制风向图 绘制风向图通常使用 matplotlib 库的 Barbs 类来实现.这个类用于绘制风向和风速的矢量场,可以实现不同的风向图风格. 安装 ## 命令安装 matplotlib 库:pip install matplotlib用法 下面是一个简单的示例代码,绘制风向图: 使…

代码随想录算法训练营Day46|动态规划:121.买卖股票的最佳时机I、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

买卖股票的最佳时机I 121. 买卖股票的最佳时机 - 力扣(LeetCode) 之前用贪心算法做过相同的题,这次考虑使用动态规划来完成。 dp[i]表示前i天的最大利润 我们已知每一天的价格price[i],则dp[i]为每一天的价格price[i]减去当初…

论文学习_恶意代码家族检测关键技术研究

0. 摘要 研究背景:近年来,恶意代码的数量和规模在以指数级别增长,威胁和影响力与日俱增,造成的经济损失和社会损失也越来越高。因此,如何快速地识别出恶意代码的变种信息,掌握其家族等属性,能够有效辅助网络安全人员掌握其功能性和危害性,具有重要的研究价值。 研究内…

虚拟现实环境下的远程教育和智能评估系统(十三)

管理/教师端前端工作汇总education-admin: 首先是登录注册页面的展示 管理员 首页 管理员登录后的首页如下图所示 管理员拥有所有的权限 课程管理 1、可以查看、修改、增添、删除课程列表内容 2、可以对课程资源进行操作 3、可以对课程的类别信息进行管理&…

java的输出流File OutputStream

一、字节输出流FileOutput Stream 1、定义 使用OutputStream类的FileOutput Stream子类向文本文件写入的数据。 2.常用构造方法 3.创建文件输出流对象的常用方式 二、输出流FileOutputStream类的应用示例 1.示例 2、实现步骤 今天的总结就到此结束啦,拜拜&#x…

【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )

文章目录 一、获取特殊元素1、获取 html 元素2、获取 body 元素3、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/APIgetElementById 函数参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getE…

I2C总线8位IO扩展器PCF8574

PCF8574用于I2C总线的远程8位I/O扩展器 PCF8574国产有多个厂家有替代产品,图示为其中一款HT8574 1 产品特点 低待机电流消耗:10 uA(最大值) I2C 转并行端口扩展器 漏极开路中断输出 与大多数微控制器兼容 具有大电流驱动能力的闭…

嵌入式系统中的加解密签名

笔者来了解一下嵌入式系统中的加解密 1、背景与名词解释 笔者最近在做安全升级相关的模块,碰到了一些相关的概念和一些应用场景,特来学习记录一下。 1.1 名词解释 对称加密:对称加密是一种加密方法,使用相同的密钥(…

IDEA各种实体类运行爆红,不运行就没事

1.问题描述 如图所示,后端项目的import的各种entity爆红,点击也有导入包的提示,且这种报红几乎遍布了整个工程项目 2.我的解决方案 清空缓存,然后把target文件删掉,重新跑 3.小结 idea项目有时候就是一个核弹&…

kubernetes排错(六)-Pod 状态一直 Terminating

查看 Pod 事件: $ kubectl describe pod apigateway-6dc48bf8b6-clcwk -n cn-staging 报错有以下几种情况,不同情况处理方式不同: 1)Need to kill Pod Normal Killing 39s (x735 over 15h) kubelet, 10.179.80.31 Killing container …

软件设计师笔记-系统开发和运行知识(一)

软件工程 软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科。它涉及计算机科学、数学、管理科学等多领域的原理和技术。其核心目标是应用这些原理和技术来提高软件的生产效率、质量,并降低其成本。 关键组成部分: 计算机科学:提供了软件开发所需的基…

微信小程序api和注册

微信小程序API学习总结 引言 随着移动互联网的快速发展,微信小程序已经成为开发者们关注的热点之一。微信小程序以其轻便、快捷、易于开发的特点吸引了大量的开发者。本文将对微信小程序的学习过程进行总结,希望能够帮助读者更好地掌握微信小程序的开发技…

风险评估概念

渗透服务只是风险评估的一种内容 风险评估的概念 是识别,控制,降低,或者消除可能影响到信息系统的安全风险过程。 风险评估的定义: 就是量化测评一种事情带来的影响,整个量化的过程是偏主观化(客户觉得) 风险的特…

QT 中QLineEdit信号的用法(returnPressed)

在 Qt 框架中,QLineEdit 是一个常用的控件,用于让用户输入和编辑单行纯文本。它提供了多个信号,以便在特定事件发生时通知其他对象。其中,editingFinished() 和 returnPressed() 是两个经常用于响应不同用户交互的信号。这两个信号…

PAL: Program-aided Language Models

PAL: Program-aided Language Models ArXiv:https://arxiv.org/pdf/2211.10435 GitHub:https://reasonwithpal.com/ 一、动机 大模型与Chain-of-Thought可以很好地将一些复杂的问题分解为若干个子问题并进行逐步推理;但是对于一些较为复杂…

基于Transformer的目标检测:原理、应用与未来展望

摘要 目标检测作为计算机视觉领域的一个核心任务,近年来随着深度学习技术的发展而取得了显著进步。Transformer,最初在自然语言处理领域取得巨大成功的模型,已经被引入到目标检测任务中,并展现出了强大的潜力。本文将详细介绍Tra…

[技术笔记] 元器件采购之Flash的国内、外厂商Top5

国外Top5 1、Micron(镁光)半导体 2、Toshiba(东芝) 3、Hynix(海力士) 4、Samsung(三星) 5、Intel(因特尔) 6、SanDisk(闪迪) 7…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中,AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理,难免会造成资源确实或导致冗余,因此对于AB包的打包流程来说,进行策略管理显得十分重要。…

DAY11-力扣刷题

1.最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 64. 最小路径和 - 力扣(LeetCode) class Solution {p…

Git 中 pull 操作和 rebase 操作的不同

由于在开发过程中,pull 操作和 rebase 操作都是用来合并分支的,所以我就常常分不清这两个操作具体有什么区别,所以才有了这篇博客来做个简单区分,具体细致差别还请移步到官方文档:Git - Reference (git-scm.com) 1&am…