Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ClickHouse支持查询结果缓存啦

ClickHouse支持查询结果缓存啦

作者头像
Nauu
发布于 2023-09-02 02:54:28
发布于 2023-09-02 02:54:28
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

众所周知,OLAP 数据库相较于传统的 OLTP 数据库,QPS肯定是比不过的。所以为了提升QPS、提升查询性能会做一些额外的优化,比如:

  • 将动态查询转为"静态",也就是提前将一些常用的查询主题落表
  • 增加查询结果缓存层
  • ...

今天我们要聊的是查询结果缓存,在以往,这项功能要放在下游的应用层自行实现。自己时常会想,要是数据库自己就有这个功能该多方便。

现在 ClickHouse 还真就内置这项功能了,从 V23.1 开始引入了查询结果缓存,支持 SELECT 结果缓存。在缓存 TTL 期间,基于AST语法树分析,相同的 SELECT 将仅执行第一次查询,后续查询直接从缓存返回。

是不是很兴奋呢?这还不赶快试试?

我们用官方的 一亿的测试数据集 hits_100m_obfuscated 进行演示。

先试试没有查询缓存的感觉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
    RegionID,
    uniq(UserID) AS u
FROM hits_100m_obfuscated
GROUP BY RegionID
ORDER BY u DESC
LIMIT 10

Query id: 2944d569-6d9f-49c9-9b82-2f2f81fcfbd4

┌─RegionID─┬───────u─┐
│      2292853403 │
│        21080698 │
│      208831401 │
│      169608301 │
│      184322302 │
│      158306236 │
│       34298706 │
│       55287611 │
│      107271657 │
│       42242793 │
└──────────┴─────────┘

10 rows in set. Elapsed: 0.819 sec. Processed 100.00 million rows, 1.20 GB (122.16 million rows/s., 1.47 GB/s.)

OK,现在步入正题,要使用查询结果缓存,首先要开启配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET allow_experimental_query_cache = true

然后在需要缓存的查询后面带上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SETTINGS use_query_cache = true

例如第一次执行,会生成查询结果缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
    RegionID,
    uniq(UserID) AS u
FROM hits_100m_obfuscated
GROUP BY RegionID
ORDER BY u DESC
LIMIT 10
SETTINGS use_query_cache = 1

Query id: 18057c67-ac9a-4dca-815f-f741b4610a0b

┌─RegionID─┬───────u─┐
│      2292853403 │
│        21080698 │
│      208831401 │
│      169608301 │
│      184322302 │
│      158306236 │
│       34298706 │
│       55287611 │
│      107271657 │
│       42242793 │
└──────────┴─────────┘

10 rows in set. Elapsed: 0.869 sec. Processed 100.00 million rows, 1.20 GB (115.06 million rows/s., 1.38 GB/s.)

第二次执行,瞬间直接从缓存返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
    RegionID,
    uniq(UserID) AS u
FROM hits_100m_obfuscated
GROUP BY RegionID
ORDER BY u DESC
LIMIT 10
SETTINGS use_query_cache = 1

Query id: 89e1a32b-dc0a-4aa9-96cc-912531a34861

┌─RegionID─┬───────u─┐
│      2292853403 │
│        21080698 │
│      208831401 │
│      169608301 │
│      184322302 │
│      158306236 │
│       34298706 │
│       55287611 │
│      107271657 │
│       42242793 │
└──────────┴─────────┘

10 rows in set. Elapsed: 0.006 sec.

是不是很爽呢?

从资源消耗层面看看缓存的威力吧,查看缓存命中率和资源消耗:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
    query,
    ProfileEvents['QueryCacheHits'] AS query_cache,
    query_duration_ms / 1000 AS query_duration,
    formatReadableSize(memory_usage) AS memory_usage,
    formatReadableQuantity(read_rows) AS read_rows,
    formatReadableSize(read_bytes) AS read_data
FROM system.query_log
WHERE (type = 'QueryFinish') AND hasAll(tables, ['cluster_test.hits_100m_obfuscated'])
ORDER BY initial_query_start_time DESC
LIMIT 2
FORMAT Vertical

Query id: 05f101cf-e250-4d3a-9fbb-cb62daf90956

Row 1:
──────
query:          SELECT RegionID, uniq(UserID) AS u FROM hits_100m_obfuscated 
GROUP BY RegionID ORDER BY u DESC LIMIT 10
SETTINGS use_query_cache = true;
query_cache:    1
query_duration: 0.005
memory_usage:   17.27 KiB
read_rows:      10.00
read_data:      120.00 B

