【大数据】clickhouse 常用语法规则优化策略详解

news2024/11/26 8:26:31

一、前言

在之前的文章中,我们了解到clickhouse作为一款列式存储数据库 ,查询性能非常高效,一方面与其自身的存储引擎设计有关,另一方面,在执行查询语句时,底层做了大量的语法规则的优化,本文将详细介绍clickhouse的常用优化策略。

二、环境准备

从官方下载两个测试数据文件,这两个文件中表的数据量接近千万,用于做实验的数据;

三、准备数据操作步骤

1、上传测试数据包到服务器目录

2、解压文件到clickhouse的数据目录

clickhouse的默认数据目录在 : /var/lib 下

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

解压完成后,可以在data目录下看到本次上传的数据文件

3、修改数据文件以及用户授权

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

4、重启clickhouse服务

sudo clickhouse start

5、登录clickhouse确认数据是否导入成功

 

到这里,环境准备就完成了

四、语法规则优化之 —— count

count() 函数在mysql中大家经常使用的,在clickhouse中也提供了该函数,但是在使用时底层在执行上表现略有差异;

从下面的执行来看,count中带有具体的字段时,引擎会对表的数据进行扫描,而直接count的时候,则发现未作扫描;

接下来通过explain来看下引擎对两种sql语句的执行计划

count字段时执行计划分析

explain plan select count(UserID) from visits_v1;

count为空时执行计划分析

在调用 count 函数时,如果使用的是 count() 或者 count(*) ,且没有 where 条件,则
会直接使用 system.tables total_rows
  • 注意 Optimized trivial count ,这是对 count 的优化,在上图中explain的计划中展示了出来,即通过读取预加载的count文件(有点类似于缓存);
  • 如果 count 具体的列字段,则不会使用此项优化,这时就要对表进行数据扫描了;

补充:

count(1)和count(*)效果等同于count(),引擎认为count的字段是无意义的字段,默认会转换为count()处理,所以效果一样;

五、语法规则优化之 —— 子查询重复字段查询

在使用clickhouse进行关联查询时,如果子查询语句中有重复的字段,引擎会自动进行重复字段的消除,如下查询语句:

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

可以看到,在子查询语句中,查询了两遍UserID,使用explain执行下发现引擎自动帮我们做了字段去重;

六、语法规则优化之 —— 谓词下推优化

group by having 子句,但是没有 with cube with rollup 或者 with totals 修饰的时
候, having 过滤会下推到 where 提前过滤,看下面的这个sql;
EXPLAIN SYNTAX SELECT UserID FROM hits_v1 GROUP BY UserID HAVING UserID = 
'8585742290196126178';

通过explain执行计划发现引擎在执行的时候自动将having去掉了,即将userID的条件下推至where条件里面;

子查询谓词下推

看下面的这条sql
EXPLAIN SYNTAX
SELECT *
FROM 
(
 SELECT UserID
 FROM visits_v1
)
WHERE UserID = '8585742290196126178'


//返回优化后的语句
SELECT UserID
FROM 
(
 SELECT UserID
 FROM visits_v1
 WHERE UserID = \'8585742290196126178\'
)
WHERE UserID = \'8585742290196126178\'

七、语法规则优化之 —— 聚合计算外推

聚合函数内的计算,会外推,请看下面的sql ,该语句即统计UserID字段的sum乘以2:
SELECT sum(UserID * 2) FROM visits_v1

实际上,使用explain之后优化后的sql如下,即把乘以2的操作挪到外面去了;

聚合函数消除

同样的道理,如果对聚合键,也就是 group by key 使用 min max any 聚合函数,则将函数消除,看下面的sql;
SELECT
 sum(UserID * 2),
 max(VisitID),
 max(UserID)
FROM visits_v1
GROUP BY UserID

使用explain之后优化后的sql如下,这也很好理解,既然最后你都按照UserID进行分组了,再查询max(UserID)意义就不大了;

八、语法规则优化之 —— 删除重复的聚合字段

删除重复的 order by key

如下面的sql,重复的聚合键 id 字段会被去重
SELECT *
FROM visits_v1
ORDER BY
 UserID ASC,
 UserID ASC,
 VisitID ASC,
VisitID ASC;

优化后的sql如下,可以看到重复的order by 字段自动被删除了

删除重复的 limit by key

如下面的语句,重复声明的 name 字段会被去重
SELECT *
FROM visits_v1
LIMIT 3 BY
 VisitID,
 VisitID
LIMIT 10

删除重复的 USING Key

例如下面的语句,重复的关联键 id 字段会被去重

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);
回优化后的语句:

九、语法规则优化之 —— 标量替换

如果子查询只返回一行数据,在被引用的时候则会用标量替换,如下面sql语句中的
total_disk_usage 字段:
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;

优化后sql如下:

三元运算优化

如果开启了 optimize_if_chain_to_multiif 参数,三元运算符会被替换成 multiIf 函数,如下面的sql语句,

未完待续,感谢观看!

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

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

相关文章

一体化闸门控制机如何使用

一体化闸门控制机是一款集水位采集、流量计算、图片视频采集、远程通讯、远程控制、本地控制于一体的闸门自动化、信息化测控设备,能够在监控中心远程启闭以及闸门手/自动控制;并通过实时图像监控可以直观了解闸门的运行工况以及周边环境。 1、设备介绍 闸门自动化…

Windows11 Docker镜像存储路径更改(非C盘路径)

Windows11 Docker镜像存储路径更改(非C盘路径) 基于WSL2安装docker后,在使用过程中会发现大量的docker镜像文件,使系统C盘容量激增,对电脑后续使用造成不便,所以需要在安装的时候,手动修改dock…

