ClickHouse 进阶【建表、查询优化】

news2024/9/25 17:21:19

1、ClickHouse 进阶

因为上一节部署了集群模式,所以需要启动 Zookeeper 和 ck 集群;

1.1、Explain 基本语法

EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] 
SELECT ... [FORMAT ...]
  • AST:用于查看语法树
  • SYNTAX:用于优化语法
  • PLAN:用于查看执行计划
    • header:打印计划中各个步骤的 head 说明,默认关闭,默认值 0;
    • description:打印计划中各个步骤的描述,默认开启,默认值 1;
    • actions:打印计划中各个步骤的详细信息,默认关闭,默认值 0;
  • PIPELINE:用于查看 pipeline 计划
    • header:打印计划中各个步骤的 head 说明,默认关闭;
    • graph:用 DOT 图形语言描述管道图,默认关闭,需要查看相关的图形需要配合 graphviz 查看;
    • actions:如果开启了 graph,紧凑打印打,默认开启;

其中,PLAN 和 PIPELINE 还可以进行额外的显示设置;

1.2、建表优化

        在之前使用 Hive 做数仓的时候,我们通常直接把日期类型直接存储为 String 类型,用的时候再用 date_format 函数转一下;但是在 ck 中并不是这样的;

1.2.1、数据类型

1)时间字段类型

        虽然 ClickHouse 底层将 DateTime 存储为时间戳 Long 类型,但不建议把时间存储为 Long 类型, 因为 DateTime 不需要经过函数转换处理,执行效率高、可读性好

CREATE TABLE t_type2
(
    `id` UInt32,
    `sku_id` String,
    `total_amount` Decimal(16, 2),
    `create_time` DataTime
)
ENGINE = ReplacingMergeTree(create_time)
PARTITION BY create_time
PRIMARY KEY id
ORDER BY (id, sku_id)
2)空值存储类型

        官方已经指出 Nullable 类型几乎总是会拖累性能,因为存储 Nullable 列时需要创建一个额外的文件来存储 NULL 的标记(原因1),并且 Nullable 列无法被索引(原因2)。因此除非极特殊情况,应直接使用字段默认值表示空,或者自行指定一个在业务中无意义的值(例如用-1 表示没有商品 ID)。

        这里指定了列 y 可以为 null (但是这里的 x 不可以为 null,如果非要给 x 列插入 null 的话,默认会被转为 x 列所对应类型的默认值)

可以看到,因为 y 列可以为 null,所以 ck 会为 y 单独创建一个文件存储 null 值;

1.2.2、分区和索引

        分区粒度根据业务特点决定,不宜过粗或过细。一般选择按天分区,也可以指定为 Tuple(), 以单表一亿数据为例,分区大小控制在 10-30 个为最佳。

        必须指定索引列,ClickHouse 中的索引列即排序列,通过 order by 指定,一般在查询条 件中经常被用来充当筛选条件的属性被纳入进来;可以是单一维度,也可以是组合维度的索 引;通常需要满足高级列在前、查询频率大的在前原则;还有基数特别大的不适合做索引列, 如用户表的 userid 字段;通常筛选后的数据满足在百万以内为最佳;

1.2.3、Index_granularity

        Index_granularity 是用来控制索引粒度的,默认是 8192,如非必须不建议调整。

        如果表中不是必须保留全量历史数据,建议指定 TTL(生存时间值),可以免去手动过期 历史数据的麻烦,TTL 也可以通过 alter table 语句随时修改。

 1.2.4、写入和删除优化

  • 尽量不要执行单条或小批量删除和插入操作,这样会产生小分区文件,给后台 Merge 任务带来巨大压力
  • 不要一次写入太多分区,或数据写入太快,数据写入太快会导致 Merge 速度跟不 上而报错,一般建议每秒钟发起 2-3 次写入操作,每次操作写入 2w~5w 条数据(依服务器性能而定)

        在服务器内存充裕的情况下增加内存配额,一般通过 max_memory_usage 来实现

        在服务器内存不充裕的情况下,建议将超出部分内容分配到系统硬盘上,但会降低执行 速度,一般通过 max_bytes_before_external_group_by、max_bytes_before_external_sort 参数 来实现。

1.3、语法优化规则

1.3.1、count 优化

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

查看 count 的执行计划:

注意 Optimized trivial count ,这是对 count 的优化。 如果 count 具体的列字段,则不会使用此项优化:

1.3.2、谓词下推

        当 group by 有 having 子句,但是没有 with cube、with rollup 或者 with totals 修饰的时 候,having 过滤会下推到 where 提前过滤。例如下面的查询,HAVING name 变成了 WHERE name,在 group by 之前过滤:

子查询支持谓词下推:

1.3.3、聚合计算外推

聚合函数内的计算,会外推,例如:

1.4、查询优化

1.4.1、单表查询

1)Prewhere 替代 where

        Prewhere 和 where 语句的作用相同,用来过滤数据。不同之处在于 prewhere 只支持 * MergeTree 族系列引擎的表,首先会读取指定的列数据,来判断数据过滤,等待数据过滤 之后再读取 select 声明的列字段来补全其余属性。

        当查询列明显多于筛选列时使用 Prewhere 可十倍提升查询性能,Prewhere 会自动优化执行过滤阶段的数据读取方式,降低 io 操作。

        在某些场合下,prewhere 语句比 where 语句处理的数据量更少性能更高。

某些场景即使开启优化,也不会自动转换成 prewhere,需要手动指定 prewhere:

  • 使用常量表达式
  • 包含 arrayJOIN,globalIn,globalNotIn 或者 indexHint 的查询
  • select 查询的列字段和 where 的谓词相同
  • 使用了主键字段
1.4.2、数据采样

通过采样运算可极大提升数据分析的性能

SELECT
    Title,
    count(*) AS PageViews
FROM hits_v1
SAMPLE 1 / 10
WHERE CounterID = 57
GROUP BY Title
ORDER BY PageViews DESC
LIMIT 1000

1.4.3、列裁剪与分区裁剪

        数据量太大时应避免使用 select * 操作,查询的性能会与查询的字段大小和数量成线性 表换,字段越少,消耗的 io 资源越少,性能就会越高。

1.4.4、orderby 结合 where、limit

        千万以上数据集进行 order by 查询时需要搭配 where 条件和 limit 语句一起使用;

1.4.5、避免构建虚拟列

        如非必须,不要在结果集上构建虚拟列,虚拟列非常消耗资源浪费性能,可以考虑在前端进行处理,或者在表中构造实际字段进行额外存储;

1.4.6、uniqCombined 替代 distinct

        性能可提升 10 倍以上,uniqCombined 底层采用类似 HyperLogLog 算法实现,能接收 2% 左右的数据误差,可直接使用这种去重方式提升查询性能。Count(distinct )会使用 uniqExact 精确去重。

        不建议在千万级不同数据上执行 distinct 去重查询,改为近似去重 uniqCombined;

1.4.7、物化视图

        区别于普通视图,物化视图会把数据存下来,而普通视图并不保存数据;

1.5、多表关联

1.5.1、大小表 join

        多表 join 时要满足小表在右的原则,右表关联时被加载到内存中与左表进行比较,ClickHouse 中无论是 Left join 、Right join 还是 Inner join 永远都是拿着右表中的每一条记录 到左表中查找该记录是否存在,所以右表必须是小表。

1.5.2、分布式表使用 GLOBAL

        两张分布式表上的 IN 和 JOIN 之前必须加上 GLOBAL 关键字,右表只会在接收查询请求的那个节点查询一次,并将其分发到其他节点上。如果不加 GLOBAL 关键字的话,每个节点都会单独发起一次对右表的查询,而右表又是分布式表,就导致右表一共会被查询 N²次(N 是该分布式表的分片数量),这就是查询放大,会带来很大开销。

1.6、数据一致性

即便对数据一致性支持最好的 Mergetree,也只是保证最终一致性

        我们在使用 ReplacingMergeTree、SummingMergeTree 这类表引擎的时候,会出现短暂 数据不一致的情况。

在某些对一致性非常敏感的场景,通常有以下几种解决方案:

1.6.1、手动 OPTIMIZE

在写入数据后,立刻执行 OPTIMIZE 强制触发新写入分区的合并动作:

OPTIMIZE TABLE test_a FINAL;

但是数据量大时优化可能非常耗时,而且优化时数据对外无法访问,所以并不推荐使用;

1.6.2、通过 Group by 去重

SELECT 
 user_id , 
 argMax(score, create_time) AS score, 
 argMax(deleted, create_time) AS deleted, 
 max(create_time) AS ctime 
FROM test_a 
GROUP BY user_id 
HAVING deleted = 0;

函数说明:

  • argMax(field1,field2):按照 field2 的最大值取 field1 的值。

比如 argMax(score,create_time),当 score 字段有多个时,取 create_time 最大的;