Row 2:
──────
query:          SELECT RegionID, uniq(UserID) AS u FROM hits_100m_obfuscated 
GROUP BY RegionID ORDER BY u DESC LIMIT 10
SETTINGS use_query_cache = true;
query_cache:    0
query_duration: 0.813
memory_usage:   241.74 MiB
read_rows:      100.00 million
read_data:      1.12 GiB

时间: 0.005 vs 0.813

内存:17.27K vs 241.74MB

扫描范围:10行 vs 全表

除了上面这条运维SQL以外,我们还可以从系统表看到缓存信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM system.query_cache
FORMAT Vertical

Query id: e10857e9-da10-4b53-892a-b9a4707c6216

Row 1:
──────
query:       SELECT RegionID, uniq(UserID) AS u FROM hits_100m_obfuscated GROUP BY RegionID ORDER BY u DESC LIMIT 10 SETTINGS 
result_size: 512
stale:       1
shared:      1
compressed:  1
expires_at:  2023-06-24 11:28:20
key_hash:    16226283579053502780

可以清楚的看到当前缓存了哪些SQL,是否过期。

在使用 ClickHouse 查询结果缓存的时候,还有2点需要值得注意:

1、缓存TTL时间

SELECT 结果缓存的 TTL 时间默认是60秒,可以自行设置,超过了时间之后缓存会失效,例如将时间改为2秒:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT RegionID, uniq(UserID) AS u FROM hits_100m_obfuscated 
GROUP BY RegionID ORDER BY u DESC LIMIT 10
SETTINGS use_query_cache = true ,query_cache_ttl = 2;

2秒以后再次查询,不会走缓存。

2、缓存大小

单个SELECT查询结果缓存大小限制默认1M,超过1M的结果不会被缓存,例如下面这条返回字符串的SQL,不能被缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT URL AS u FROM hits_100m_obfuscated  LIMIT 1000000
FORMAT `Null`
SETTINGS use_query_cache = true;

查询日志会发现超过阈值的提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QueryCache: Skipped insert (query result too big), new_entry_size_in_bytes: 1179648 (1048576), new_entry_size_in_rows: 10653 (30000000)

当前我们可以在 cong.xml 修改阈值,包括缓存大小、个数等:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<query_cache>
    <size>1073741824</size>
    <max_entries>1024</max_entries>
    <max_entry_size>1048576</max_entry_size>
    <max_entry_records>30000000</max_entry_records>
</query_cache>

总体来说,ClickHouse 内置的查询结果缓存还方便的,赶快去试试吧

原创不易,如果这篇文章对你有帮助,欢迎 点赞、转发、在看 三连击

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ClickHouse的秘密基地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021年ClickHouse最王炸功能来袭,性能轻松提升40倍
各位,今年 ClickHouse 最王炸的功能来啦,没错,就是期待已久的 Projection (投影) 功能。ClickHouse 现在的功能已经非常丰富强大了,但是社区用现实告诉我们,还可以进一步做的更好:)
Nauu
2021/09/17
3.2K0
ClickHouse之DBA运维宝典
最近有位网友与我聊天,他是一名 DBA,问我在 ClickHouse 中有没有一些能够 “安家立命” 的运维 SQL 语句。我想对于这个问题很多朋友都会有兴趣,所以就在这里做一个简单的分享。
Nauu
2020/07/02
3.1K0
ClickHouse 集群部署(不需要 Zookeeper)
(1)安装 ClickHouse Server 和 ClickHouse Client
用户1148526
2024/04/18
9.1K2
基于Clickhouse的日志体系
1、flink对微服务的topic数据清洗后,丢到一个新的Kafka的topic里面
保持热爱奔赴山海
2022/01/11
3.4K0
基于Clickhouse的日志体系
ClickHouse的一些优化操作(五)
官网说明:https://clickhouse.tech/docs/zh/sql-reference/data-types/nullable/
Java技术债务
2022/08/09
1.3K0
6亿数据秒级查询,ClickHouse太快了!
ClickHouse 在数据分析技术领域早已声名远扬,最近由于项目需求使用到了 ClickHouse 做分析数据库,于是用测试环境做了一个单表 6 亿数据量的性能测试。
架构师修炼
2021/04/12
2.8K1
ClickHouse 实战笔记 第06期:ClickHouse 常用管理命令
我们经常需要确定数据库当前正在执行的 SQL,CH 提供了一些系统表用于记录这些信息,具体用法如下:
数据库交流
2022/04/25
1.1K0
ClickHouse 实战笔记 第06期:ClickHouse 常用管理命令
这会是ClickHouse解决数据一致性的新法宝吗?
大家都知道,由于 MergeTree 的实现原理导致它只能支持数据的最终一致性。什么?你不知道?请进传送门。这导致我们在使用 ReplacingMergeTree、SummingMergeTree 这类表引擎的时候,会出现短暂数据不一致的情况。
Nauu
2020/08/17
8.5K0
快速上手 ClickHouse
希望通过简单的方式,来介绍新手如何一步一步上手 ClickHouse,如果你有潜在的数据分析的需求,但是不知道从哪里开始,那么希望本文能够帮助到你。
soulteary
2021/10/27
9520
大数据ClickHouse进阶(二十五):ClickHouse熔断机制
在ClickHouse中熔断机制是限制资源被过度使用的一种保护机制,当使用的资源数量达到阈值时,正在进行的操作会被自动中断,按照使用资源统计方式不同,熔断机制分为两类。
Lansonli
2022/11/15
1.4K0
大数据ClickHouse进阶(二十五):ClickHouse熔断机制
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
       笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。
