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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Android]_[初级]_[配置gradle的环境变量设置安装位置]

场景 在开发Android项目的时候, gradle是官方指定的构建工具。不同项目通过wrapper指定不同版本的gradle。随着项目越来越多,使用的gradle版本也增多,导致它以来的各种库也增加,系统盘空间不足,怎么解决? 说明 grad…

.Net-C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

CUMT-----Java课后第六章编程作业

文章目录 一、题11.1 问题描述1.2 代码块1.3 运行截图 二、题22.1 问题描述2.2 代码块2.3 运行截图 一、题1 1.1 问题描述 (1)创建一个用于数学运算接口,算数运算加、减、乘和除都继承该接口并实现具体的算数运算。(2)编写一个测试类进行运行测试。 1.2 代码块 p…

服务器中了locked勒索病毒怎么处理,locked勒索病毒解密,数据恢复

近几年,网络应用技术得到了迅速发展,越来越多的企业开始走向数字化办公,极大地为企业的生产运营提供了帮助,但是网络技术的发展也为网络安全埋下隐患。最近,locked勒索病毒非常嚣张,几乎是每隔两个月就会对…

美团2024届秋招笔试第二场编程真题-小美的数组构造

分析:暴力角度看,因为数组a和b总和一样,所以实际上是将总和m划分为n个数字,且每个数字都和a数组不一样的方案数。当然会超时。从数据角度看,平方级别算法是可以的。 其实用动态规划的四步法分析起来还是很简单的&…

Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络(CNN)进行人脸识别

专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…

EXCEL中将UTC时间戳转为日期格式(精确到秒)

UTC时间戳的格式通常是一个整数,表示从1970年1月1日00:00:00 UTC到当前时间的总秒数。它可以以秒或毫秒为单位表示。例如,如果当前时间是2023年3月17日 12:34:56 UTC,则对应的UTC时间戳为1679839496(以秒为单位)或1679…

通过防火墙禁止访问指定网站(个人电脑,Windows系统)

背景 近年沉迷B站视频不能自拔,使用了诸多手段禁用,都很容易破戒。为了彻底杜绝B站的使用,决定手动进行设置。在ChatGPT和文心一言提问,得到了以下四种方法(按个人认为的戒断水平由低到高排序):…

分享10个地推拉新和网推拉新app推广接单平台,一手接任务平台

文章首推平台:”聚量推客“ 官方邀请码000000 从事地推、拉新、推广这一类型的工作,是一定要有稳定的一手接单平台的,因为在瞬息万变的拉新推广市场中,很多APP应用的推广拉新存在周期性,有可能这个月还在的拉新项目&a…

STM32F407: CMSIS-DSP库的移植(基于库文件)

目录 1. 源码下载 2. DSP库源码简介 3.基于库的移植(DSP库的使用) 3.1 实验1 3.2 实验2 4. 使用V6版本的编译器进行编译 上一篇:STM32F407-Discovery的硬件FPU-CSDN博客 1. 源码下载 Github地址:GitHub - ARM-software/CMSIS_5: CMSIS Version 5…

开发知识点-Vue-Electron

Electron ElectronVue打包.exe桌面程序 ElectronVue打包.exe桌面程序 为了不报错 卸载以前的脚手架 npm uninstall -g vue-cli安装最新版脚手架 cnpm install -g vue/cli创建一个 vue 随便起个名 vue create electron-vue-example (随便起个名字electron-vue-example)进入 创建…

中国国内机场信息集成系统厂家现状情况

机场信息集成系统在本世纪初进入中国市场,早期的信息集成系统提供商以外企为主,后来国内企业迅速发展。但在2008年前,民航总局设立了机场信息系统的入门门槛,也就是需要民航空管工程及机场弱电系统建设资质要求,该要求…

MySQL 约束特殊查询

MySQL 约束&特殊查询 文章目录 MySQL 约束&特殊查询1. 数据库约束1.1 约束类型1.2 NULL约束1.3 NUIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN KEY:外键约束1.7 CHECK约束 2. 表的关系2.1 一…

IPV4过渡IPV6的关键技术NAT(Network AddressTranslation,网络地址转换)

文章目录 NAT的由来NAT基本工作机制NAT技术的分类推荐阅读 NAT的由来 随着物联网、工业互联网、5G的快速发展,网络应用对IP地址的需求呈现出爆炸式的增长。 然而,早在2011年,ICANN就发布公告称最后五组IP地址已分配完毕,已无IPv4…

常微分方程

什么是常微分方程: 未知函数为单变量(一元)函数 例1 设有温度为100摄氏度的物体放置在20摄氏度的空气冷却,求物体温度随时间 变化 的规律。 解:设t时刻物体温度为T 对两边求共积分 设比例系数为k>0 令C, 微分方程: 联系着…

如何删除英文键盘ENG

1.打开设置:时间和语言2.选择语言,查看首选列表,如果有多种语言,删除其他的语言就可以,如果只有中文,需要点击添加语言 3.选择安装的语言 这个时候点击英语,在选项中就可以看到它的默认键盘&…

【博士每天一篇文献-算法】Imposing Connectome-Derived Topology on an Echo State Network

阅读时间:2023-11-5 1 介绍 年份:2022 作者:Jacob Morra, Mark Daley 西部大学 期刊:2022 International Joint Conference on Neural Networks (IJCNN) 引用量:3 研究了果蝇连接图的拓扑结构对混沌时间序列预测中回…

【信息安全原理】——传输层安全(学习笔记)

📖 前言:为保证网络应用,特别是应用广泛的Web应用数据传输的安全性(机密性、完整性和真实性),可以在多个网络层次上采取安全措施。本篇主要介绍传输层提供应用数据安全传输服务的协议,包括&…

代码随想录算法训练营第18天|513. 找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树

JAVA代码编写 513. 找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个…

FlinkSQL聚合函数(Aggregate Function)详解

使用场景: 聚合函数即 UDAF,常⽤于进多条数据,出⼀条数据的场景。 上图展示了⼀个 聚合函数的例⼦ 以及 聚合函数包含的重要⽅法。 案例场景: 关于饮料的表,有三个字段,分别是 id、name、price&#xff0…