ClickHouse 26.6 版本发布说明

📅 2026/7/12 2:47:51 👁️ 阅读次数 📝 编程学习
ClickHouse 26.6 版本发布说明

又到月末时节,这意味着 ClickHouse 新版本如期而至!

ClickHouse 26.6 版本共包含 56 项新功能 🌞 79 项性能优化 🏖️ 以及 366 个错误修复 🍦

本次发布引入了假设性跳过索引 (hypothetical skip indexes)、级联可刷新物化视图 (cascading refreshable materialized views),以及对连续查询 (continuous queries) 的实验性支持等新特性!

新贡献者

热烈欢迎 26.6 版本的所有新贡献者!ClickHouse 社区的蓬勃发展令人振奋,我们由衷感谢每一份让 ClickHouse 如此受欢迎的贡献。

以下是新贡献者的名单:

Aditya Chopra, Alasdair Brown, Almaz Kunpeissov, Andriy Yakovlev, Antonio Filipovic, Asya Shneerson, Avenir Voronov, Dmitriy Borisenko, Elian Gidoni, Hanzi Jiang, Harikrishnan Prabakaran, Joe Smith, Joey Yu, Le Zhang, Lefteris Gilmaz, Maksim Dergousov, Maksim Moisiuk, Mathuranath Metivier, Minh Vu, Mohamed Abdelhalim, Mohamed Hussain, MunMunMiao, Patrick Pichler, Ramarajusairajesh, Rory Shanks, SKULLFIRE07, Saarthak Gupta, Sacheendra Talluri, Sergey Kuznetsov, Thomas Cabral, Valerii Mordovskii, Valerii Petrov, Varoon Pazhyanur, Venkata Vineel, Vinayak Joshi, Walt Ribeiro, Youssef Kadry, abdelhalim, abduldjafar, alexbakharew, andyzzhao, bernardlim, daxzel, harikrishnan94, leonard9893, linjiayu, mzitnik, ofeliacode, siwakorn.r, sugaf1204, thewisenerd, uber, uwezkhan, valerypetrov, yousefQadry, zhiqiang-hhhh

