利用投影提升ClickHouse查询性能

这篇具有很好参考价值的文章主要介绍了利用投影提升ClickHouse查询性能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ClickHouse中表排序键对与查询性能至关重要。本文介绍当使用非排序键作为查询条件时如何提升查询性能。通过对非排序键定义投影,然后物化排序结果,利用空间换时间策略,提升查询性能。

选择ClickHouse排序键的规则

当创建MergeTree表时,需要指定列的顺序作为排序键。排序键的顺序对查询性能影响很大,因为排序键决定需要计算的数据在磁盘上排列在一起的紧密程度。

当选择排序键时,应该遵循下面几个规则:

  • 把过滤条件中最常用的列排在最前面
  • 排序键的第一列应该为最常用的列且基数最低
  • 排序键不要超过3或4个,以为会影响插入性能

排序键举例

当查询过滤条件有多个列时,我们如何定义排序键,下面通过示例进行说明。

CREATE TABLE deleteme
(
    `product_id` UInt64,
    `client_id` UInt64
)
ENGINE = MergeTree
PARTITION BY product_id % 10
ORDER BY (product_id, client_id) AS
SELECT number % 100 product_id, number % 100 client_id
FROM numbers(100000000)

整个表占用空间较小,仅~7MB:

SELECT formatReadableSize(total_bytes)
FROM system.tables
WHERE name = 'deleteme'
FORMAT Vertical

Row 1:
──────
formatReadableSize(total_bytes): 7.64 MiB

运行带product_id的查询条件,仅需要~1M行,因为表第一个排序键为product_id:

SELECT *
FROM deleteme
WHERE product_id = 10
FORMAT `Null`

0 rows in set. Elapsed: 0.014 sec. Processed 1.03 million rows, 16.52 MB (72.40 million rows/s., 1.16 GB/s.)

但如果过滤条件使用client_id(第二个排序键),ClickHouse查询时间增加仅3倍,由于相同的client_id在product_id排序的磁盘上不同块中重复存在,ClickHouse需要读取和处理更多的数据来运行查询:

SELECT *
FROM deleteme
WHERE client_id = 10
FORMAT `Null`

0 rows in set. Elapsed: 0.048 sec. Processed 2.97 million rows, 31.98 MB (61.42 million rows/s., 661.52 MB/s.)

利用投影提升性能

下面通过定义投影解决上面查询性能问题。投影概念很简单,即对client_id定义排序并重新排序,从而提升对client_id的查询性能。请看示例:

ALTER TABLE deleteme
    ADD PROJECTION deleteme_by_client_id
    (
        SELECT *
        ORDER BY client_id
    )
ALTER TABLE deleteme
    MATERIALIZE PROJECTION deleteme_by_client_id

PROJECTION 定义了数据按client_id进行排序,当新的部分需要合并时,会以client_id为顺序组织数据。在查询时ClickHouse会透明地使用按Client_id排序的部分。

现在再次执行上节中的查询,可以看到仅读取~1M行数据:

SELECT *
FROM deleteme
WHERE client_id = 10
FORMAT `Null`

Query id: 51a55fec-d526-480b-870b-424a0c6471d3

0 rows in set. Elapsed: 0.052 sec. Processed 1.25 million rows, 18.28 MB (24.17 million rows/s., 352.53 MB/s.)

为了确认projection对性能有提升作用,我们可以检查query_log:

SELECT projections
FROM system.query_log
WHERE (event_time > (now() - toIntervalMinute(5))) AND (query_id = '51a55fec-d526-480b-870b-424a0c6471d3')
LIMIT 1
FORMAT Vertical

Row 1:
──────
projections: ['default.deleteme.deleteme_by_client_id']

当然采用投影会重复存储数据,但在一定场景中可以接受空间和时间的平衡,特别针对较小的表。

命令行查看查询性能

在命令行中执行查询,ClickHouse会自动生成查询性能统计。对于相同的查询会有多种写法,每种方式的查询性能可能有差异。通过分析性能统计,可能会发现最佳的查询方案。

我们可以使用 FORMAT Null 子句执行查询,则仅返回查询性能统计。上面的示例我们就使用了该功能。

SELECT *
FROM system.query_log
WHERE event_time > (now() - toIntervalMinute(10))
FORMAT `Null`

Query id: 7a125064-5422-471c-a170-e18601b2d631

Ok.

0 rows in set. Elapsed: 0.019 sec. Processed 49.86 thousand rows, 1.81 MB (2.61 million rows/s., 94.45 MB/s.)

FORMAT Vertical

我们也可以使用FORMAT Vertical子句,是的查询结果按列方式排列,对于返回数据行较少,但数据列时查看数据比较方便。

SELECT * FROM table_with_a_lot_of_columns FORMAT Vertical