1.7、物化视图

        ClickHouse 的物化视图是一种查询结果的持久化,它确实是给我们带来了查询效率的提 升。用户查起来跟表没有区别,它就是一张表,它也像是一张时刻在预计算的表,创建的过 程它是用了一个特殊引擎,加上后来 as select,就是 create 一个 table as select 的写法。

         “查询结果集”的范围很宽泛,可以是基础表中部分数据的一份简单拷贝,也可以是多 表 join 之后产生的结果或其子集,或者原始数据的聚合指标等等。所以,物化视图不会随着 基础表的变化而变化,所以它也称为快照(snapshot)

1.7.1、物化视图与普通视图的区别

        普通视图不保存数据,保存的仅仅是查询语句,查询的时候还是从原表读取数据,可以 将普通视图理解为是个子查询。物化视图则是把查询的结果根据相应的引擎存入到了磁盘或内存中,对数据重新进行了组织,你可以理解物化视图是完全的一张新表;

到这里我终于理解了为什么实习的时候一张视图创建了 30 分钟,因为存储引擎用的是 StarRocks 物化视图;

1.7.2、优缺点

优点:查询速度快,要是把物化视图这些规则全部写好,它比原数据查询快了很多,总 的行数少了,因为都预计算好了。

缺点:它的本质是一个流式数据的使用场景,是累加式的技术,所以要用历史数据做去 重、去核这样的分析,在物化视图里面是不太好用的。在某些场景的使用也是有限的。而且 如果一张表加了好多物化视图,在写这张表的时候,就会消耗很多机器的资源,比如数据带 宽占满、存储一下子增加了很多。

1.7.3、语法

也是 create 语法,会创建一个隐藏的目标表来保存视图数据。也可以 TO 表名,保存到 一张显式的表。没有加 TO 表名,表名默认就是 .inner.物化视图名

CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] 
[ENGINE = engine] [POPULATE] AS SELECT ...

总结

        这一块还是不好理解,如果没有项目真正实践,这些优化都是纸上谈兵;这里先有个大致了解,感觉学到最后,这些大数据数据库框架的优化的很多相同点都是有迹可循的;

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

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

相关文章

Moretl 同步设备日志到服务器

使用咨询: 扫码添加QQ 永久免费: Gitee下载最新版本 使用说明: CSDN查看使用说明 功能: 定时(全量采集or增量采集) SCADA,MES等系统采集工控机,办公电脑文件. 优势1: 开箱即用. 解压直接运行.插件集成下载. 优势2: 批管理设备. 配置均在后台配置管理. 优势3: 无人值守 采集端…

注意!!可能这是系统分析师旧教程最后一次考试,赶紧学起来

系统分析师考试是全国计算机技术与软件专业技术资格考试的高级水平考试之一,它是一项专业考试,旨在通过对计算机系统的规划、分析和设计来培养行业内的专业技术人才。近日在国家版本数据中心,查到系统分析师已经有2024最新版的教程出来了&…

JAVA毕业设计156—基于Java+Springboot+vue的电子招投标管理系统(源代码+数据库+万字论文)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的电子招投标管理系统(源代码数据库万字论文)156 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为供应商、单位、管理员三种角色 1、供应…

PMP报考条件真的需要做项目达到3年时间吗?

很多朋友想报考项目管理资格证书的时候,上网一看报考资格,一般会是这样: 第一类:拥有学士学位或同等学历以下者,申请者必须具备至少7500个小时的项目管理经验,并且在申请之日前8年内,累计项目管…

AI大模型加速落地 “新蓝海”如何开拓

【编者按】 当前,生成式人工智能技术在多个领域展现出广泛的应用潜力,逐渐成为科技领域的关注焦点。 国家互联网信息办公室最新数据显示,截至目前,我国已经完成备案并上线、能为公众提供服务的生成式人工智能服务大模型已达180多…

ABeam 德硕| FY25 Kickoff MeetingDinner 回顾

自律 Self-discipline 7月一整月,ABeam中国各office相继举办了新财年的Kickoff会议。Kickoff意为启动,在这个场合,所有员工将一同参会,作为新财年的启幕仪式。 今年ABeam中国以“自律”作为年度主题,本次全站Kickoff…

Java获取exe文件详细信息:产品名称,产品版本等

使用Maven项目&#xff0c;在pom.xml文件中注入&#xff1a; <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码&#xff1a; import …

电脑技巧:9个免费的AI图片无损放大工具和网站

今天小编给大家介绍9款免费的AI图片放大工具和网站&#xff0c;帮助你提高图片清晰度&#xff0c;感兴趣的朋友可以自己试一试&#xff01; 电脑技巧&#xff1a;9个免费的AI图片无损放大工具和网站 美图设计室 美图设计室是美图秀秀公司推出的一款在线图片编辑和设计工具箱&…

