我们准备了新的 ClickHouse 22.2 版本,如果您在 2022 年 2 月 22 日尝试过,那真是太好了。如果没有,今天就可以试用。此最新版本包含来自 118 位贡献者的 2140 个新提交,其中包括 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 中最有趣的内容…
投影使您能够在同一张表中拥有多个数据表示。例如,您可以在原始数据旁边拥有数据聚合。对可使用的聚合函数没有限制 - 您可以在其中拥有去重计数、分位数或任何您想要的东西。您可以在多个不同的排序顺序中拥有数据。ClickHouse 将自动为您查询选择最合适的投影,因此查询将自动优化。
投影在某种程度上类似于物化视图,物化视图也允许您进行增量聚合和多个排序顺序。但与物化视图不同,投影与主表一起以原子方式和一致方式更新。投影数据存储在表的相同“数据部分”中,并以与主数据相同的方式合并。
此功能由著名的 ClickHouse 贡献者 Amos Bird 开发。该 原型 自 2021 年 2 月起可用,它已由 Nikolai Kochetov 于 2021 年 5 月在实验性标志下合并到主代码库中,并且经过 21 次后续拉取请求,我们确保它通过了所有测试套件并默认启用。
阅读有关如何使用投影优化查询的示例 在我们的文档中。
当您使用 INSERT INTO TABLE FUNCTION
语句将数据导出到 file
、s3
或 hdfs
中,并且目标文件已存在时,您现在可以控制如何处理它:如果可以,您可以将新数据追加到文件中,用新数据重写它,或创建另一个具有类似名称的文件,例如“data.1.parquet.gz”。
某些存储系统(如 s3
)和某些格式(如 Parquet
)不支持数据追加。在以前的 ClickHouse 版本中,如果您多次插入带有 Parquet 数据格式的文件,您最终会得到其他系统无法识别的文件。现在,您可以在后续插入时选择抛出异常或创建更多文件。
因此,引入了新的设置
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
ReplicatedMergeTree
和 MergeTree
类型表实现了块级去重。当插入数据块时,会计算其密码哈希,如果之前已插入相同的块,则跳过重复项并插入查询成功。这使得能够为插入实现一次性语义。
在 ClickHouse 22.2 版本中,您可以提供自己的去重令牌,而不是自动计算的哈希。如果您已经从其他系统获得批处理标识符,并且想要重复使用它们,那么这样做是有意义的。当块可能相同但实际上应多次插入时,这样做也有意义。或者相反 - 当块包含一些随机数据时,您只想通过重要列进行去重。
这是通过添加设置 insert_deduplication_token
实现的。此功能由 Igor Nikonov 贡献。
一个小的 SQL 兼容性补充 - 现在我们允许在 INSERT INTO ... VALUES
语句中使用 DEFAULT
关键字代替值。看起来像这样
INSERT INTO test VALUES (1, 'Hello', DEFAULT)
感谢 Andrii Buriachevskyi 提供此功能。
表中的列可以具有 DEFAULT
表达式,例如 c INT DEFAULT a + b
。在 ClickHouse 中,如果您希望始终使用提供的表达式计算该列,而不是允许用户插入数据,您也可以使用 MATERIALIZED
代替 DEFAULT
。如果您不希望存储该列,而是希望在引用时动态计算该列,则可以使用 ALIAS
。
从 22.2 版本开始,添加了一种新的列类型:EPHEMERAL
列。用户可以向此列中插入数据,但该列不会存储在表中,它是短暂的。此列的目的是提供数据来计算其他列,这些列可以使用 DEFAULT
或 MATERIALIZED
表达式引用它。
此功能由 Yakov Olkhovskiy 制作。
您可以配置多个磁盘来存储 ClickHouse 数据,而不是管理 RAID,ClickHouse 将自动管理数据放置。
从 22.2 版本开始,ClickHouse 可以通过从副本下载缺失的部分并将它们放置在正常磁盘上,在不重启服务器的情况下自动修复损坏的磁盘。
此功能由 Amos Bird 实现,并且已经使用超过 1.5 年在快手生产环境中使用。
另一个改进是指定 TTL MOVE TO DISK/VOLUME IF EXISTS 的选项。它允许具有不均匀磁盘配置的副本,并且允许一个副本将旧数据移动到冷存储,而另一个副本将所有数据都放在热存储中。数据将仅移动到具有指定磁盘或卷的副本上,因此为 if exists。这是由 Anton Popov 开发的。
我们将每个查询和每个用户的内存限制拆分为一对硬限制和软限制。设置 max_memory_usage
和 max_memory_usage_for_user
充当硬限制。当内存消耗接近硬限制时,将抛出异常。另外两个设置:max_guaranteed_memory_usage
和 max_guaranteed_memory_usage_for_user
充当软限制。
如果存在可用内存,查询将被允许使用超过软限制的内存。但如果内存不足(相对于每个用户的硬限制或服务器总内存消耗),我们会计算“超额提交率”——每个查询相对于软限制消耗了多少额外内存——我们会杀死超额提交最多的查询,让其他查询运行。
简而言之,如果您有数百 GB 可用内存,您的查询不会被限制为几个 GB 的 RAM。
此实验性功能由 **Dmitry Novik** 实现,并且正在不断开发中。
现在我们允许以 #
或 #!
开头的注释,类似于 MySQL。带有 #!
的变体允许使用由 clickhouse-local
解释的“shebang”的 shell 脚本。
此功能由 **Aaron Katz** 贡献。非常棒。
Maxim Kita、Danila Kutenin、Anton Popov、zhanglistar、Federico Rodriguez、Raúl Marín、Amos Bird 和 Alexey Milovidov 为此版本贡献了大量的性能优化。和往常一样,我们痴迷于高性能。
阅读 22.2 版本的完整变更日志,并关注 路线图.