粲然忧生
2023/10/12
5600
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
大家想要的ClickHouse UDF这次终于来啦
大家一直想要的自定义函数,这次终于来啦,虽然目前还有点简单,不过 CH 的功能进一步丰富了。
Nauu
2021/10/12
3.2K0
聊聊ClickHouse中的低基数LowCardinality类型
2020年快要过去了,写博客的习惯还是得捡起来。最近刚刚忙完搬家的事情,抽出一点时间简单聊两句。
小晨说数据
2022/03/09
1.9K0
聊聊ClickHouse中的低基数LowCardinality类型
clickhouse的sql语法4之system的了解-查看当前实时连接数
关于clickhouse的system的库,里面是所有的系统所有的配置都在里面这里存着,我这里就挑几个比较重要的讲一下。
公众号-利志分享
2022/04/25
2.8K0
ClickHouse-查询优化
Prewhere 和 where 语句的作用相同,用来过滤数据。不同之处在于 prewhere 只支持*MergeTree 族系列引擎的表,首先会读取指定的列数据,来判断数据过滤,等待数据过滤之后再读取 select 声明的列字段来补全其余属性。 当查询列明显多于筛选列时使用 Prewhere 可十倍提升查询性能,Prewhere 会自动优化执行过滤阶段的数据读取方式,降低 io 操作。 在某些场合下,prewhere 语句比 where 语句处理的数据量更少性能更高
awwewwbbb
2022/05/12
6820
ClickHouse查询优化
ClickHouse是OLAP(Online analytical processing)数据库,以速度见长^clickhouse_bench。ClickHouse为什么能这么快?有两点原因^why_clickhouse_is_so_fast:
charmer
2022/11/14
2.3K0
ClickHouse查询优化
ClickHouse 查询优化详细介绍
作者:oliverdding,腾讯 CSIG 测试开发工程师 你想要的 ClickHouse 优化,都在这里。 ClickHouse 是 OLAP(Online analytical processing)数据库,以速度见长[1]。ClickHouse 为什么能这么快?有两点原因[2]: 架构优越 列式存储 索引 数据压缩 向量化执行 资源利用 关注底层细节 但是,数据库设计再优越也拯救不了错误的使用方式,本文以 MergeTree 引擎家族为例讲解如何对查询优化。 ClickHouse 查询执行过程 ⚠️
腾讯技术工程官方号
2023/01/09
2.5K1
ClickHouse 查询优化详细介绍
探索ClickHouse——使用Projection加速查询
在测试Projection之前,我们需要先创建一张表,并导入大量数据。 我们可以直接使用指令,从URL指向的文件中获取内容并导入表。但是担心网络不稳定,我们先将文件下载下来。
方亮
2023/09/27
4770
探索ClickHouse——使用Projection加速查询
大数据ClickHouse进阶(二十七):ClickHouse服务监控
在ClickHouse System库下的系统表中最要有三张表支撑了ClickHouse运行指标的查询,分别是:metrics、events和asynchronous_metrice。
Lansonli
2022/11/17
1.5K0
大数据ClickHouse进阶(二十七):ClickHouse服务监控
初探ClickHouse的RBAC权限功能
在4.28号的线上 Meetup 中,朵夫介绍了 ClickHouse 的一项新特性,即基于角色的RBAC权限功能,当时我就觉得这将会是一项实用的功能。
Nauu
2020/05/20
3.2K2
相关推荐
2021年ClickHouse最王炸功能来袭,性能轻松提升40倍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验