ClickHouse性能调优之排序和数据类型

这篇具有很好参考价值的文章主要介绍了ClickHouse性能调优之排序和数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每个DBA都关心数据库性能调优,我们知道不同数据类型可以描述不能业务场景,同时也影响数据访问和有效存储。ClickHoue支持高级压缩算法提升速度和降低存储成本,优化ClickHoue存储架构提升内存和网络带宽的性能。那我们如何选择压缩算法和数据类型呢?

比较排序键

创建表并指定排序键:

CREATE TABLE default.table_one
(
    `id` UInt64
)
ENGINE = MergeTree
ORDER BY `id`

insert into table_one select number/10 from numbers(5000000)

导出数据并生成json文件:

clickhouse-client -q "select * from table_one" > table_one.json
 
gzip table_one.json

创建表不指定排序键,并插入示例数据:

CREATE TABLE default.table_two
(
    `id` UInt64
)
ENGINE = MergeTree
ORDER BY tuple()

insert into table_two select number/10 from numbers(5000000) order by rand()

ORDER BY tuple() 表示不排序,因为ORDER BY子句不能省略,ClickHouse提供了tuple()默认写法。生成json文件:

clickhouse-client -q "select * from table_two" > table_two.json
 
gzip table_two.json

比较两者的结果,该表仅包含5百万行记录,但可以看到压缩文件的大小差异非常大:

-rw-r--r-- 1 root root   837985 Jan  8 01:47 table_one.json.gz
-rw-r--r-- 1 root root 15615551 Jan  8 01:48 table_two.json.gz

“为什么ClickHouse要为一个简单的查询占用这么多内存,我们如何在生产环境中降低这一要求?”

这是经常提及的问题,重要的是通过排序键可以让内存使用大幅减少,尤其是select查询中按排序键排序。对表选择合适的排序键会极大提升性能,这勿用质疑。

已存在表排序键

对于已存在的表,排序表达式仅可以使用新增列,举例:

CREATE TABLE default.test_exp
(
    `id` UInt64,
    `duration` UInt64
)
ENGINE = MergeTree
ORDER BY id

ALTER TABLE default.test_exp ADD COLUMN version Int32, MODIFY ORDER BY (id, version)

我们现在知道ORDER BY子句是多么重要。在创建表时选择适当的排序键至关重要,同样对于高效的SELECT操作也至关重要。此外,在压缩表之前,建议重新排序当前列以减小大小;但ClickHouse可以包含新插入的列作为排序键的表达式,就如上列中的version列,不能包括duration列。

因此,正确使用排序键可以提升压缩因子20多倍,重复值相较于随机值更有利于压缩。此外,对于性能增强的SELECT查询,请记住使用排序列,减少内存使用,降低计算成本。

选择正确数据类型

在处理大型表并寻找最佳性能查询时,需要仔细选择数据类型。这里列举三个基本规则:

  • 不要把整形设置为float型
  • 对数值设置合适的精度,精度越低越好
  • 对于文本类型尽可能使用LowCardinality(String)FixedString

下面通过示例查看查询中存储和处理字节的情况:

CREATE TABLE deleteme_wrong_type
(
    `number` UInt64
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number AS
SELECT number % 100
FROM numbers(10000000)

ClickHoue 默认对数据进行了压缩:

SELECT
    total_rows,
    formatReadableSize(total_bytes) AS bytes
FROM system.tables
WHERE name = 'deleteme_wrong_type'
FORMAT Vertical

Row 1:
──────
total_rows: 10000000
bytes:      397.03 KiB

但是,当我们执行查询时,却处理了80MB数据:

SELECT sum(number)
FROM deleteme_wrong_type

┌─sum(number)─┐
│ 49500000000 │
└─────────────┘

1 rows in set. Elapsed: 0.013 sec. Processed 10.00 million rows, 80.00 MB (767.57 million rows/s., 6.14 GB/s.)

在上面的示例中,数据按100取余,不会超过Uint8的数据范围,所以我们采用合适的数据类型进行对比:

CREATE TABLE deleteme_right_type
(
    `number` UInt8
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number AS
SELECT number % 100
FROM numbers(10000000)

存储空间变小了。。。

SELECT
    total_rows,
    formatReadableSize(total_bytes) AS bytes
FROM system.tables
WHERE name = 'deleteme_right_type'
FORMAT Vertical

Row 1:
──────
total_rows: 1000000000
bytes:      110.89 KiB

执行查询处理的字节数也有巨大差异,仅有10MB,少了8倍:

SELECT sum(number)
FROM deleteme_right_type

Query id: 8df38fab-2251-4814-aa1f-9434ca942525

┌─sum(number)─┐
│   495000000 │
└─────────────┘

1 rows in set. Elapsed: 0.005 sec. Processed 10.00 million rows, 10.00 MB (1.98 billion rows/s., 1.98 GB/s.)

假如上面的查询需要多次反复执行,对比差异会更明显。因此,小心选择字段的数据类型。

总结

本文通过简单示例说明了排序和选择合适的数据类型,对ClickHouse存占用和处理性能有较大影响。文章来源地址https://www.toymoban.com/news/detail-499218.html

到了这里,关于ClickHouse性能调优之排序和数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ClickHouse性能调优——压缩和编码算法

    随着数据库数据越来越多,给数据存储、网络访问造成成本和负担。压缩技术节约存储空间、加速网络访问的常用解决方案,本文主要介绍压缩算法和ClickHouse编码技术。 ClickHouse协议支持LZ4和ZSTD 压缩算法,两者都是基于字典使用校验和的压缩算法,LZ4较快、但压缩率比ZSTD较

    2024年02月07日
    浏览(44)
  • Spark九:Spark调优之Shuffle调优

    map端和reduce端缓存大小设置,reduce端重试次数和等待时间间隔,以及bypass设置 学习资料:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中

    2024年01月20日
    浏览(40)
  • Hive调优之小表Join大表

    1、小表join大表 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率,再进一步可以使用group 让小的维表(1000条以下的记录条数)先进内存,在map端完成reduce。 2、多个表关联 多个表关联时,最好拆分成小段,避免大sql(无法控制中间

    2024年02月04日
    浏览(39)
  • Hive调优之计算资源配置(一)

    计算资源的调整主要包括Yarn和MR。 1、Yarn配置说明   需要调整的Yarn参数均与CPU、内存等资源有关,核心配置参数如下 (1)yarn.nodemanager.resource.memory-mb   该参数的含义是,一个NodeManager节点分配给Container使用的内存。该参数的配置,取决于NodeManager所在节点的总内存容量

    2024年02月16日
    浏览(37)
  • oracle sql调优之绑定变量用法举例

    Oracle 绑定变量是一种在 SQL 语句中使用变量的方法,它可以提高 SQL 语句的执行效率、简化编程过程,并且可以防止 SQL 注入攻击。 绑定变量的作用是将变量的值与 SQL 语句分离开来,避免在每次执行 SQL 语句时都需要重新解析和编译 SQL 语句,从而提高 SQL 语句的执行效率。在

    2024年02月15日
    浏览(47)
  • GreenPlum中性能调优之shared_buffers修改

    问题背景:刚刚安装完的GreenPlum集群默认shared_buffers为128MB,为了提升系统性能需要修改。 shared_buffers:该参数决定了 Greenplum 数据库在内存中缓存数据的大小。建议将该参数设置为总内存的 25% 左右。官方文档中建议修改为机器物理内存的1/8-1/4,书籍推荐10-25%。 查看当前数据

    2024年02月09日
    浏览(49)
  • clickhouse分组排序,行号,取特定数量数据

    目前应用很多需求设计对数据分组并去特定数量的数据; clickhouse 新版本增加了row_number(),rank() 函数,可以直接对分组数据添加行号;下面是记录了这两个函数的基本使用;另外用 groupArray方式也大概实现了添加行号(官网上有说 groupArrayLast 可以实现自动排序的功能),但是实

    2024年02月07日
    浏览(37)
  • openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优

    数据库提供两种手段进行并发队列的控制,全局并发队列和局部并发队列。 224.1 全局并发队列 全局并发队列采用GUC参数max_active_statements控制数据库主节点上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作

    2024年02月22日
    浏览(49)
  • MySQL调优系列(二)——数据类型优化

    1、更小的数据类型更好 应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范

    2024年02月03日
    浏览(49)
  • 大数据组件ClickHouse介绍(场景、优劣势、性能)

    clickhouse是一个高性能的列式存储分析数据库管理系统,由俄罗斯搜索引擎公司yandex开发。 clickhouse具有以下特点 高性能:clickhouse优化了查询和数据压缩算法,支持多维度数据分析和快速聚合查询。 分布式:clickhouse采用共享无状态架构,可以轻松实现水平扩展,并且支持数据

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包