小贴士:如果您对我们如何生成这份名单感到好奇…… 点击此处(https://gist.github.com/gingerwizard/5a9a87a39ba93b422d8640d811e269e9)。

查看媒体链接:https://www.youtube.com/watch?v=-NmqMH9y4EY&t=1s

您也可以 点击此处查看本次发布会的演示文稿(https://presentations.clickhouse.com/2026-release-26.6/)。

假设性跳过索引

贡献者:Yarik Briukhovetskyi

从 ClickHouse 26.6 版本开始,用户无需实际构建跳过索引 (skip index),即可模拟查询“如果拥有此跳过索引,查询性能会如何?”

假设性索引仅在当前会话中生效,对其他会话不可见,并会在会话结束时自动清除。

我们在 英国房产数据集 上进行了测试,通过多次复制分区,以获得更多可用于操作的行数据:

ALTER TABLE uk_price_paid ATTACH PARTITION ID 'all' FROM uk_price_paid;

我们拥有近 5 亿行数据:

SELECT count() FROM uk_price_paid;
┌───count()─┐ │ 487239408 │ -- 487.24 million └───────────┘ 1 row in set. Elapsed: 0.006 sec.

我们运行以下查询,以找出伦敦地区销量最高的行政区:

SELECT district, count(), round(avg(price)) AS avgPrice FROM uk_price_paid WHERE town = 'LONDON' GROUP BY ALL ORDER BY count() DESC LIMIT 10;
┌─district────────────┬─count()─┬─avgPrice─┐ │ WANDSWORTH │ 3258048 │ 496367 │ │ LAMBETH │ 2354352 │ 402424 │ │ CITY OF WESTMINSTER │ 2164304 │ 1215976 │ -- 1.22 million │ TOWER HAMLETS │ 2098864 │ 473783 │ │ LEWISHAM │ 2022208 │ 291688 │ │ SOUTHWARK │ 1998816 │ 462604 │ │ BARNET │ 1942384 │ 449124 │ │ GREENWICH │ 1874464 │ 316369 │ │ WALTHAM FOREST │ 1813360 │ 270709 │ │ NEWHAM │ 1706352 │ 284768 │ └─────────────────────┴─────────┴──────────┘ 10 rows in set. Elapsed: 0.317 sec. Processed 487.24 million rows, 1.20 GB (1.54 billion rows/s., 3.80 GB/s.) Peak memory usage: 894.97 KiB.

我们可以通过在town列上添加一个集合跳过索引来提高此查询的性能。

集合跳过索引会为指定数量的粒度存储该列的唯一值。在查询时,ClickHouse 可以利用此跳过索引集合来判断是否需要扫描特定的一个或多个粒度。

在 26.6 版本之前,我们需要创建并测试跳过索引,但现在我们可以创建假设索引 (hypothetical index) 取而代之。实际上,我们将创建两个假设索引,以便观察每个粒度创建一个跳过索引与每 128 个粒度创建一个之间的差异:

CREATE HYPOTHETICAL INDEX town_set_10_granularity_1 ON uk_price_paid (town) TYPE set(10) GRANULARITY 1; CREATE HYPOTHETICAL INDEX town_set_10_granularity_128 ON uk_price_paid (town) TYPE set(10) GRANULARITY 128;

完成上述操作后,我们可以在该查询前加上EXPLAIN WHATIF

EXPLAIN WHATIF SELECT district, count(), round(avg(price)) AS avgPrice FROM uk_price_paid WHERE town = 'LONDON' GROUP BY ALL ORDER BY count() DESC LIMIT 10;

运行该查询时,ClickHouse 将读取表数据以在内存中构建候选索引,并根据会话的读取限制和配额统计扫描次数。运行此查询的输出如下所示:

┌─explain───────────────────────────────────────────────┐ │ Baseline (after PK + partition + existing indexes): │ │ table: default.uk_price_paid │ │ parts: 3 │ │ marks: 59479 │ │ est_bytes: 831.90 MiB │ │ │ │ With town_set_10_granularity_128 (set, hypothetical): │ │ status: applicable │ │ marks: 13702 │ │ est_bytes: 191.64 MiB │ │ skip_ratio: 77.0% │ │ │ │ Estimation: │ │ source: empirical │ │ empirical_status: ok │ │ sampled_parts: 3 / 3 │ │ sampled_marks: 59479 / 118964 │ │ elapsed_us: 3826267 │ │ │ │ With town_set_10_granularity_1 (set, hypothetical): │ │ status: applicable │ │ marks: 4663 │ │ est_bytes: 65.22 MiB │ │ skip_ratio: 92.2% │ │ │ │ Estimation: │ │ source: empirical │ │ empirical_status: ok │ │ sampled_parts: 3 / 3 │ │ sampled_marks: 59479 / 118964 │ │ elapsed_us: 4283731 │ │ │ └───────────────────────────────────────────────────────┘ 32 rows in set. Elapsed: 8.115 sec. Processed 974.48 million rows, 1.95 GB (120.08 million rows/s., 240.11 MB/s.) Peak memory usage: 269.35 KiB.

查看第 12 行,我们可以看到每 128 个粒度对应的索引将为该查询跳过 77% 的粒度;而在第 25 行,每个粒度对应的索引则会跳过 92% 的粒度。

这为我们提供了在决定是否创建跳过索引以及如何配置之前的一些有用信息。

级联可刷新物化视图

Michael Kolupaev 贡献

ClickHouse 26.6 对可刷新物化视图 (refreshable materialized views) 的依赖工作方式进行了全面改进。

在此版本之前,虽然可以在可刷新物化视图之间创建依赖关系,但依赖视图仍会在各自独立的计时器上运行。这意味着如果调度出现偏差,不同阶段之间可能会累积延迟,并且视图可能跳过或滞后一个完整的刷新周期。

让我们看看如何使用以下一组用于表示 IMDB 数据的表来配置相关设置:

CREATE TABLE actor_summary ( `id` UInt32, `name` String, `movies` UInt16, `avg_rank` Float32, `genres` UInt16, `directors` UInt16, `updated_at` DateTime ) ENGINE = MergeTree ORDER BY movies;
CREATE TABLE actor_rank ( `id` UInt32, `name` String, `movies` UInt16, `avg_rank` Float32, `genres` UInt16, `directors` UInt16, `updated_at` DateTime ) ENGINE = MergeTree ORDER BY movies;
CREATE TABLE actor_rank_over_time ( `id` UInt32, `name` String, `avg_rank` Float32, `as_of` DateTime ) ENGINE = MergeTree ORDER BY as_of;

我们之前像这样填充这些表:

CREATE MATERIALIZED VIEW actor_summary_mv REFRESH EVERY 2 MINUTES TO actor_summary AS ...
CREATE MATERIALIZED VIEW actor_rank_mv REFRESH EVERY 1 MINUTE DEPENDS ON actor_summary_mv TO imdb.actor_rank AS SELECT * FROM actor_summary WHERE movies > 10 ORDER BY avg_rank DESC LIMIT 5;
CREATE MATERIALIZED VIEW actor_rank_over_time_mv REFRESH EVERY 1 MINUTE DEPENDS ON actor_rank_mv APPEND TO imdb.actor_rank_over_time AS SELECT id, name, avg_rank, now() AS as_of FROM actor_rank ORDER BY avg_rank DESC LIMIT 1;

现在,只有actor_summary_mv具有计时器,但我们不需要为actor_rank_mvactor_rank_over_time_mv指定计时器。因此,最终配置如下:

CREATE MATERIALIZED VIEW actor_summary_mv REFRESH EVERY 2 MINUTES TO actor_summary AS ...
CREATE MATERIALIZED VIEW actor_rank_mv REFRESH DEPENDS ON actor_summary_mv TO imdb.actor_rank AS SELECT * FROM actor_summary WHERE movies > 10 ORDER BY avg_rank DESC LIMIT 5;
CREATE MATERIALIZED VIEW actor_rank_over_time_mv REFRESH DEPENDS ON actor_rank_mv APPEND TO actor_rank_over_time AS SELECT id, name, avg_rank, now() AS as_of FROM imdb.actor_rank ORDER BY avg_rank DESC LIMIT 1;

ALTER TABLE … ADD ENUM VALUES

Ilya Golshtein 贡献

我们可以编写以下查询来查找uk_price_paid表中的枚举列:

SELECT name, type FROM system.columns WHERE table = 'uk_price_paid' AND database = 'default' AND type LIKE 'Enum%' FORMAT Vertical;
Row 1: ────── name: type type: Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4) Row 2: ────── name: duration type: Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2)

