利用投影提升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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ClickHouse是一个快速、可扩展的列式数据库,支持GIS(地理信息系统)查询。它提供了一套用于处理空间数据的函数和工具,可以轻松执行各种GIS相关查询。以下是关于ClickHouse GIS查询的一些概述: 1. 空间数据存储:ClickHouse可以存储和管理包含空间信息的数据,例如点、线、多边形等。这些空间数据可以直接存储在ClickHouse表中的特定列中。 2. 空间索引:ClickHouse使用R-树索引来管理空间数据。这种索引结构允许高效的空间查询,如范围查询、邻近查询和空间连接查询。 3. 空间函数:ClickHouse提供了一系列内置的空间函数,用于处理和分析空间数据。这些函数包括计算距离、计算面积、判断点是否在某个区域内等功能。 4. 空间查询:通过使用ClickHouse的空间函数,可以执行各种空间查询,如查找在给定区域内的点、查找与给定点最近的点、在多个区域之间进行空间连接等。 5. 运算符和语法:ClickHouse支持使用标准SQL语句进行空间查询,例如使用WHERE子句来过滤和筛选空间数据,使用SELECT子句来选择和投影空间数据。 6. 性能优化:ClickHouse通过设计优化的查询引擎和列式存储方式,可以高效地处理大规模的空间数据。此外,它还支持水平扩展,可以在需要时轻松添加更多的资源来处理复杂的GIS查询。 总的来说,ClickHouse提供了一套功能强大的工具和函数,用于处理和查询GIS数据。无论是进行空间分析还是空间可视化,ClickHouse都是一个可靠和高效的解决方案。 ### 回答2: ClickHouse是一种高性能且可扩展的列式数据库管理系统。它还提供了GIS(地理信息系统)功能,使得可以在地理空间中进行查询和分析。 使用ClickHouse进行GIS相关查询可以实现以下功能: 1. 空间数据类型支持:ClickHouse可以存储和处理空间数据类型,例如点、线、面等。这些数据类型可以用来表示地理要素,如地点、道路、建筑物等。 2. 空间索引:ClickHouse提供了空间索引的支持,可以针对空间数据进行高效的查询。空间索引可以加快空间数据的查询速度,提高查询性能。 3. 空间查询操作:ClickHouse提供了一些用于空间查询的函数,例如计算两个几何对象之间的距离、判断一个点是否在一个区域内等。通过这些函数,可以执行一些与地理位置相关的查询操作。 4. 空间查询优化:ClickHouse还提供了一些优化技巧,以提高空间查询性能。例如,可以对空间数据进行分区和排序,以减少查询时的数据扫描量。 总之,ClickHouse提供了强大的GIS功能,使得可以在地理空间中进行高效的查询和分析。无论是需要处理地理数据的应用场景,还是需要空间分析的业务需求,ClickHouse都可以胜任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值