基于ESP32的遥控小车

目录 1.ESP32简介 2.项目构思 3.项目所需材料 4.代码示例 5.实物运行 1.ESP32简介 ESP32是一个集成天线和射频巴伦、功率放大器、低噪声放大器、滤波器和电源管理模块。整个解决方案占用的印刷电路板面积最少。该板采用台积电40nm低功耗技术的2.4GHz双模Wi-Fi和蓝牙芯片&…

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元&#xff08;DU&#xff09;协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…

RTSP系列三:RTP协议介绍

RTSP系列&#xff1a; RTSP系列一&#xff1a;RTSP协议介绍-CSDN博客 RTSP系列二&#xff1a;RTSP协议鉴权-CSDN博客 RTSP系列三&#xff1a;RTP协议介绍-CSDN博客 RTSP系列四&#xff1a;RTSP Server/Client实战项目-CSDN博客 目录 一、基本概念 二、RTP报文格式 三、R…

代码随想录训练营 Day21打卡 二叉树 part08 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

代码随想录训练营 Day21打卡 二叉树 part08 一、 力扣669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 …

密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(2)

目录 1.引入 2. SHA512-224\256 3.SHA-3 4.MD5 5.SM3 1.引入 上篇密码学基础&#xff1a;搞懂Hash函数SHA1、SHA-2、SHA3(1)-CSDN博客&#xff0c;我们先就将基础的SHA1\2讲解了&#xff0c;接下来我们继续聊SHA-3、SHA2变体SHA512_224\256等 2. SHA512-224\256 SHA512…

[oeasy]python0028_女性程序员_Eniac_girls_bug_Grace

028_第一个bug是谁发现的_编译之母 回忆上次内容 py文件 是 按照顺序 一行行 挨排 解释执行的 可以用 pdb3 hello.py 来调试程序 顺序执行 程序 在文本中 从上到下 是 一行行写的 解释器 从上到下 是 一行行解释的 调试 也是 从上到下 一行行 调试的 bug这个东西 是什么时候才有…

Rsync未授权访问漏洞

Rsync未授权访问漏洞 Rsync是Liux/Unix下的一个远程数据同步工具&#xff0c;可通过LAN/WAN快速同步多台主机间的文件和目录&#xff0c;默认运行在873端口。由于配置不当&#xff0c;导致任何人可未授权访问Syc,上传本地文件&#xff0c;下载服务器文件。RSyc默认允许匿名访问…

Java—继承和多态 (๑╹◡╹)ノ“““

目录&#xff1a; 一、继承&#xff1a; 为什么面向对象中有继承的概念&#xff1f;那么继承又是什么&#xff0c;继承又有什么作用呢&#xff1f;在我们生活中啊&#xff0c;也存在继承的关系&#xff0c;比如&#xff1a;你父母的财产由你“继承”。那在面向对象中&#xff…

vxe-pulldown 设置了宽度,并不能100%的占满整个容器的解决

1、下拉容器的使用 2、然而&#xff0c;这个宽度的显示是个问题&#xff0c;只占了一小部分&#xff1a; 长度并没有充满整个容器。 vxe-input设置了100%&#xff0c;然后也是一样的效果。 3、解决&#xff1a; .vxe-pulldown {width: 100% !important;} 增加上面的样式&…

本地GitLab runner自动编译Airoha项目

0 Preface/Foreword 1 GitLab runner环境 具体情况如下&#xff1a; Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户&#xff0c;名为gitlab-runner 2 自动编译 2.1 Permission denied 编译过程中&#xff0c;有两个文件出现权限不允…

Java语言程序设计基础篇_编程练习题*16.4 (创建一个英里/公里的转换器)

目录 *16.4 (创建一个英里/公里的转换器) 代码示例 结果展示 *16.4 (创建一个英里/公里的转换器) 编写一个程序来转换英里和公里&#xff0c;如图16-37b所示。如果在英里文本域Mile中输入一个值之后按下回车键&#xff0c;就会在公里文本域公里值。同样的&#xff0c;在公里文…

Latex入门指南:从下载到安装的全面教程

本篇博客旨在为初学者提供一个全面的Latex入门指南&#xff0c;涵盖了从下载、安装到配置Texlive和TexStudio的详细步骤。通过本指南&#xff0c;您将了解到如何正确安装Latex环境并成功运行第一个Latex文档&#xff0c;为撰写高质量的科技论文或书籍打下坚实基础。 目录 一定…