在 ClickHouse 26.6 之前,如果需要添加新的枚举 (enum) 值,我们必须同时提供所有现有值:

ALTER TABLE uk_price_paid MODIFY COLUMN type Enum8( 'other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'royal' = 5 );

现在可以使用ADD ENUM VALUES语法添加新值:

ALTER TABLE uk_price_paid MODIFY COLUMN type ADD ENUM VALUES('royal' = 5);

然后,如果我们重新运行查询来显示枚举列:

Row 1: ────── name: type type: Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'royal' = 5) Row 2: ────── name: duration type: Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2) 2 rows in set. Elapsed: 0.006 sec.

命令行界面 (CLI) 中的帮助

Alexey Milovidov 贡献

当您使用 ClickHouse 并需要查阅文档时,无需退出命令行界面 (CLI) 去搜索文档或询问您的 AI 助手以获取答案。相反,您只需输入help后跟主题,即可获得内联文档。

help Geometry;
GEOMETRY (Data Type) ───────────────────────────────────────────────────────────────────────────────────────── Alias of Geometry. Geometry (Data Type) ───────────────────────────────────────────────────────────────────────────────────────── Geometry is a Variant type that can hold any of the geometric data types: Point, LineString, MultiLineString, Polygon, MultiPolygon, or Ring. Syntax Geometry Related: Point