已开发多款原型,或明年发布新品,三星XR专利布局大揭秘

近期据韩媒Naver新闻爆料,三星电子或将于明年面向开发者推出XR头显,以构建XR生态系统。据悉,三星计划通过打造XR生态系统,来整合元宇宙、软件、内容、元件开发和科研等上下游领域。据称,为了开发XR设备,三星…

数据仓库电商业务简介完整使用 (第二章)

电商业务简介一、电商业务简介1、电商业务流程2、电商常识1)SKU和SPU2)平台属性和销售属性1)平台属性2)销售属性二、业务数据介绍1、电商系统表结构1、活动信息表(activity_info)2、动规则表(ac…

【Docker】解决Docker创建Tomcat容器实例后访问Tomcat主页时报HTTP状态404-未找到的错误

专栏精选文章 《Docker是什么?Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程》《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器…

LeetCode HOT 100 —— 215.数组中的第K个最大元素

题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路 一.暴力法: cla…

计算机研究生就业方向之去大厂做人工智能

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么,如果你只是转码,那么你不一定要考研,至少以下几个职位研究生是没有啥优势的: 1,软件测试工程师(培训一下就行) 2,前…

ARM32汇编逆向分析基础

寄存器和指令基本格式 寄存器 寄存器名称寄存器描述R0函数的第1个参数, 以及保存函数返回的结果R1 - R3保存函数的第2~4个参数R4 – R8通用寄存器,其中R7在系统调用时存储调用号R9平台相关R10通用寄存器, 可用于保存局部变量R11/FP栈帧指针, 用于记录栈帧R12过程间…

欣奥诚分享:企业最应避讳这八类广告宣传词汇

广告宣传中,企业最应避讳这八类词汇 众所周知,拥有一个朗朗上口、脍炙人口的广告标语、广告口号,对于企业战略部署、发展壮大具有最要作用。一个好的广告标语,不仅可以传达产品买点、展现品牌魅力,激发购买欲望&#…

安装多版本node

一、安装多版本node的原因: 在项目开发过程中,不同项目使用的nodejs版本不同,有时会因为node版本过高或太低,导致报错; 解决方式 利用nvm进行管理(本文使用此种方式)配置环境变量(如…

iOS 组件化开发----(一)图片资源管理的方式

1.直接拖拽到工程,勾选Target membership 1)Resource 的使用方式 将文件直接拖入到工程目录下, 并告诉Xcode打包项目时候把这些图片文件打包进去. 这样在应用的".app"文件夹中就有这些图片. 在项目中, 读取这些图片可以通过以下方式来获取图片…

JavaWeb开发(一)——maven仓库

一、maven仓库 1、maven的定义 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 2、maven的约定配置 -- /src/main/java //项目java源代码 -- /src/main/resources //项目的资源文件,比如springmvc.xml -- /src/…

极狐gitlib的安装和使用

极狐gitlib的安装和使用一、实验环境二、安装部署(不带邮箱)三、一些操作3.1 常用命令3.2 备份3.2.1 备份文件分为两步:3.2.2 自定义备份位置3.3 恢复3.4 一些问题3.5 包含的组件四、使用极狐gitlib4.1 初始登录说明4.2 新建用户4.3 新建一个…

CSS之文字样式

1、字体类型设置 标签名&#xff1a;font-family注意&#xff1a;英文字体只适用于英文&#xff0c;中文字体可以适用中文和英文代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-…

Linux学习-81-Apache安装过程

17.9 Apache安装过程 Apache&#xff1a;作为LAMP架构的前端是一款功能强大&#xff0c;稳定性好的Web服务器程序&#xff0c;该服务器直接面向用户提供网站访问&#xff0c;发送网页&#xff0c;图片等文件内容。之前的名称就叫做 Apache&#xff0c;不过后来改名字叫做 httpd…

如何将Unity开发的AR程序编译到IPad/iPhone上真机运行

如何将Unity项目编译成iOS app&#xff0c;并在ipad或者iphone上真机运行呢&#xff1f;大体步骤分为三步&#xff1a; 使用Unity生成 .xcodeproj 文件使用XCode将AR APP编译到IPad/iPhone在真机上设置开发者模式和信任开发者 我的环境&#xff1a; 使用MacBook Pro 进行开发…

分布式操作系统 - 7.分布式一致性与复制管理

文章目录1.一致性与复制1.1 对象复制问题&#xff08;1&#xff09;单副本对象的同步控制&#xff08;2&#xff09;单副本同步控制方法&#xff08;3&#xff09;多副本对象的同步控制方法1.2 支持伸缩性的复制技术2.以数据为中心的一致性模型2.1 分布式数据仓&#xff08;dat…

Redis框架(五):大众点评项目 商品目录 添加Redis缓存

大众点评项目 商品目录 添加Redis缓存需求&#xff1a;基于Redis查询商品信息业务实现给商品添加缓存给店铺类型添加缓存总结和业务流程SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则…

Vue Demi是如何让你的库同时支持Vue2和Vue3的

Vue Demi是什么 如果你想开发一个同时支持Vue2和Vue3的库可能想到以下两种方式&#xff1a; 1.创建两个分支&#xff0c;分别支持Vue2和Vue3 2.只使用Vue2和Vue3都支持的API 这两种方式都有缺点&#xff0c;第一种很麻烦&#xff0c;第二种无法使用Vue3新增的组合式 API&am…

【Redis】Redis跳表与实现源码解析(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…