Row 1:
────────
type:                                  QueryFinish
event_date:                            2022-09-22
event_time:                            2022-09-22 09:29:58
event_time_microseconds:               2022-09-22 09:29:58.298699
query_start_time:                      2022-09-22 09:29:58
query_start_time_microseconds:         2022-09-22 09:29:58.296902
query_duration_ms:                     1
read_rows:                             0
read_bytes:                            0
written_rows:                          60
written_bytes:                         8879
result_rows:                           0
result_bytes:                          0
memory_usage:                          4325156
current_database:                      public

总结

本文介绍了排序键对查询的作用,并通过示例对比使用projection提升查询性能,最后也提及如何在命令行下查询性能统计信息。参考文档:https://www.tinybird.co/clickhouse/knowledge-base/improve-performance-inverted-index文章来源地址https://www.toymoban.com/news/detail-492429.html

到了这里,关于利用投影提升ClickHouse查询性能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 项目记录:利用Redis实现缓存以提升查询效率

    项目记录:利用Redis实现缓存以提升查询效率

    当我们查询所有数据时,如果缓存中没有,则去数据库查询,如果有,直接查缓存的数据就行。注意定期更新缓存数据。 BoundHashOperations是绑定键值的方法,意味着之后的操作都是对此键进行操作。 ObjectMapper类提供了一系列json序列化和反序列化的操作。 缓存更新操作是通过

    2024年02月03日
    浏览(14)
  • Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

    Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

    集群配置为:8 个 node 节点,16 核 32G,索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高,search 没有慢查询的状态。 2、集群压测性能不能上去,cpu 使用未打满,查询的 qps 上不去,且有队列堆积。 通过云厂商内核组的同

    2024年02月04日
    浏览(10)
  • 详解数据库分片,大幅提升Spring Boot查询MySQL性能

    详解数据库分片,大幅提升Spring Boot查询MySQL性能

    微服务项目中通常包含各种服务。其中一项服务与存储用户相关的数据有关。我们使用Spring Boot作为后端,使用MySQL数据库。 随着用户基数的增长,服务性能受到了影响,延迟也上升了。由于只有一个数据库和一张表,许多查询和更新由于锁异常返回错误。此外,随着数据库

    2024年01月16日
    浏览(17)
  • Rust 性能优化 : Rust 性能优化技巧,提升 Rust 程序的执行效率和资源利用率 The Rust Performance

    作者:禅与计算机程序设计艺术 在过去的几年中,随着编程语言的快速发展,编程人员已经逐渐从依赖编译型语言转向了使用解释型语言。相对于编译型语言来说,解释型语言具有更快的执行速度,在某些情况下甚至可以实现接近编译器的运行时效率。但是另一方面,这些语

    2024年02月07日
    浏览(150)
  • 【大数据实战】你真的了解 Clickhouse 投影吗?

    【大数据实战】你真的了解 Clickhouse 投影吗?

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人 Java知识图谱点击链接: 体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收藏关注下 , 不然下次找不到哟

    2024年02月15日
    浏览(12)
  • 利用最小二乘法求解相机投影矩阵

    利用最小二乘法求解相机投影矩阵

    1、相机成像几何模型的建立 为了得到三维空间物体表面某点的几何位置与其所在二维平面图像中对应点之间的相关关系,需要建立相机成像的几何模型。 为了建立几何模型,首先需要构建几个重要的坐标系: 世界坐标系(World Coordinate):在环境中建立的三维坐标系,用来

    2024年02月05日
    浏览(13)
  • 利用正射影像对斜射图像进行反向投影

    利用正射影像对斜射图像进行反向投影

    在图像投影和映射领域,有两种类型的投影:正向投影和反向投影。正向投影涉及使用内部方向(即校准相机参数)将 3D 点(例如地面上的物体)投影到 2D 图像平面上。另一方面,向后投影是指根据 2D 图像确定地面物体的 3D 坐标的过程。 为了匹配倾斜图像和正射影像并确

    2024年04月15日
    浏览(3)
  • Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

    Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

    在mybatis_plus的封装中的WrapperT接口参数就是用于封装查询条件   在测试类中启动如上一个简单的查询,然后控制台运行会输出一大堆无关日志,这里先把这些日志关闭 先新建一个XML配置文件   然后变成如下,这里configuration标签里面什么都没有配置就是取消所有日志文件了

    2024年01月18日
    浏览(6)
  • MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除

    MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除

    目录 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合。 封装User模型的查询条件,这里age是具有上下限的,User类里面的age作为下限,这里的age2作为上限。 domain.query.UserQuery.java ①if语句控制 ②条件参数控制 查询结果包含模型类中的部分属性

    2024年02月09日
    浏览(14)
  • Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

    Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

    增删改查四个操作中,查询是非常重要的也是非常复杂的操作,这块需要我们重点学习下,这节我们主要学习的内容有: 条件查询方式 查询投影 查询条件设定 字段映射与表名映射 1.1 条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的

    2024年02月05日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包