Clickhouse学习笔记(8)—— 建表优化

数据类型

时间字段

建表时能用数值型或日期时间类型(DateTime)表示的字段就不要用字符串

因为clickhouse进行分区时一般使用时间字段来进行分区,而将时间字段使用DateTime表示,不需要经过函数转换处理,执行效率高、可读性好

如以下建表语句:

create table t_date_type_test(id UInt32,sku_id String,total_amount Decimal(16,2) ,create_time Int32 
) engine =ReplacingMergeTree(create_time)partition by toYYYYMMDD(toDate(create_time))primary key (id)order by (id, sku_id);

这里的create_time使用了Int32类型来保存,因此在使用toYYYYMMDD函数进行格式转换时需要使用toDate来进行处理,否则会报错:

空值存储类型

clickhouse中不建议使用Nullable 类型,因为其会对性能造成影响;

先创建一张有Nullable类型字段的表:

CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog;

其中Nullable(Int8)说明该字段可以是null,也可以是int8类型的数据;

然后向其中插入两条数据:

INSERT INTO t_null VALUES (1, NULL), (2, 3);

然后进入/var/lib/clickhouse/data/default/t_null路径下查看:

发现多出来了一个数据文件来专门存储null类型的数据,这会对查询性能造成影响;

而且Nullable 列无法被索引,因此除非极特殊情况,应直接使用字段默认值表示空,或者自行指定一个在业务中无意义的值(例如用-1 表示没有商品ID)

官网说明如下:Nullable(typename) | ClickHouse Docs

分区

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

索引

必须指定索引列,ClickHouse 中的索引列即排序列,通过 order by 指定

通常需要满足高级列在前、查询频率大的在前原则

而且基数特别大的不适合做索引列,如用户表的 userid 字段

表参数

  • Index_granularity 是用来控制索引粒度的,默认是 8192,如非必须不建议调整(该默认值适用于官方示例的单表一亿数据情况下)
  • 如果表中不是必须保留全量历史数据,建议指定 TTL(生存时间值),可以免去手动过期历史数据的麻烦,TTL 也可以通过 alter table 语句随时修改

写入和删除优化

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

如果写入过快的话可能出现的报错信息:

1. Code: 252, e.displayText() = DB::Exception: Too many parts(304). 
Merges are processing significantly slower than inserts
2. Code: 241, e.displayText() = DB::Exception: Memory limit (for query) 
exceeded:would use 9.37 GiB (attempt to allocate chunk of 301989888 
bytes), maximum: 9.31 GiB

常见配置

clickhouse的配置文件路径:/etc/clickhouse-server

主要的配置文件有两个:

users.xml:User Settings | ClickHouse Docs

config.xml:Global Server Settings | ClickHouse Docs

大多数内容都在config.xml配置文件中;

CPU资源

clickhouse由于多线程执行,对于CPU的占用率很高,因此尽量单独部署,不要和Hadoop集群部署到一台机器上,以免运行时占用其他服务的资源

常用参数如下:

配置

描述

background_pool_size

后台线程池的大小,merge 线程就是在该线程池中执行,该线程池不仅仅是给 merge 线程用的,默认值 16,允许的前提下建议改成 cpu 个数的 2 倍(线程数)

background_schedule_pool_size

执行一些轻量级周期性操作(后台任务)(复制表、Kafka 流、DNS 缓存更新)的线程数;默认值 128,建议改成 cpu 个数的 2 倍(线程数)

background_distributed_schedule_pool_size

设置为分布式发送执行后台任务的线程数,默认 16,建议改成 cpu个数的 2 倍(线程数)

max_concurrent_queries

最大并发处理的请求数(包含 select,insert 等),默认值 100,推荐 150(不够再加)~300

(最新版本的默认值是0(2023),表示不进行限制)

(该参数可以在运行环境中进行修改且立即生效,但不适用于修改时正在运行的任务)

max_threads

设置单个查询所能使用的最大 cpu 个数,默认是 cpu 核数

Core Settings | ClickHouse Docs

除了max_threads需要使用set param=value的方式设置外,其余参数均可在config.xml文件中设置

内存资源

配置

描述

max_memory_usage

此参数在 users.xml,表示单次 Query 占用内存最大值,该值可以设置的比较大,这样可以提升集群查询的上限。(默认值是10G)

应当保留一点给 OS,比如 128G 内存的机器,设置为 100GB

这也是clickhouse推荐单机部署的原因之一,因为如果和yarn等组件部署在一台机器上,该值无法设置的比较大

max_bytes_before_external_group_by

一般按照 max_memory_usage 的一半设置内存,当 group by使用内存超过阈值后会刷新到磁盘进行

因为 clickhouse 聚合分两个阶段:查询并及建立中间数据、合并中间数据,结合上一项,建议 50GB

这样的话如果内存不够用也不会报错,而是会把内存中的数据先刷写到磁盘上,然后继续执行,不过会大幅降低执行效率(实测降低效率十分严重,一般无法接收)

Restrictions on Query Complexity | ClickHouse Docs

通过set param=value可设置

max_bytes_before_external_sort

order by 已使用 max_bytes_before_external_sort 内存就进行溢写磁盘(基于磁盘排序)

与上一个参数类似

通过set param=value可设置

max_table_size_to_drop

此参数在 config.xml 中,应用于需要删除表或分区的情况,默认是50GB,意思是如果删除 50GB 以上的分区表会失败。建议修改为 0,这样不管多大的分区表都可以删除

