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

news2025/1/11 7:56:31

数据类型

时间字段

建表时能用数值型或日期时间类型(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.coloradmin.cn/o/1198953.html

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

相关文章

开放领域问答机器人2——开发流程和方案

开放领域问答机器人是指在任何领域都能够回答用户提问的智能机器人。与特定领域问答机器人不同,开放领域问答机器人需要具备更广泛的知识和更灵活的语义理解能力,以便能够回答各种不同类型的问题。 开发开放领域问答机器人的流程和方案可以包括以下步骤…

【视觉SLAM十四讲学习笔记】第二讲——初识SLAM

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲 一个机器人,如果想要探索某一块区域,它至少需要知道两件事: 我在什么地方——定位周围环境是什么样——建图 一方面需要明白自身的状态(即位置)&#…

最详细ChatGPT+AI绘画+企业知识库+视频去水印系统源码搭建流程,手把手教你搭建

一、系统介绍 这款源码搭载了强大的AI问答功能,是基于目前最强大AI大语言模型ChatGPT进行开发的Ai智能问答系统,并使用stablediffusion加最新的comfyui作为底层技术的绘画系统,使用comfyui的api接口,可以更灵活的定制自己的绘画工作流&#…

2.2 CE修改器:未知数值扫描

本关需要扫描未知数只扫描,要在不知道初始值的情况下找到一个在0到500之间的数值。首先,选择“未知的初始值”扫描方式,在数值类型中选择 4 字节,并点击“首次扫描”以开始扫描。扫描结束后,点击“打我”按钮进行一些操…

Java基础(第六期):Java基础巩固、逢七跳过、数组求和、判断数组是否相等、数组逆置、元素位置查找、评委打分、随机产生验证码

Java基础专栏【点击跳转学习】 Java基础(第六期):对前五期的综合练习 文章目录 综合练习巩固JAVA基础第六期一、逢 7 跳过二、数组元素求和三、判断两个数组元素是否相同四、查找元素在数组中的索引五、数组元素反转使用for循环的实现方式一、…

【LeetCode刷题-二分查找】--278.第一个错误的版本

278.第一个错误的版本 /* The isBadVersion API is defined in the parent class VersionControl.boolean isBadVersion(int version); */public class Solution extends VersionControl {public int firstBadVersion(int n) {int left 1,right n;while(left < right){int…

webpack工作原理

目录 合并代码模块化webpack 的打包webpack 的结构webpack 的源码addEntry 和 _addModuleChainbuildModuleCompilation 的钩子产出构建结果 了解 webpack 实现原理&#xff0c;掌握 webpack 基础的工作流程&#xff0c;在平时使用 webpack 遇见问题时&#xff0c;能够帮助我们洞…

Doris学习--1、Doris简介、操作Doris、Doris架构(数据模型)

星光下的赶路人star的个人主页 心之所向&#xff0c;剑之所往 文章目录 1、Doris简介1.1 快速开始1.2 安装配置1.2.1 应知前提1.2.2 配置Doris1.2.2.0 配置前提1.2.2.1 配置FE&#xff08;Frontend&#xff09;1.2.2.2 启动FE1.2.2.3 连接FE1.2.2.4 停止FE1.2.2.5 配置BE&#…

【函数讲解】pygmo中的函数 fast_non_dominated_sorting() + 利用支配关系,学习一个SVM分类器,将解分为两类

这个函数是用来执行非支配排序的&#xff0c;可以分层构建Pareto&#xff0c;并返回每一层的解以及每个解支配其他解的索引、解被其他解支配的次数、解所在的非支配层级。这个函数对这些解进行非支配排序&#xff0c;并返回四个数组&#xff1a;ndf, dl, dc, 和 ndr。 ndf (Non…

2.3 CE修改器:浮点数扫描

本关需要使用 Cheat Engine 工具对浮点数进行扫描&#xff0c;完成修改任务。浮点数是一种带有小数点的数值&#xff0c;通过“浮点数”扫描方式进行修改。本关中&#xff0c;健康值为单精度浮点数&#xff0c;弹药值为双精度浮点数&#xff0c;需要将这两项数值都修改为 5000 …

InSAR形变监测方法与研究进展(朱建军,中南大学)

文章目录 摘要引言InSARInSAR原理SAR卫星 InSAR监测技术D-InSARMT-InSARPS-InSARSBAS-InSARDS-InSAR&#xff08;Distributed Scatterer InSAR&#xff09;MAI&#xff08;Multi-Aperture InSAR, 多孔径InSAR&#xff09; InSAR形变监测应用与发展城市沉降监测矿山形变监测地震…

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

定点和浮点都是数值的表示&#xff08;representation&#xff09;&#xff0c;它们区别在于&#xff0c;将整数&#xff08;integer&#xff09;部分和小数&#xff08;fractional&#xff09;部分分开的点&#xff0c;点在哪里。定点保留特定位数整数和小数&#xff0c;而浮点…

用互联网思维打造物流网(别人笑我太疯癫,我把自己当成仙)

引言 最近在写网络相关文章&#xff0c;在类比互联网与物流网时发现他们有很多相似之处。 互联网传输的是数据&#xff0c;物流网传输的是物品&#xff0c;功能相似&#xff0c;都是用于传输。 互联网在传输数据时&#xff0c;通过路由选择最佳传输路线&#xff1b;物流在运…

微信小程序数据交互和缓存

目录 前言&#xff1a; 数据交互 1. 发起网络请求 2. WebSocket 2.1实时数据库 3. 微信支付 数据缓存 1. 页面级缓存 2. 内存级缓存 3. 数据缓存策略 优化用户体验 总结 前言&#xff1a; 在开发微信小程序时&#xff0c;数据交互和缓存是非常重要的方面。本文将介…

【已解决】ModuleNotFoundError: No module named ‘matplotlib‘

问题描述 Traceback (most recent call last): File "/home/visionx/nickle/temp/SimCLR/linear_evaluation.py", line 207, in <module> import matplotlib.pyplot as plt ModuleNotFoundError: No module named matplotlib 解决办法 pip install matp…

2020年-2022年聚合支付牌照机构评级结果分析,D/E有所增加

本文首发于移动支付网&#xff0c;标题“聚合支付机构最新评级结果公布&#xff0c;A-、B级别机构减少”&#xff0c;该文是基于其内容进行了数据修订及部分内容优化而成文。 11月7日&#xff0c;中国支付清算协会发布2022年度收单外包服务机构评级等级结果。本次评级工作&…

Vert.x学习笔记-什么是Verticle

什么是Verticle Verticle是Vert.x应用中的基本编程单元&#xff0c;类似于Java中的Servlet、Pojo Bean或Akka中的Actor。它可以使用不同的编程语言实现&#xff0c;并且这些由不同编程语言实现的Verticle可以封装到一个模块中&#xff0c;进而部署到一个Vert.x应用中。Verticl…

海康威视嵌入式软件一面(技术面)

海康威视技术面试大部分都是基础问题和牛客上的问题&#xff0c;最后还有手撕代码部分也是牛客原题&#xff0c;总体中等偏难。 一、问答题 1.什么是野指针&#xff0c;野指针如何形成 【C语言基础】野指针与空指针_野指针和空指针-CSDN博客 2.const和static作用和区别 sta…

Java算法(七):随机产生验证码 前后端验证码比对处理 实战思路步骤

Java算法&#xff08;七&#xff09; 随机产生验证码 package com.liujintao.random;import java.util.Random; import java.util.Scanner;public class RandomNumber {/*** 该函数调用验证码所有的函数&#xff0c;完成验证码模块功能开发* param args*/public static void …