作者:Alexey Milovidov 原文链接:https://clickhouse.com/blog/clickhouse-22-2-released/

我们准备了一个新的 ClickHouse 版本 22.2,如果您在 2022-02-22 尝试它正是时候。如果没有,你今天可以试试。这个最新版本包括来自 118 个贡献者的 2,140 个新提交,其中包括 41 个新贡献者:

Aaron Katz, Andre Marianiello, Andrew, Andrii Buriachevskyi, Brian Hunter, CoolT2, Federico Rodriguez, Filippov Denis, Gaurav Kumar, Geoff Genz, HarryLeeIBM, Heena Bansal, ILya Limarenko, Igor Nikonov, IlyaTsoi, Jake Liu, JaySon-Huang, Lemore, Leonid Krylov, Michail Safronov, Mikhail Fursov, Nikita, RogerYK, Roy Bellingan, Saad Ur Rahman, W, Yakov Olkhovskiy, alexeypavlenko, cnmade, grantovsky, hanqf-git, liuneng1994, mlkui, s-kat, tesw yew isal, vahid-sohrabloo , yakov-olkhovskiy, zhifeng, zkun, zxealous, 박동철。

让我告诉你 22.2 中最有趣的是什么……

Projection已经production ready

Projection允许您在同一个表中拥有多份不同的数据表示。例如,您可以在同一张表中同时存储聚合数据与原始数据。关于使用何种聚合函数没有任何限制——你可以使用count distinct, quantile或其他任何你需要的聚合函数。您也可以在同一张表中拥有多份不同排序顺序的数据。ClickHouse 会自动为您的查询选择最合适的Projection,因此查询会自动优化。

Projection有点类似于物化视图,它们都允许您进行增量聚合和增加排序顺序。但与物化视图不同的是,Projection是自动更新的且与主表一致。Projection数据存储在表的data parts目录下,并以与主数据相同的方式合并。

该功能由著名的 ClickHouse 贡献者Amos Bird开发。 Projection 原型 自 2021 年 2 月起可用,它已于 2021 年 5 月作为实验特性由 Nikolai Kochetov合并到主代码库 中,经过 21 次后续拉取请求,我们确保它通过了全套测试套件并默认启动该特性

在我们的文档中 阅读如何使用Projection优化查询的示例 。

控制数据导出时的文件创建和重写

当您使用 INSERT INTO TABLE FUNCTION 语句将数据导出到 file, s3hdfs且 目标文件已经存在时,现在可以控制如何处理它:可以将新数据附加到文件中,用新数据重写它,或创建另一个具有类似名称的文件,例如“data.1.parquet.gz”。

一些类似s3的存储系统 和一些类似Parquet的格式 不支持数据附加。在之前的 ClickHouse 版本中,如果您多次插入 Parquet 格式的文件,最终会得到其他系统无法识别的文件。针对这种问题,现在您可以选择在后续插入时抛出异常或创建更多文件。

22.2中引入了这些开关:

s3_truncate_on_insert
s3_create_new_file_on_insert
hdfs_truncate_on_insert
hdfs_create_new_file_on_insert
engine_file_allow_create_multiple_files

此功能 由 Pavel Kruglov开发

自定义数据去重token

ReplicatedMergeTreeMergeTree 类型的表实现块级重复数据删除。当插入一个数据块时,会计算其加密哈希,如果之前已经插入了相同的块,则跳过重复数据块,插入查询成功。这使得为插入实现精确一次语义成为可能。

在 22.2版本 中,您可以提供自己的去重token,而非自动计算的哈希。如果您已经有来自外部系统的token并且想重用它们,那么这将十分有用。当相同的块需要被多次插入时,这也是有意义的。反过来,当块包含一些随机数据并且您只想根据一些重要的列进行去重时也很有用。

这是通过添加开关来实现的 insert_deduplication_token。该功能由 Igor Nikonov提供。

INSERT 的 DEFAULT 关键字

SQL 兼容性的一个小补充——现在我们允许在insert query中使用DEFAULT 关键字而不是值 。INSERT INTO ... VALUES它看起来像这样:

INSERT INTO test VALUES (1, 'Hello', DEFAULT)

感谢 Andrii Buriachevskyi 提供该特性。

临时列

表中的列可以具有 DEFAULT 类似的表达式 c INT DEFAULT a + b。 在 ClickHouse 中,如果您希望始终使用默认表达式计算某一列,您也可以使用 MATERIALIZED 而不是DEFAULT 。如果您根本不希望存储该列,而是在被引用时动态计算该列,您可以用ALIAS

从版本 22.2 开始,添加了一种新类型的列: EPHEMERAL 。用户可以将数据插入此列,但该列的数据不会存储在表中。EPHEMERAL 的目的是提供数据以计算使用 DEFAULT or MATERIALIZED 表达式引用它的其他列。

此功能由 Yakov Olkhovskiy开发。

多磁盘配置的改进

您可以配置多个磁盘来存储 ClickHouse数据来替代RAID,ClickHouse将自动管理数据存放到哪个磁盘。

从22.2 版本开始,ClickHouse 可通过从其他副本下载丢失的data part并将它们放在健康的磁盘上,这样clickhouse-server可从磁盘故障中自动恢复而无需重启。

此特性由 Amos Bird实现,并且已经在快手的生产中使用了 1.5 年以上。

另一个改进是指定 TTL MOVE TO DISK/VOLUME IF EXISTS的选项。它允许两个磁盘配置不同的副本存在,并让其中一个副本将旧数据移动到冷存储,而另一个副本将所有数据放在热存储上。数据将仅在具有指定磁盘或卷的副本上移动。该特性由 Anton Popov开发。

弹性的内存限制

我们将每个查询和每个用户的内存限制分成硬限制和软限制。max_memory_usagemax_memory_usage_for_user 为硬限制。当内存消耗接近硬限制时,将抛出异常。另外两个开关: max_guaranteed_memory_usagemax_guaranteed_memory_usage_for_user 是软限制。

如果有可用内存,则允许查询使用比软限制更多的内存。但是如果内存不足(相对于每个用户的硬限制或每个服务器的总内存消耗),我们会计算“过量使用率”——每个查询相对于软限制消耗多少内存——我们将杀死最过度使用的查询以让其他查询正常执行。

简而言之,如果您有数百 GB 的可用内存,您的查询将不限于几 GB 的 RAM。

此实验特性由 Dmitry Novik开发, 并且正在继续完善中。

SQL 中的 Shell 样式注释

现在我们允许以##! 开头的注释,类似 MySQL。变体 #!允许指定执行该SQL脚本的clickhouse-local路径

此功能由 Aaron Katz提供。很不错。

还有很多…

Maxim Kita、Danila Kutenin、Anton Popov、zhanglistar、Federico Rodriguez、Raúl Marín、Amos Bird 和 Alexey Milovidov 为本版本贡献了大量的性能优化。我们将一如既往的致力于提高性能。

阅读 22.2 版本的 完整变更日志 并遵循 路线图