存储

ClickHouse 不支持设置多数据目录,为了提升数据 io 性能,可以挂载虚拟券组,一个券组绑定多块物理磁盘提升读写性能,多数据查询场景 SSD 会比普通机械硬盘快 2-3 倍

参数配置总结

大部分参数在config.xml中可配置,与用户相关的优先查找users.xml

如果都没有找到,则可以通过show settings like '参数名'的方式查找;

与参数配置相关的文档有:

Global Server Settings | ClickHouse Docs

Core Settings | ClickHouse Docs

User Settings | ClickHouse Docs

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

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

相关文章

黑窗口连接远程服务

ssh root192.168.x.x 回车输入密码 查看docker docker ps 停止正在运行的服务 docker stop xxxxx 删除服务 docker rm xxxxx 查看镜像 docker images 删除镜像 docker rmi xxxxx 删除镜像 启动并运行整个服务 docker compose up -d jar包名称 idea 使用tcp方式连接docker 配置d…

深度探究深度学习常见数据类型INT8 FP32 FP16的区别即优缺点

定点和浮点都是数值的表示(representation),它们区别在于,将整数(integer)部分和小数(fractional)部分分开的点,点在哪里。定点保留特定位数整数和小数,而浮点…

webpack babel

构建工具 简介 当我们习惯了在node中编写代码的方式后,在回到前端编写html、css、js这些东西会感觉到各种的不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。我们…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

图书销售数据大屏可视化【可视化项目案例-03】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路

metalLB 官方网站 Repo:https://github.com/metallb/metallb 官网:https://metallb.universe.tf/installation metalLB解决什么问题? MetalLB 是一个用于裸机 Kubernetes 集群的负载均衡器实现,使用标准路由协议。 k8s 并没有为裸…

【m98】webrtc vs2017构建带符号的debug库

调试有符号 调试 无符号 试试exe不输出到独立的文件? -】 直接输出到sln下面

(2023|CVPR,扩散,主体标识符,先验保存损失)DreamBooth:微调文本到图像的扩散模型以实现主题驱动的生成

DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 公众号:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.…

C语言--从键盘输入当月利润I,求应发奖金总数。

题目描述: 企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%; 利润高于100000 元,低于200000元(1000001000000时,超过1000000元的部分按 1%提成。从键盘输入当月利润I,求应发奖金总数。 int main() {int m…

使用MybatisPlus时出现的java.lang.NullPointerException异常~

错误描述如下所示: 错误原因:Junit的导包错误 单元测试的包有如下所示两个 我们应该根据springboot的版本进行选择, 在Spring Boot 2.2.X以后使用import org.junit.jupiter.api.Test Junit5 在Spring Boot 2.2.x之前使用import org.junit.T…

junit写搜索树测试

用法 assertTrue(range.contains("Two")); 2个参数,右边错就打印左边. AbstractSelfBalancingBinarySearchTree abt; AbstractBinarySearchTree.Node node; Before public void setUp() { abt new AbstractSelfBalancingBinarySearchTree() { Override protecte…

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…

【h5 uniapp】 滚动 滚动条,数据跟着变化

uniapp项目 需求: 向下滑动时,数据增加,上方的日历标题日期也跟着变化 向上滑动时,上方的日历标题日期跟着变化 实现思路: 初次加载目前月份的数据 以及下个月的数据 this.getdate()触底加载 下个月份的数据 onReach…

Panda3d 场景管理

Panda3d 场景管理 文章目录 Panda3d 场景管理有关分层场景图的重要信息NodePathNodePath 以及 Node 的函数调用模型文件文件格式加载模型文件将模型放置在场景图中模型缓存压缩模型异步加载模型通过回调函数进行 常见的状态变化修改节点的位置和姿态改变父级节点改变颜色隐藏和…

如何帮助 3D CAD 设计师实现远程办公

当 3D CAD 设计师需要远程办公时,他们可能需要更强的远程软件,以满足他们的专业需求。比如高清画质,以及支持设备重定向、多显示器支持等功能。3D CAD 设计师如何实现远程办公?接下来我们跟随 Platinum Tank Group 的故事来了解一…

JS实现数据结构与算法

队列 1、普通队列 利用数组push和shif 就可以简单实现 2、利用链表的方式实现队列 class MyQueue {constructor(){this.head nullthis.tail nullthis.length 0}add(value){let node {value}if(this.length 0){this.head nodethis.tail node}else{this.tail.next no…

drawio连接线的样式设置

drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能,并实现了云端存储,以及在线共…

DDoS攻击剧增,深入解析抗DDoS防护方案

当下DDoS攻击规模不断突破上限,攻击方式越发复杂。面对复杂的攻击形式,对于企业和组织来说无疑需要更完备的抗DDoS方案,依靠传统的解决方法并不能做到一劳永逸。在服务器抵抗DDoS防护上,你不会忽略F5的产品,让我们一起…

【LLM_03】自然语言处理基础_1

一、自然语言处理基基本任务和应用1、自然语言处理的基本任务2、搜索引擎的基本工作原理3、知识图谱的构建4、应用 二、词表示与语言模型1、词表示2、上下文3、语言模型4、神经网络在语言模型的应用 三、神经网络1、神经网络基本组成元素2、如何训练神经网络3、计算图的概念4、…

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败,版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令,用于在 Node.js 环境中使用 npm(Node Package Manager)安装包或模块。–force 参数表…