我们准备了新的 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 中最有趣的内容…
投影允许您在同一表中拥有多个数据表示形式。例如,您可以同时拥有数据聚合和原始数据。可以使用的聚合函数没有任何限制——您可以拥有 count distinct、分位数或任何您想要的功能。您可以拥有多种不同的排序顺序的数据。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
此功能由 Pavel Kruglov 开发。
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。带有 #!
的变体允许将带有 “shebang” 的 shell 脚本由 clickhouse-local
解释。
此功能由 Aaron Katz 贡献。非常棒。
Maxim Kita、Danila Kutenin、Anton Popov、zhanglistar、Federico Rodriguez、Raúl Marín、Amos Bird 和 Alexey Milovidov 为此版本贡献了大量的性能优化。像往常一样,我们对高性能非常着迷。
阅读 22.2 版本的完整更新日志,并关注 路线图。