此功能由新增的system.documentation表提供支持,您也可以直接查询该表:

SELECT type, count() FROM system.documentation GROUP BY type ORDER by count() DESC LIMIT 10;
┌─type───────────────┬─count()─┐ │ Function │ 1593 │ │ Setting │ 1549 │ │ Server Setting │ 412 │ │ MergeTree Setting │ 316 │ │ Aggregate Function │ 197 │ │ Data Type │ 140 │ │ Format │ 109 │ │ Table Engine │ 79 │ │ Table Function │ 66 │ │ Dictionary Layout │ 19 │ └────────────────────┴─────────┘ 10 rows in set. Elapsed: 0.019 sec. Processed 4.54 thousand rows, 4.36 MB (240.42 thousand rows/s., 230.69 MB/s.) Peak memory usage: 6.18 MiB.

将 clickhouse-local 转换为服务器

Alexey Milovidov 贡献

clickhouse-local 是我们进行即席数据分析的首选工具,但有时您可能希望将 ClickHouse 实例连接到外部工具,而这在过去并不直接。

从 26.6 版本开始,您现在可以使 clickhouse-local 即时监听连接:

SYSTEM START LISTEN TCP; SYSTEM START LISTEN HTTP;

随后,在 ClickHouse Server 运行期间,您可以连接到它。当任务完成后,停止监听这些端口也非常简单:

SYSTEM STOP LISTEN TCP; SYSTEM STOP LISTEN HTTP;

更轻量、更快的查询启动

Raúl Marín, Dmitry Novik, Max Justus Spransy, Azat Khuzhin 贡献

26.6 版本包含一系列改进,显著减少了简单查询的单次查询开销。

特别是深度嵌套的查询,现在分析效率更高。让我们运行以下(不必要的复杂)查询:

SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM ( SELECT * FROM (SELECT * FROM (SELECT * FROM ( SELECT * FROM uk_price_paid LIMIT 10 )))))))))))))))))));

对比 26.5 版本:

10 rows in set. Elapsed: 0.098 sec. 10 rows in set. Elapsed: 0.102 sec. 10 rows in set. Elapsed: 0.100 sec.

对比 26.6 版本:

10 rows in set. Elapsed: 0.030 sec. 10 rows in set. Elapsed: 0.036 sec. 10 rows in set. Elapsed: 0.050 sec.

在 26.6 版本上,最佳耗时为 30 毫秒,而 26.5 版本上为 98 毫秒,性能提升了大约 3 倍。

持续查询

Mikhail Artemenko 贡献

我们还在实验模式下引入了流式查询 (streaming queries)。您现在可以通过在查询末尾添加STREAM关键字来编写一个永不终止的查询。一旦有新行插入,该查询将持续发出这些新行。

要启用此功能,您可以使用以下设置:

SET enable_streaming_queries = 1;

接着,我们可以编写以下查询,它会保持阻塞状态并持续流式传输新行:

SELECT id, msg FROM live_events STREAM;

live_events表中添加新行时,上述查询将返回这些新行。

此功能还可在更高级模式下结合 cursors 使用:

SELECT _block_number AS bn, _block_offset AS bo, id, msg FROM events STREAM CURSOR {'all': {'block_number': 2, 'block_offset': 0}};

截至 ClickHouse 26.6 版本,此功能仅适用于 Linux。

ClickHouse 是面向 AI 时代打造的高性能实时分析数据库,能够以极致性能处理海量数据分析任务。凭借高并发、低延迟和云原生架构,ClickHouse 广泛应用于可观测性、数据仓库、实时分析及 AI 数据基础设施等场景。我们致力于帮助企业在公有云平台上构建安全、弹性且高性价比的实时分析与 AI 数据平台,加速释放数据价值,推动智能化创新与数字化转型。目前,Trip.com、DiDi、Meta、Sony、Netflix、Deutsche Bank、Sierra、Cloudflare 等全球领先企业均在使用 ClickHouse 支撑其关键业务和数据分析平台。