Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

如何验证 ClickHouse 中的查询缓存是否被使用

如何检查我的查询是否使用了查询缓存?

请参见以下示例,使用 clickhouse client 和 ClickHouse Cloud 服务。

创建 query_cache_test

使用 clickhouse client

clickhouse-cloud :) CREATE TABLE query_cache_test (name String, age UInt8) ENGINE =MergeTree ORDER BY name

CREATE TABLE query_cache_test
(
    `name` String,
    `age` UInt8
)
ENGINE = MergeTree
ORDER BY name

Query id: 81c54f09-7de4-48ec-916f-c7c304a46931

Ok.

0 rows in set. Elapsed: 0.343 sec.

向表中插入一些数据:

clickhouse-cloud :) INSERT INTO query_cache_test SELECT * FROM generateRandom('name String, age UInt8',1,1) LIMIT 100000;

INSERT INTO query_cache_test SELECT *
FROM generateRandom('name String, age UInt8', 1, 1)
LIMIT 100000

Query id: 90369105-bd67-494c-bdaf-d90dbfb6def9

Ok.

0 rows in set. Elapsed: 0.173 sec. Processed 327.05 thousand rows, 3.43 MB (1.89 million rows/s., 19.86 MB/s.)

启用跟踪日志:

clickhouse-cloud :) SET send_logs_level = 'trace'

SET send_logs_level = 'trace'

Query id: d65490b0-7960-4a85-a343-787e70e5e293

Ok.

0 rows in set. Elapsed: 0.134 sec.

运行一条启用查询缓存的查询 (在查询末尾追加 SETTINGS use_query_cache=true) :

clickhouse-cloud :) SELECT name FROM query_cache_test WHERE age > 1000 FORMAT Null SETTINGS use_query_cache=true;

SELECT name
FROM query_cache_test
WHERE age > 1000
FORMAT `Null`
SETTINGS use_query_cache = 1

Query id: 3754a7fd-b786-47c1-a258-dfbc75e35a04

[c-red-qc-36-server-0] 2023.05.29 12:06:10.542408 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \

再次运行相同的查询:

clickhouse-cloud :) SELECT name FROM query_cache_test WHERE age > 1000 FORMAT Null SETTINGS use_query_cache=true;

SELECT name
FROM query_cache_test
WHERE age > 1000
FORMAT `Null`
SETTINGS use_query_cache = 1

Query id: a047527c-9d55-4e6b-9747-0ccad8787515

[c-red-qc-36-server-0] 2023.05.29 12:06:17.931007 [ 454 ] {a047527c-9d55-4e6b-9747-0ccad8787515} \

现在请观察与 QueryCache 相关的 TRACE 日志的差异:

第 1 次执行:

[c-red-qc-36-server-0] 2023.05.29 12:06:10.543559 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \<Trace\> QueryCache: No entry found for query SELECT name FROM query_cache_test  WHERE age > 1000 FORMAT `Null` SETTINGS
[c-red-qc-36-server-0] 2023.05.29 12:06:10.547760 [ 454 ] {3754a7fd-b786-47c1-a258-dfbc75e35a04} \<Trace\> QueryCache: Stored result of query SELECT name FROM query_cache_test  WHERE age > 1000 FORMAT `Null` SETTINGS

第二次执行时:

[c-red-qc-36-server-0] 2023.05.29 12:06:17.932043 [ 454 ] {a047527c-9d55-4e6b-9747-0ccad8787515} \<Trace\> QueryCache: Entry found for query SELECT name FROM query_cache_test  WHERE age > 1000 FORMAT `Null` SETTINGS

在第 1 次执行时,显然没有找到对应条目 (No entry found for query SELECT...) ,因此 ClickHouse 确实为我们存储了该条目 (Stored result of query SELECT...) 。

在第 2 次执行时,该查询使用了查询缓存,因为它发现该条目已存储 (Entry found for query SELECT...) 。

仅使用 SQL

只需执行 SQL 命令,无需查看 clickhouse client 的跟踪日志,

也可以通过检查相关的 system 表来验证是否使用了查询缓存:

clickhouse-cloud :) SELECT 1 SETTINGS use_query_cache=true;

SELECT 1
SETTINGS use_query_cache = 1

Query id: a5a078c7-61e5-4036-a6f0-4d602d5b72d2

在上一组结果中可以看到:查询 SELECT 1 SETTINGS use_query_cache=true; 首次运行时出现了 1 次 QueryCacheMisses,而该查询第二次执行时则出现了一次 QueryCacheHits 事件。

还要注意,默认的最大缓存条目大小为 1048576 字节 (= 1 MiB) ,并且默认情况下,结果在缓存中只会保留 60 秒 (例如,你也可以在 SETTINGS 中使用 query_cache_ttl=300,将查询缓存结果的保留时间改为 5 分钟) 。

你可以在这里找到有关 ClickHouse 查询缓存的更详细信息

Navigation