目录
ClickHouse 发布 v23.11,2023-12-06
ClickHouse 发布 v23.10,2023-11-02
ClickHouse 发布 v23.9,2023-09-28
ClickHouse 发布 v23.8 LTS,2023-08-31
ClickHouse 发布 v23.7,2023-07-27
ClickHouse 发布 v23.6,2023-06-30
ClickHouse 发布 v23.5,2023-06-08
ClickHouse 发布 v23.4,2023-04-26
ClickHouse 发布 v23.3 LTS,2023-03-30
ClickHouse 发布 v23.2,2023-02-23
ClickHouse 发布 v23.1,2023-01-25
2022 年更新日志
ClickHouse 发布 23.12,2023-12-28。 演示文稿, 视频
向后不兼容变更
- 修复了对生存时间 (TTL) 表达式中非确定性函数的检查。此前,在某些情况下可以创建包含非确定性函数的生存时间 (TTL) 表达式,这可能会在后续导致未定义行为。此更改修复了 #37250。现在默认禁止不依赖表中任何列的生存时间 (TTL) 表达式。可通过
SET allow_suspicious_ttl_expressions = 1或SET compatibility = '23.11'重新启用。关闭了 #37286。#51858 (Alexey Milovidov). - MergeTree setting
clean_deleted_rows已弃用,现已不再生效。OPTIMIZE的CLEANUP关键字默认不允许使用 (可通过allow_experimental_replacing_merge_with_cleanup设置解锁) 。#58267 (Alexander Tokmakov)。此更改修复了 #57930,并关闭了 #54988、#54570、#50346 和 #47579。该功能必须移除,因为它存在设计问题,而且没有其他可行方案,因此需要尽快删除。#57932 (Alexey Milovidov).
新特性
- 实现了 Refreshable Materialized Views,这是 #33919 中提出的需求。#56946 (Michael Kolupaev、Michael Guzov) 。
- 引入
PASTE JOIN,允许用户仅按行号对表进行 join,而无需ON子句。示例:SELECT * FROM (SELECT number AS a FROM numbers(2)) AS t1 PASTE JOIN (SELECT number AS a FROM numbers(2) ORDER BY a DESC) AS t2。#57995 (Yarik Briukhovetskyi) 。 ORDER BY子句现已支持指定ALL,这表示 ClickHouse 会按SELECT子句中的所有列进行排序。示例:SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL。#57875 (zhongyuankai) 。- 新增了一个新的变更命令
ALTER TABLE <table> APPLY DELETED MASK,可强制应用轻量级删除写入的掩码,并从磁盘中移除被标记为已删除的行。#57433 (Anton Popov). - 处理器
/binary会打开一个用于查看 ClickHouse 可执行文件中符号的可视化界面。#58211 (Alexey Milovidov) 。 - 新增了一个用于生成 Sqids (https://sqids.org/) 的 SQL 函数
sqid,示例:SELECT sqid(125, 126)。#57512 (Robert Schulze) 。 - 新增函数
seriesPeriodDetectFFT,用于使用 FFT 检测序列周期。#57574 (Bhavna Jindal) 。 - 添加一个 HTTP 端点,用于检查 Keeper 是否已就绪并可接收流量。#55876 (Konstantin Bogdanov) 。
- 为 schema 推断新增 ‘union’ 模式。在此模式下,结果表的 schema 是所有文件 schema 的并集 (即会从每个文件分别推断 schema) 。schema 推断模式由设置
schema_inference_mode控制,可取两个值:default和union。关闭 #55428。#55892 (Kruglov Pavel) 。 - 新增设置
input_format_csv_try_infer_numbers_from_strings,允许在 CSV 格式中从字符串推断出数值。关闭了 #56455。#56859 (Kruglov Pavel) 。 - 当数据库或表的数量超过可配置的阈值时,向用户发出警告。 #57375 (凌涛).
- 采用
HASHED_ARRAY(以及COMPLEX_KEY_HASHED_ARRAY) 布局的字典现已像HASHED一样支持SHARDS分片。#57544 (vdimir) 。 - 新增用于统计主键总字节数以及内存中已分配主键总字节数的异步指标。#57551 (Bharat Nallan) 。
- 新增
SHA512_256函数。#57645 (Bharat Nallan) 。 - 新增
FORMAT_BYTES,作为formatReadableSize的别名。#57592 (Bharat Nallan) 。 - 允许向
s3表函数传入可选的会话令牌。#57850 (Shani Elharrar) 。 - 新增设置
http_make_head_request。关闭后,URL 表引擎将不会发送 HEAD 请求来确定文件大小。这是为支持低效、配置不当或不支持此功能的 HTTP 服务器所必需的。#54602 (Fionera). - 现在,在索引 (非主键) 定义中也可以引用 ALIAS 列了 (见问题 #55650) 。例如:
CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;。#57546 (Robert Schulze) 。 - 新增了一个设置
readonly,可用于将 S3 磁盘指定为只读。在s3_plain类型的磁盘上创建表时,即使对底层 S3 存储桶只有只读访问权限,这一设置也很有用。#57977 (Pengyuan Bian) 。 - MergeTree 表中的主键分析现在也会应用于包含虚拟列
_part_offset(可选同时包含_part) 的谓词。此功能可用作一种特殊的二级索引。#58224 (Amos Bird) 。
性能提升
- 在对 MergeTree 表执行 FINAL 处理时,提取不相交的 parts 范围。这样便可避免对这些不相交的 parts 范围额外应用 FINAL 逻辑。若具有相同主键的重复值较少,性能将几乎与不使用 FINAL 时相同。在设置
do_not_merge_across_partitions_select_final时,提升了 MergeTree FINAL 的读取性能。#58120 (Maksim Kita). - 在 s3 磁盘之间复制时,改为使用 s3 服务器端复制,而不是通过 buffer 进行复制。改进了
BACKUP/RESTORE操作和clickhouse-disks copy命令。#56744 (MikhailBurdukov) 。 - Hash JOIN 现会遵循设置
max_joined_block_size_rows,并且不会为ALL JOIN生成过大的块。 #56996 (vdimir). - 更早释放聚合所用内存。这可以避免不必要的外部聚合。#57691 (Nikolai Kochetov) 。
- 提升字符串序列化性能。#57717 (Maksim Kita) 。
- 支持
Merge引擎表的简单计数优化。#57867 (skyoct) 。 - 优化了某些情况下的聚合性能。#57872 (Anton Popov).
hasAny函数现在可以利用全文跳数索引了。#57878 (Jpnock).- 函数
if(cond, then, else)(及其别名cond ? then : else) 已优化为采用无分支求值。#57885 (zhanglistar) 。 - 如果分区键表达式仅包含主键表达式中的列,MergeTree 会自动确定
do_not_merge_across_partitions_select_final设置。#58218 (Maksim Kita) 。 - 提升原生类型上
MIN和MAX的性能。#58231 (Raúl Marín) 。 - 为文件系统缓存引入
SLRU缓存策略。#57076 (Kseniia Sumarokova) 。 - 用于后台拉取的每个端点的连接数上限已从
15提高到设置background_fetches_pool_size的值。- MergeTree 级别设置replicated_max_parallel_fetches_for_host已过时 - MergeTree 级别设置replicated_fetches_http_connection_timeout、replicated_fetches_http_send_timeout和replicated_fetches_http_receive_timeout已移至服务器级别。- 设置keep_alive_timeout已添加到服务器级别设置列表中。#57523 (Nikita Mikhaylov) 。 - 降低查询
system.filesystem_cache时的内存占用。#57687 (Kseniia Sumarokova). - 降低字符串反序列化时的内存占用。#57787 (Maksim Kita) 。
- 更高效的 Enum 构造函数——在 Enum 拥有大量取值时尤其有用。#57887 (Duc Canh Le) 。
- 改进了从文件系统缓存读取时的机制:始终使用
pread方法。#57970 (Nikita Taranov) 。 - 为逻辑 expression 优化器新增了对 AND notEquals 事件链的优化。此优化仅在启用 Experimental analyzer 时可用。#58214 (Kevin Mingtarja).
改进
- 支持 Keeper 的软内存限制。当内存使用量接近上限时,它将拒绝请求。#57271 (Han Fei). #57699 (Han Fei).
- 使向分布式表执行插入时能够正确处理已更新的集群配置。当集群节点列表发生动态更新时,分布式表的 Directory Monitor 会更新该列表。#42826 (zhongyuankai).
- 不允许创建 merge 参数不一致的复制表。#56833 (Duc Canh Le) 。
- 显示
system.tables中的未压缩大小。#56618。#57186 (Chen Lixiang) 。 - 为
Distributed表新增skip_unavailable_shards设置,其行为与对应的查询级设置类似。关闭 #43666。#57218 (Gagan Goel) 。 - 函数
substring(别名:substr、mid) 现在也可用于Enum类型。此前,该函数的第一个参数必须是String或FixedString类型的值。这提高了 Tableau 等第三方工具通过 MySQL interface 访问时的兼容性。#57277 (Serge Klochkov) 。 - 函数
format现在支持任意参数类型 (不再仅限于String和FixedString参数) 。这对于计算SELECT format('The {0} to all questions is {1}', 'answer', 42)非常重要。#57549 (Robert Schulze) 。 - 允许在
date_trunc函数中使用不区分大小写的第一个参数。现在两种写法都已受支持:SELECT date_trunc('day', now())和SELECT date_trunc('DAY', now())。#57624 (Yarik Briukhovetskyi) 。 - 当表不存在时,提供更明确的提示。#57342 (Bharat Nallan) 。
- 允许在查询时覆盖
max_partition_size_to_drop和max_table_size_to_drop这两个服务器级设置。#57452 (Jordi Villar) 。 - 在 JSON formats 中,对未命名元组的推断能力略有提升。#57751 (Kruglov Pavel) 。
- 新增了连接到 Keeper 时对 read-only 标志的支持 (修复了 #53749) 。#57479 (Mikhail Koviazin) 。
- 修复了因 “No such file or directory” (从磁盘恢复批次期间) 可能导致 Distributed 发送卡住的问题。修复了
system.distribution_queue中error_count可能出现的问题 (当distributed_directory_monitor_max_sleep_time_ms> 5 分钟时) 。新增用于跟踪 async INSERT 失败的 profile 事件:DistributedAsyncInsertionFailures。#57480 (Azat Khuzhin) 。 - 在
MaterializedPostgreSQL中支持 PostgreSQL 生成列和列默认值 (实验性功能) 。关闭 #40449。#57568 (Kseniia Sumarokova) 。 - 允许在无需重启服务器的情况下应用某些文件系统缓存配置更改。#57578 (Kseniia Sumarokova) 。
- 正确处理包含空数组的 PostgreSQL 表结构。#57618 (Mike Kot) 。
- 将自上次服务器重启以来发生的错误总数作为
ClickHouseErrorMetric_ALL指标对外暴露。#57627 (Nikita Mikhaylov) 。 - 允许在配置文件中使用带有
from_env/from_zk引用的节点,以及带有replace=1的非空元素。#57628 (Azat Khuzhin). - 新增表函数
fuzzJSON,可用于生成大量格式不正确的 JSON 以进行模糊测试。#57646 (Julia Kartseva) 。 - 允许将 IPv6 转换为 UInt128,并支持二元算术运算。#57707 (Yakov Olkhovskiy).
- 为
async inserts deduplication cache新增一个设置,用于指定等待缓存更新的时长。弃用设置async_block_ids_cache_min_update_interval_ms。现在仅在发生冲突时才会更新缓存。#57743 (alesapin). sleep()函数现在可通过KILL QUERY中止。#57746 (Vitaly Baranov) 。- 由于实验性
Replicated数据库不支持Replicated表引擎的CREATE TABLE ... AS SELECT查询,因此已禁止使用。参见 #35408。#57796 (Nikolay Degterinsky) 。 - 修复并改进面向外部数据库的查询转换,以递归获取所有兼容的谓词。#57888 (flynn).
- 支持动态重新加载文件系统缓存大小。修复了 #57866。#57897 (Kseniia Sumarokova).
- 正确支持对阻塞了 SIGRTMIN 的线程使用
system.stack_trace(这类线程可能出现在一些质量较差的外部库中,例如 Apache rdkafka) 。#57907 (Azat Khuzhin) 。此外,仅在线程未阻塞该信号时才向其发送信号,以避免在毫无意义的情况下等待storage_system_stack_trace_pipe_read_timeout_ms。#58136 (Azat Khuzhin) 。 - 在 quorum 插入检查中可容忍 Keeper 故障。#57986 (Raúl Marín)。
- 将最大/峰值 RSS (
MemoryResidentMax) 纳入 system.asynchronous_metrics。#58095 (Azat Khuzhin) 。 - 此 PR 允许你在使用 S3 风格链接 (
https://和s3://) 时不必指定区域,即使该区域不是默认区域也可以。此外,如果用户指定了错误的区域,还会自动识别出正确的区域。#58148 (Yarik Briukhovetskyi) 。 clickhouse-format --obfuscate现已识别 Settings、MergeTreeSettings 和时区,并保持其名称不变。#58179 (Alexey Milovidov) 。- 在
ZipArchiveWriter中新增了显式的finalize()函数,并简化了其中过于复杂的代码。此更改修复了 #58074。#58202 (Vitaly Baranov) 。 - 让具有相同路径的缓存共享同一个缓存对象。此前一直是这种行为,但在 23.4 中被破坏了。如果这类具有相同路径的缓存使用了不同的缓存设置组合,则会抛出异常,提示这是不允许的。#58264 (Kseniia Sumarokova).
- 并行副本 (Experimental 功能) :更易用的设置 #57542 (Igor Nikonov) 。
- 并行副本 (实验性功能) :通知响应处理改进 #57749 (Igor Nikonov).
- 并行副本 (实验性功能) :在
ParallelReplicasReadingCoordinator中更严格遵循min_number_of_marks#57763 (Nikita Taranov). - 并行副本 (Experimental 功能) :在使用 IN (子查询) 时禁用并行副本 #58133 (Igor Nikonov) 。
- 并行副本 (Experimental 功能) :新增 profile 事件 ‘ParallelReplicasUsedCount’ #58173 (Igor Nikonov) 。
- HEAD 等非 POST 请求将与 GET 一样为只读。 #58060 (San).
- 为
system.part_log新增bytes_uncompressed列 #58167 (Jordi Villar) 。 - 向
system.backups和system.backup_log表中添加基础备份名称 #58178 (Pradeep Chhetri) 。 - clickhouse-local 新增支持通过命令行指定查询参数 #58210 (Pradeep Chhetri) 。
构建/测试/打包改进
- 对更多设置进行随机化处理 #39663 (Anton Popov).
- 在 CI 中对已禁用的优化项进行随机化处理 #57315 (Raúl Marín).
- 允许在 macOS 上使用与 Azure 相关的表引擎/函数。#51866 (Alexey Milovidov).
- ClickHouse 快速测试现已改用 Musl 而非 GLibc。#57711 (Alexey Milovidov). 可从 CI 下载完全静态链接的 Musl 构建版本。
- 每次提交都会运行 ClickBench。这修复了 #57708。#57712 (Alexey Milovidov).
- 移除了外部库中有害的 C/POSIX
select函数用法。#57467 (Igor Nikonov). - 为方便使用,原本仅在 ClickHouse Cloud 中可用的设置也将出现在开源版 ClickHouse 构建中。#57638 (Nikita Mikhaylov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了 TTL GROUP BY 中排序顺序可能发生错乱的问题 #49103 (Nikita Mikhaylov).
- 修复:拆分
lttb分桶策略时,首个桶和最后一个桶都应只包含一个点 #57003 (FFish). - 修复了发生 error 后同步过程中
Templateformat 可能出现的死锁问题 #57004 (Kruglov Pavel) 。 - 修复了解析文件时在跳过大量错误后过早停止的问题 #57006 (Kruglov Pavel).
- 防止通过
dictionary表函数绕过字典 ACL #57362 (Salvatore Mesoraca) 。 - 修复了由 Fuzzer 发现的另一种“non-ready set”错误。#57423 (Nikolai Kochetov) 。
- 修复了 PostgreSQL
array_ndims用法中的多个问题。#57436 (Ryan Jacobs) 。 - 修复写锁超时后 RWLock 状态不一致的问题 #57454 (Vitaly Baranov)。再次修复写锁超时后 RWLock 状态不一致的问题 #57733 (Vitaly Baranov)。
- 修复:在构建向视图链推送时,不应排除临时列 #57461 (Yakov Olkhovskiy).
- MaterializedPostgreSQL (Experimental 问题) :修复 #41922 问题,为 #41923 添加测试 #57515 (Kseniia Sumarokova) 。
- 在管理复制访问实体时,忽略 grant/revoke 查询中的 ON CLUSTER 子句。 #57538 (MikhailBurdukov).
- 修复
clickhouse-local崩溃问题 #57553 (Nikolay Degterinsky) 。 - 修复了 Hash JOIN 的问题。#57564 (vdimir) 。
- 修复 PostgreSQL 源中可能存在的错误 #57567 (Kseniia Sumarokova) 。
- 修复 Hash JOIN 处理中嵌套 LowCardinality 时的类型修正问题。#57614 (vdimir) 。
- 通过正确禁止并行读取
system.stack_trace,避免其发生卡死。#57641 (Azat Khuzhin). - 修复了对稀疏列进行
any(...) RESPECT NULL聚合时出现的错误 #57710 (Azat Khuzhin) 。 - 修复一元运算符的解析问题 #57713 (Nikolay Degterinsky) 。
- 修复 Experimental 表引擎
MaterializedPostgreSQL的依赖加载问题。#57754 (Kseniia Sumarokova) 。 - 修复了已断开连接节点在 BACKUP/RESTORE ON CLUSTER 中的重试问题 #57764 (Vitaly Baranov) 。
- 修复投影仅部分物化时外部聚合结果异常的问题 #57790 (Anton Popov).
- 修复使用
*Map组合器的聚合函数中的合并问题 #57795 (Anton Popov). - 由于存在一个 bug,禁用
system.kafka_consumers。#57822 (Azat Khuzhin) 。 - 修复 Merge JOIN 对 LowCardinality 键的支持问题。#57827 (vdimir) 。
- 修复了
InterpreterCreateQuery中与样本块相关的问题。#57855 (Maksim Kita) 。 - PostgreSQL 的 named collections 会忽略
addresses_expr。#57874 (joelynch) 。 - 修复了 BLAKE3 (Rust) 中的无效内存访问问题 #57876 (Raúl Marín) 。随后,又为提升内存安全性,将其从 Rust 重写为 C++。#57994 (Raúl Marín) 。
- 统一
CREATE INDEX中的函数名称 #57906 (Alexander Tokmakov) 。 - 修复了在首次请求发生前对不可用副本处理不当的问题 #57933 (Nikita Taranov).
- 修复将字面量别名误分类的问题 #57988 (Chen768959).
- 修复 Keeper 中无效的预处理问题 #58069 (Antonio Andelic) 。
- 修复
Poco库中与UTF32Encoding相关的整数溢出 #58073 (Andrey Fedotov) 。 - 修复了在存在带有大整数值的标量子查询时,并行副本 (Experimental 功能) 的问题 #58118 (Alexey Milovidov) 。
- 修复
accurateCastOrNull在超出范围的DateTime上的问题 #58139 (Andrey Zvonov). - 修复从 MergeTree 的宽格式分片读取子列时可能触发的
PARAMETER_OUT_OF_BOUND错误 #58175 (Kruglov Pavel) 。 - 修复了在包含海量子查询时 CREATE VIEW 变慢的问题 #58220 (Tao Wang).
- 修复 JSONCompactEachRow 的并行解析问题 #58181 (Alexey Milovidov). #58250 (Kruglov Pavel).
ClickHouse 发布 23.11,2023-12-06。 演示文稿, 视频
向后不兼容变更
- ClickHouse server 的默认配置文件现已默认对
default用户启用access_management(通过 SQL 查询进行用户管理) 和named_collection_control(通过 SQL 查询管理 named collection) 。这解决了 #56482。#56619 (Alexey Milovidov) 。 - 对窗口函数的
RESPECT NULLS/IGNORE NULLS进行了多项改进。如果你将它们当作聚合函数使用,并存储带有这些修饰符的聚合函数状态,则这些状态可能会变得不兼容。#57189 (Raúl Marín) 。 - 移除了优化
optimize_move_functions_out_of_any。#57190 (Raúl Marín) 。 - 函数
parseDateTime中的格式说明符%l/%k/%c现在可以解析不带前导零的小时/月,例如select parseDateTime('2023-11-26 8:14', '%F %k:%i')现在已可正常工作。将parsedatetime_parse_without_leading_zeros = 0可恢复为此前要求两位数字的行为。函数formatDateTime现在也可以输出不带前导零的小时/月。这由设置formatdatetime_format_without_leading_zeros控制,但默认关闭,以免破坏现有用例。#55872 (Azat Khuzhin) 。 - 你将无法再把聚合函数
avgWeighted用于Decimal类型参数。变通方法:将参数转换为Float64。这解决了 #43928。这解决了 #31768。这解决了 #56435。如果你曾在 materialized views 或 projections 中使用带有Decimal参数的此函数,请联系 support@clickhouse.com。修复了聚合函数sumMap中的错误,但其速度也因此降低了约 1.5 到 2 倍。不过这无关紧要,因为这个函数本来就很差。这解决了 #54955。这解决了 #53134。这解决了 #55148。修复了函数groupArraySample中的一个错误——当一个查询中生成多个聚合状态时,它会使用相同的随机种子。#56350 (Alexey Milovidov) 。
新特性
- 新增服务器设置
async_load_databases,用于异步加载数据库和表,可加快服务器启动速度。适用于使用Ordinary、Atomic和Replicated引擎的数据库,其表元数据会以异步方式加载。对表发起查询时,会提高加载作业的优先级并等待其完成。新增用于内部信息查看的表system.asynchronous_loader。#49351 (Sergei Trifonov) 。 - 新增系统表
blob_storage_log。该表可用于审计写入 S3 和其他对象存储的所有数据。#52918 (vdimir). - 使用统计信息,更合理地对 prewhere 条件进行排序。#53240 (Han Fei) 。
- 为 Keeper 协议新增了压缩支持。可在 ClickHouse 端的
zookeeper部分中使用use_compression标志来启用。请注意,只有 ClickHouse Keeper 支持压缩,Apache ZooKeeper 不支持。解决了 #49507。#54957 (SmitaRKulkarni) 。 - 引入功能
storage_metadata_write_full_object_key。如果将其设置为true,元数据文件将按新格式写入。采用该格式后,ClickHouse 会在元数据文件中存储远程对象的完整 key,从而带来更好的灵活性和优化空间。#55566 (Sema Checherinda). - 新增了设置和语法,以防止 named collections 的字段被覆盖。此举旨在防止恶意用户未获授权访问敏感信息。#55782 (Salvatore Mesoraca) 。
- 为所有系统日志表添加
hostname列——如果将系统表设置为复制、共享或分布式,这会很有用。#55894 (Bharat Nallan) 。 - 新增
CHECK ALL TABLES查询。#56022 (vdimir) 。 - 新增函数
fromDaysSinceYearZero,其作用与 MySQL 的FROM_DAYS类似。例如,SELECT fromDaysSinceYearZero(739136)将返回2023-09-08。#56088 (Joanna Hulboj) 。 - 新增了一个外部 Python 工具,可在不使用 ClickHouse 的情况下查看备份并从中提取信息。#56268 (Vitaly Baranov) 。
- 新增一个名为
preferred_optimize_projection_name的设置。如果将其设为非空字符串,则会在可能的情况下使用指定的投影,而不是从所有候选项中选择。#56309 (Yarik Briukhovetskyi) 。 - 新增用于主动让出/辞去 leader 角色的 4 字母命令 (https://github.com/ClickHouse/ClickHouse/issues/56352) 。#56354 (Pradeep Chhetri)。#56620 (Pradeep Chhetri)。
- 新增了一个 SQL 函数
arrayRandomSample(arr, k),可从输入数组中返回一个包含 k 个元素的样本。此前,类似功能只能通过不太便捷的语法实现,例如SELECT arrayReduce('groupArraySample(3)', range(10))。#56416 (Robert Schulze) 。 - 新增支持在
.npy文件中使用Float16类型数据。关闭 #56344。#56424 (Yarik Briukhovetskyi) 。 - 新增系统视图
information_schema.statistics,以便更好地兼容 Tableau Online。#56425 (Serge Klochkov) 。 - 新增了
system.symbols表,可用于检查二进制文件的内部信息。#56548 (Alexey Milovidov) 。 - 可配置的仪表盘。图表查询现已通过查询方式加载,默认使用新的
system.dashboards表。#56771 (Sergei Trifonov) 。 - 新增
fileCluster表函数——如果将共享文件系统 (如 NFS) 挂载到user_files目录,它就会很有用。#56868 (Andrey Zvonov) 。 - 为
s3/file/hdfs/url/azureBlobStorage引擎添加_size虚拟列,用于表示以字节为单位的文件大小。#57126 (Kruglov Pavel) 。 - 通过 Prometheus 端点暴露服务器自上次重启以来各错误代码对应的错误次数。#57209 (Nikita Mikhaylov) 。
- ClickHouse Keeper 会在
/keeper/availability-zone路径中报告其当前运行所在的可用区。可通过<availability_zone><value>us-west-1a</value></availability_zone>进行配置。#56715 (Jianfei Hu) 。 - 将 ALTER materialized_view MODIFY QUERY 取消 Experimental 状态,并弃用
allow_experimental_alter_materialized_view_structure设置。修复 #15206。#57311 (alesapin) 。 - 设置
join_algorithm时会遵循指定顺序 #51745 (vdimir) 。 - 在 Protobuf 格式中增加了对众所周知的 Protobuf 类型的支持。#56741 (János Benjamin Antal) 。
性能提升
- 与 S3 交互时的自适应超时时间。首次尝试会使用较短的发送和接收超时时间。#56314 (Sema Checherinda).
- 将
max_concurrent_queries的默认值从 100 提高到 1000。当有大量客户端连接,且它们以较慢速度发送或接收数据,因此 server 不受 CPU 限制时,或者当 CPU 核心数超过 100 时,这样设置是合理的。此外,默认启用并发控制,并将查询处理线程的目标总数设置为 CPU 核心数的两倍。这提升了在并发查询数量非常多的场景下的性能。 #46927 (Alexey Milovidov). - 支持窗口函数并行执行。修复了 #34688。#39631 (Dmitry Novik) 。
Numbers表引擎 (即system.numbers表所使用的引擎) 现在会分析条件,只生成所需的数据子集,类似于表索引的作用。#50909 (JackyWoo) 。- 优化了
Merge表引擎中IN (...)条件过滤的性能。#54905 (Nikita Taranov) 。 - 当文件系统缓存已满且发生大块读取时的一项改进。#55158 (Kseniia Sumarokova) 。
- 新增了可禁用 S3 校验和的功能,以避免对文件进行额外的多次扫描 (由设置
s3_disable_checksum控制) 。#55559 (Azat Khuzhin) 。 - 现在,当数据已在页缓存中时,我们会像处理本地表一样,以同步方式从远程表读取数据。这样速度更快,无需在线程池内部进行同步,在本地 FS 上执行
seek操作也不会成为负担,还能减少 CPU 等待时间。#55841 (Nikita Taranov) 。 - 针对从
map、arrayElement中获取值进行了优化。可带来约 30% 的性能提升。- 减少预留内存 - 减少resize调用。#55957 (lgbo). - 使用 AVX-512 优化多阶段过滤。在 ICX 设备 (Intel Xeon Platinum 8380 CPU,80 核,160 线程) 上对 OnTime 数据集进行的性能实验表明,此项变更可分别将查询 Q2、Q3、Q4、Q5 和 Q6 的 QPS 提升 7.4%、5.9%、4.7%、3.0% 和 4.6%,对其他查询则没有影响。#56079 (Zhiguo Zhou) 。
- 限制查询分析器内处于忙碌状态的线程数量。超过该数量的线程将跳过性能分析。 #56105 (Alexey Milovidov) 。
- 减少 window function 中的虚函数调用次数。#56120 (Maksim Kita) 。
- 支持在 ORC 数据格式中对 Tuple 字段进行递归裁剪,以加快扫描速度。#56122 (李扬) 。
- 针对
Npy数据格式的简单 count 优化:像select count() from 'data.npy'这样的查询会因结果缓存而快得多。#56304 (Yarik Briukhovetskyi). - 带有聚合且流数量较多的查询在构建执行计划期间会占用更少的内存。#57074 (Alexey Milovidov) 。
- 通过优化对 ProcessList 的访问,提升了多用户且查询高度并发 (>2000 QPS) 场景下的查询执行性能。#57106 (Andrej Hoos) 。
- 对 array join 做了小幅优化,复用了一些中间结果。#57183 (李扬).
- 某些情况下,堆栈回溯过去比较慢,现在已经不是问题了。#57221 (Alexey Milovidov) 。
- 现在,当
max_streams = 1时,我们会使用默认读取池从外部存储中读取数据。在启用读取预取时,这样做更有利。#57334 (Nikita Taranov) 。 - Keeper 改进:通过延后日志预处理,优化启动期间的内存占用。#55660 (Antonio Andelic) 。
- 优化了
File和HDFS存储的通配符匹配性能。#56141 (Andrey Zvonov) 。 - Experimental 全文索引中的倒排列表现已支持压缩,体积可缩小 10-30%。#56226 (Harry Lee) 。
- 将备份中的
BackupEntriesCollector并行化。#56312 (Kseniia Sumarokova) 。
改进
- 新增
MergeTree设置add_implicit_sign_column_constraint_for_collapsing_engine(默认禁用) 。启用后,会为CollapsingMergeTree表添加隐式 CHECK 约束,将Sign列的值限制为仅可取 -1 或 1。#56701。#56986 (Kevin Mingtarja) 。 - 支持在不重启的情况下向存储配置中添加新磁盘。#56367 (Duc Canh Le) 。
- 支持在同一条 ALTER 查询中创建并物化索引,也支持在同一条查询中执行 “modify TTL” 和 “materialize TTL”。已关闭 #55651。#56331 (flynn) 。
- 新增一个名为
fuzzJSON的表函数,其各行包含对源 JSON 字符串施加随机扰动后生成的变体。#56490 (Julia Kartseva) 。 Merge引擎会根据底层表的行策略对记录进行过滤,因此无需在Merge表上另外创建行策略。#50209 (Ilya Golshtein) 。- 添加设置
max_execution_time_leaf,用于限制分布式查询在分片上的执行时间;添加timeout_overflow_mode_leaf,用于控制超时时的行为。#51823 (Duc Canh Le). - 新增 ClickHouse 设置,用于禁用通过 HTTP 代理发起 HTTPS 请求时的隧道传输。#55033 (Arthur Passos) 。
- 将
background_fetches_pool_size设置为 16,将 background_schedule_pool_size 设置为 512,这更适合生产环境中频繁的小批量插入场景。#54327 (Denny Crane) 。 - 在从
CSV format文件读取数据时,如果行尾是\r,且后面没有跟\n,就会遇到如下异常:Cannot parse CSV format: found \r (CR) not followed by \n (LF). Line must end by \n (LF) or \r\n (CR LF) or \n\r.。在 ClickHouse 中,CSV 的行结束符必须是\n、\r\n或\n\r,因此\r后面必须跟着\n;但在某些情况下,输入的 CSV 数据可能不符合规范,例如上述\r位于行尾的情况。#54340 (KevinyhZou). - 将 Arrow 库升级到支持新编码的 release-13.0.0 版本。关闭 #44505。#54800 (Kruglov Pavel) 。
- 通过移除在 DDL 条目主机列表中查找本地 IP 地址时,为获取所有网络接口而执行的高开销系统调用,提升了 ON CLUSTER 查询的性能。#54909 (Duc Canh Le).
- 修复了将线程关联到查询或用户之前所分配内存的统计问题。#56089 (Nikita Taranov) 。
- 在 Apache Arrow 格式中添加了对
LARGE_LIST的支持。#56118 (edef) 。 - 允许通过
OPTIMIZE查询手动对EmbeddedRocksDB执行合并整理。#56225 (Azat Khuzhin). - 为
EmbeddedRocksDB表新增了指定 BlockBasedTableOptions 的功能。#56264 (Azat Khuzhin) 。 - 现在,当通过 MySQL 协议建立连接时,
SHOW COLUMNS会显示 MySQL 对应的数据类型名称。此前,只有在设置use_mysql_types_in_show_columns = 1时才会这样。该设置仍然保留,但已废弃。 #56277 (Robert Schulze). - 修复了这样一个可能出现的错误:如果在执行
TRUNCATE或DROP PARTITION后立即重启服务器,可能会报出The local set of parts of table doesn't look like the set of parts in ZooKeeper。#56282 (Alexander Tokmakov). - 修复了函数
formatQuery/formatQuerySingleLine对非常量查询字符串的处理问题。还为这两个函数新增了OrNull变体:当查询无法解析时,会返回 NULL,而不是抛出异常。#56327 (Robert Schulze). - 允许备份内部表已被删除的 materialized view,而不是直接导致备份失败。#56387 (Kseniia Sumarokova).
- 查询
system.replicas时,如果涉及某些列,会向 ZooKeeper 发起请求。当表达到数千个时,这些请求可能会给 ZooKeeper 带来相当大的负载。如果同时有多个对system.replicas的查询,就会多次发出相同的请求。这项变更旨在对并发查询发出的请求进行“去重”。#56420 (Alexander Gololobov) 。 - 修复了将外部数据库查询转换为兼容 MySQL 的查询时的问题。#56456 (flynn).
- 新增了对使用
KeeperMapengine 备份和还原表的支持。#56460 (Antonio Andelic) 。 - 对于 CompleteMultipartUpload 返回的 404 响应,需要重新确认。即使客户端出现超时或其他网络错误,操作也可能已经在服务器端完成。之后再次重试 CompleteMultipartUpload 时会收到 404 响应。如果对象 key 存在,则该操作视为成功。#56475 (Sema Checherinda) 。
- 默认启用 HTTP OPTIONS 方法,这样从 Web 浏览器请求 ClickHouse 会更方便。#56483 (Alexey Milovidov) 。
dns_max_consecutive_failures的值曾在 #46550 中被误改——现已撤销该更改,并调整为更合适的值。此外,还将 HTTP keep-alive timeout 提高到了生产环境中较为合理的值。#56485 (Alexey Milovidov) 。- 按需惰性加载基础备份 (仅在需要时才会加载基础备份) 。此外,还为备份添加了一些日志信息和 profile events。 #56516 (Vitaly Baranov).
- 设置
query_cache_store_results_of_queries_with_nondeterministic_functions(取值为false或true) 已被标记为已过时。该设置已由query_cache_nondeterministic_function_handling取代;后者是一个三值枚举,用于控制查询缓存如何处理包含非确定性函数的查询:a) 抛出异常 (默认行为) ,b) 无论如何都保存非确定性查询结果,或 c) 忽略,即不抛出异常,也不缓存结果。#56519 (Robert Schulze) 。 - 在 JOIN ON 部分中,将等值条件重写为带有
is null检查的形式。Experimental 仅限 analyzer。#56538 (vdimir). - 函数
concat现在支持任意类型的参数 (不再仅限于 String 和 FixedString 参数) 。这样一来,它的行为更接近 MySQL 对concat的实现。例如,SELECT concat('ab', 42)现在会返回ab42。#56540 (Serge Klochkov) 。 - 支持从配置中的 ‘named_collection’ 部分或通过 SQL 创建的命名集合中获取缓存配置。#56541 (Kseniia Sumarokova).
- PostgreSQL 数据库引擎:在 postgres 连接失败时,减少对过期表删除操作的激进性。#56609 (jsc0218).
- 当 URL 不正确时,连接到 PG 会耗费过长时间,导致相关查询卡在那里,随后被取消。#56648 (jsc0218) 。
- Keeper 改进:默认在 Keeper 中禁用压缩日志。#56763 (Antonio Andelic) 。
- 新增配置项
wait_dictionaries_load_at_startup。#56782 (Vitaly Baranov) 。 - 早期版本的 ClickHouse 中存在一个潜在漏洞:如果某个用户已建立连接,并尝试使用 “interserver secret” 方法进行身份验证但未成功,服务器不会立即终止该连接,而是会继续接收并忽略来自客户端的剩余数据包。虽然这些数据包会被忽略,但仍会被解析;如果它们使用了另一种存在已知漏洞的压缩方法,就可能在无需身份验证的情况下利用该漏洞。该问题由 https://twitter.com/malacupa 通过 ClickHouse Bug Bounty Program 发现。#56794 (Alexey Milovidov).
- 当某个 part 在远程副本上完全提交后,拉取该 part 会等待。最好不要发送处于 PreActive 状态的 part。对于零拷贝,这是一个强制限制。#56808 (Sema Checherinda) 。
- 修复了在使用 Experimental
MaterializedPostgreSQL时可能出现的 PostgreSQL 逻辑复制转换错误。#53721 (takakawa). - 实现了用户级设置
alter_move_to_space_execute_async,可异步执行查询ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME。后台执行线程池的大小由background_move_pool_size控制。默认行为是同步执行。修复了 #47643。#56809 (alesapin) 。 - 扫描 system.tables 时可按引擎进行过滤,从而避免不必要的 (且可能非常耗时的) 连接操作。#56813 (jsc0218).
- 在 RocksDB 存储的系统表中显示
total_bytes和total_rows。#56816 (Aleksandr Musorin) 。 - 允许在 TEMPORARY 表的 ALTER 语句中使用基本命令。#56892 (Sergey) 。
- LZ4 压缩。在极少数情况下,如果 out 缓冲区容量不足,无法将压缩块直接写入其缓冲区,则先将压缩块暂存到缓冲区中。#56938 (Sema Checherinda).
- 新增了用于统计队列中作业数量的指标,这对 IO 线程池很有帮助。#56958 (Alexey Milovidov).
- 在配置文件中新增了 PostgreSQL table engine 的相关设置。新增了对此设置的检查,并补充了该附加设置的相关文档。#56959 (Peignon Melvyn) 。
- 函数
concat现在支持仅用一个参数调用,例如SELECT concat('abc')。这使其行为与 MySQL 中 concat 的实现更加一致。#57000 (Serge Klochkov). - 按 AWS S3 文档要求,对所有
x-amz-*请求头进行签名。#57001 (Arthur Passos) 。 - 函数
fromDaysSinceYearZero(别名:FROM_DAYS) 现在可用于无符号和有符号整数类型 (此前仅支持无符号整数) 。这提升了与 Tableau Online 等第三方工具的兼容性。#57002 (Serge Klochkov) 。 - 在默认配置中加入
system.s3queue_log。#57036 (Kseniia Sumarokova) 。 - 将
wait_dictionaries_load_at_startup的默认值改为 true,并且仅当dictionaries_lazy_load为 false 时才使用此设置。#57133 (Vitaly Baranov) 。 - 即使启用了
dictionaries_lazy_load,也会在创建时检查字典源类型。#57134 (Vitaly Baranov) 。 - 现在可以单独启用/禁用计划级优化。此前只能将其全部禁用。此前用于此用途的设置 (
query_plan_enable_optimizations) 已被保留,仍可用于禁用所有优化。#57152 (Robert Schulze) 。 - server 的退出码将与异常码对应。例如,如果 server 因内存限制而无法启动,将以代码 241 = MEMORY_LIMIT_EXCEEDED 退出。在之前的版本中,异常的退出码始终为 70 = Poco::Util::ExitCode::EXIT_SOFTWARE。#57153 (Alexey Milovidov) 。
- 不要对来自
functionalC++ 头文件的栈帧进行反混淆和符号化。#57201 (Mike Kot) 。 - HTTP 服务器的
/dashboard页面现在支持多条折线的图表。#57236 (Sergei Trifonov) 。 - 命令行选项
max_memory_usage_in_client支持带后缀 (K、M、G 等) 的字符串值。已关闭 #56879。#57273 (Yarik Briukhovetskyi) 。 - 将 Intel QPL (由
DEFLATE_QPL编解码器使用) 从 v1.2.0 升级至 v1.3.1。另修复了 BOF (Block On Fault) = 0 时的一个问题,改为在发生缺页故障时回退到软件路径进行处理。#57291 (jasperzhu) 。 - 将 MergeTree Settings 中默认的
replicated_deduplication_window从 100 提高到 1k。#57335 (sichenzhao) 。 - 减少使用
INCONSISTENT_METADATA_FOR_BACKUP。如果可以,尽量继续扫描,而不是停止后再从头开始扫描备份。#57385 (Vitaly Baranov) 。
构建/测试/打包改进
- 添加 SQLLogic 测试。#56078 (Han Fei) 。
- 为提升易用性,使
clickhouse-local和clickhouse-client支持短名称 (ch、chl、chc) 。#56634 (Alexey Milovidov) 。 - 通过移除外部库中的未使用代码,进一步减小构建体积。#56786 (Alexey Milovidov) 。
- 添加自动检查,确保不存在过大的编译单元。#56559 (Alexey Milovidov) 。
- 减小单一二进制发行版的体积。此更改关闭了 #55181。#56617 (Alexey Milovidov) 。
- 每次构建后,都会将各个编译单元和二进制文件的大小信息发送到 ClickHouse Cloud 中的 CI 数据库。此更改关闭了 #56107。#56636 (Alexey Milovidov) 。
- “Apache Arrow” 库中的某些文件 (我们仅将其用于一些非关键功能,例如解析 Arrow format) 此前无论构建缓存状态如何都会反复重建。现已修复。#56657 (Alexey Milovidov) 。
- 避免重新编译依赖自动生成的版本源文件的编译单元。#56660 (Alexey Milovidov) 。
- 链接器调用的跟踪数据将发送到 ClickHouse Cloud 中的 CI 数据库。#56725 (Alexey Milovidov) 。
- 为
clickhouse可执行文件使用 DWARF 5 调试符号 (此前为 DWARF 4) 。#56770 (Michael Kolupaev) 。 - 添加新的构建选项
SANITIZE_COVERAGE。启用后,将对代码进行插桩以跟踪覆盖率。采集到的信息可在 ClickHouse 内通过以下方式获取: (1) 新增函数coverage,返回自上次重置覆盖率以来在代码中发现的唯一地址数组; (2) 使用SYSTEM RESET COVERAGE查询重置累计数据。这使我们能够比较不同测试的覆盖率,包括差异化代码覆盖率。这是 #20539 的后续工作。#56102 (Alexey Milovidov) 。 - 在收集调用栈时,某些栈帧可能无法解析。在这种情况下,原始地址可能会有所帮助。#56267 (Alexander Gololobov) 。
- 添加可禁用
libssh的选项。#56333 (Alexey Milovidov) 。 - 在 CI 的 S3 测试中启用 temporary_data_in_cache。#48425 (vdimir) 。
- 在 CI 中为
clickhouse-client设置最大内存使用量 (1G) 。#56873 (Nikita Mikhaylov) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复实验性 analyzer——在从
select插入时,如果子查询引用了插入目标表,则应仅处理插入块。#50857 (Yakov Olkhovskiy) 。 - 修复了
str_to_map函数中的一个缺陷。#56423 (Arthur Passos) 。 - Keeper
reconfig:在让出/接任 leader 之前添加 timeout #53481 (Mike Kot) 。 - 修复 grace hash join 和过滤器下推中的错误请求头 #53922 (vdimir).
- 当表基于表函数时,支持从系统表中查询。 #55540 (MikhailBurdukov).
- RFC:修复带有 LIMIT BY 的分布式查询中“在源流中找不到列 X”的问题 #55836 (Azat Khuzhin).
- 修复客户端在后台运行时出现的 ‘Cannot read from file:’ 问题 #55976 (Kruglov Pavel).
- 修复了
send_logs_level设置不当时 clickhouse-local 退出的问题 #55994 (Kruglov Pavel). - 修复 EXPLAIN AST 在参数化视图中的问题 #56004 (SmitaRKulkarni).
- 修复了启动时加载表期间发生的崩溃问题 #56232 (Nikolay Degterinsky).
- 修复了带显式查询的 ClickHouse 源字典的问题 #56236 (Nikolay Degterinsky) 。
- 修复 Keeper 信号处理函数中的段错误 #56266 (Antonio Andelic) 。
- 修复
view()函数中 UNION 查询结果不完整的问题。#56274 (Nikolai Kochetov) 。 - 修复 “cast(‘0’ as DateTime64(3))” 与 “cast(‘0’ as Nullable(DateTime64(3)))” 之间不一致的问题 #56286 (李扬).
- 修复了与内存分配失败相关的罕见竞态条件 #56303 (alesapin).
- 修复了在使用
flatten_nested和data_type_default_nullable时从备份中恢复的问题 #56306 (Kseniia Sumarokova). - 修复了添加
Object(JSON)类型列时发生崩溃的问题 #56307 (Nikita Mikhaylov). - 修复 filterPushDown 中发生的崩溃 #56380 (vdimir) 。
- 修复了从备份中恢复带有物化视图且源表已删除的数据时的问题 #56383 (Kseniia Sumarokova).
- 修复 Kerberos 初始化期间发生的段错误 #56401 (Nikolay Degterinsky) 。
- 修复 T64 中的缓冲区溢出 #56434 (Alexey Milovidov) 。
- 修复 FINAL 中 Nullable 主键的问题 (2) #56452 (Amos Bird) 。
- 修复初始节点上未指定数据库的 ON CLUSTER 查询问题 #56484 (Nikolay Degterinsky) 。
- 修复因生存时间 (TTL) 依赖问题导致的启动失败 #56489 (Nikolay Degterinsky).
- 修复 ALTER COMMENT ON CLUSTER 查询 #56491 (Nikolay Degterinsky) 。
- 修复带有 ALIAS 的 ALTER COLUMN 问题 #56493 (Nikolay Degterinsky) 。
- 修复空 NAMED COLLECTIONs 的问题 #56494 (Nikolay Degterinsky) 。
- 修复了投影分析中的两处问题。#56502 (Amos Bird) 。
- 修复查询缓存中别名处理的问题 #56545 (Robert Schulze).
- 修复
Nullable(Enum)到Nullable(String)的转换问题 #56644 (Nikolay Degterinsky) 。 - 改进 Keeper 中日志处理的可靠性 #56670 (Antonio Andelic) 。
- 修复带有替换属性的节点在配置合并中的问题 #56694 (Konstantin Bogdanov) 。
- 修复表函数 input() 被重复使用的问题。#56695 (Nikolai Kochetov) 。
- 修复:RabbitMQ OpenSSL 动态加载问题 #56703 (Igor Nikonov) 。
- 修复了数据中存在零时 GCD 编解码器崩溃的问题 #56704 (Nikita Mikhaylov).
- 修复 clickhouse-local 在对 function 执行 insert 时出现的 ‘mutex lock failed: Invalid argument’ 问题 #56710 (Kruglov Pavel).
- 修复了 optimistic path 中 Date 文本解析问题 #56765 (Kruglov Pavel) 。
- 修复 FPC codec 中的崩溃 #56795 (Alexey Milovidov) 。
- DatabaseReplicated:修复了副本恢复后 DDL 查询超时的问题 #56796 (Alexander Tokmakov) 。
- 修复 MySQL 二进制协议中可空列信息报告错误的问题 #56799 (Serge Klochkov) 。
- 支持 metastore 表的 Iceberg 元数据文件 #56810 (Kruglov Pavel).
- 修复 transform 中的 TSAN 报告问题 #56817 (Raúl Marín) 。
- 修复 SET 查询和 SETTINGS 的格式 #56825 (Nikolay Degterinsky).
- 修复了因 joinGet 中的表依赖导致无法启动的问题 #56828 (Nikolay Degterinsky) 。
- 修复在 ADD COLUMN 时对现有 Nested 列进行扁平化的问题 #56830 (Nikolay Degterinsky).
- 修复了 CSV 行尾允许使用 CR 的问题 #56901 (KevinyhZou) 。
- 修复
tryBase64Decode处理无效输入时的问题 #56913 (Robert Schulze) 。 - 修复了在 CapnProto/Protobuf schema 中生成深层嵌套列的问题 #56941 (Kruglov Pavel) 。
- 防止对投影列执行不兼容的 ALTER #56948 (Amos Bird).
- 修复 SQLite 文件路径验证问题 #56984 (San) 。
- S3Queue:修复元数据引用计数递增问题 #56990 (Kseniia Sumarokova) 。
- S3Queue 小修复 #56999 (Kseniia Sumarokova) 。
- 修复 DatabaseFileSystem 的文件路径校验问题 #57029 (San).
- 修复
fuzzBits在与ARRAY JOIN一起使用时的问题 #57033 (Antonio Andelic) 。 - 修复 partial merge join 中 joined_subquery_re… 导致的 Nullptr 解引用问题。 #57048 (vdimir).
- 修复 RemoteSource 中的竞态条件 #57052 (Raúl Marín) 。
- 为大整数实现
bitHammingDistance#57073 (Alexey Milovidov) 。 - S3 风格链接问题修复 #57075 (Yarik Briukhovetskyi).
- 修复 JSON_QUERY 函数处理多个数字路径时的问题 #57096 (KevinyhZou).
- 修复 Gorilla 编解码器中的缓冲区溢出问题 #57107 (Nikolay Degterinsky) 。
- 在身份验证前,如发生任何异常则关闭服务器间连接 #57142 (Antonio Andelic).
- 修复对带有 Nullable MATERIALIZED 列执行 ALTER UPDATE 后出现的段错误 #57147 (Nikolay Degterinsky) 。
- 修复普通投影部分物化时 JOIN 计划优化不正确的问题 #57196 (Amos Bird).
- 比较列描述时忽略注释 #57259 (Antonio Andelic) 。
- 修复
ReadonlyReplica指标在所有情况下的问题 #57267 (Antonio Andelic) 。 - 后台合并现可正确使用缓存中的临时数据存储 #57275 (vdimir).
- 修复 Keeper 的更新日志和快照问题 #57299 (Antonio Andelic).
- 如果主机名已更改,则忽略已完成的 ON CLUSTER 任务 #57339 (Alexander Tokmakov).
- MergeTree 变更会复用源数据片段的索引粒度 #57352 (Maksim Kita).
- FS 缓存:增加后台下载限制 #57424 (Kseniia Sumarokova) 。
ClickHouse 发布 23.10,2023-11-02。 演示文稿, 视频
向后不兼容变更
- 不再提供自动删除损坏数据分区片段的选项。此项关闭了 #55174。#55184 (Alexey Milovidov)。#55557 (Jihyuk Bok)。
- 已废弃的内存中数据分区片段将无法再从预写日志中读取。如果你之前配置过内存中的 parts,则必须在升级前将其删除。#55186 (Alexey Milovidov)。
- 移除了与 Meilisearch 的 integration。原因是它仅兼容旧版 0.18。较新的 Meilisearch 版本更改了协议,因此已无法使用。注意:如果你愿意帮助恢复该 integration,我们将不胜感激。#55189 (Alexey Milovidov)。
- 将 directory monitor 的概念重命名为后台 INSERT。所有
*directory_monitor*设置均已重命名为distributed_background_insert*。应保留向后兼容性 (因为旧设置已作为别名保留) 。#55978 (Azat Khuzhin)。 - 不再将客户端侧设置的
send_timeout解释为服务端侧的receive_timeout,反之亦然。#56035 (Azat Khuzhin)。 - 比较不同单位的时间间隔时将抛出异常。此项关闭了 #55942。你可能偶尔依赖过之前的行为,即无论单位如何都直接比较底层数值。#56090 (Alexey Milovidov)。
- 完全重写了 Experimental
S3Queue表引擎:更改了在 zookeeper 中保存信息的方式,从而减少 zookeeper 请求;在已知状态不会变化时,增加了对 zookeeper 状态的 caching;改进了从 S3 轮询的流程,使其不再那么激进;调整了对已跟踪文件的 TTL 和最大集合的维护方式,现在这变成了后台进程。新增了system.s3queue和system.s3queue_log表。此项关闭了 #54998。#54422 (Kseniia Sumarokova)。 - HTTP 端点上的任意路径不再被解释为发往
/query端点的请求。#55521 (Konstantin Bogdanov)。
新特性
- 新增函数
arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn),可将 lambda function 应用于多个长度相同的数组,并将结果累积到累加器中。#49794 (Lirikl). - 新增对
Npy格式的支持。SELECT * FROM file('example_array.npy', Npy)。#55982 (Yarik Briukhovetskyi) 。 - 如果某个表的键中包含空间填充曲线,例如
ORDER BY mortonEncode(x, y),则其参数上的条件 (例如x >= 10 AND x <= 20 AND y >= 20 AND y <= 30) 可用于索引。新增了设置analyze_index_with_space_filling_curves,用于启用或禁用此分析。此更改解决了 #41195。延续自 #4538。延续自 #6286。延续自 #28130。延续自 #41753。#55642 (Alexey Milovidov) 。 - 新增了一个名为
force_optimize_projection_name的设置,该设置接受 projection 名称作为参数。如果其值设置为非空字符串,ClickHouse 会检查该 projection 是否至少在查询中使用过一次。关闭 #55331。#56134 (Yarik Briukhovetskyi) 。 - 支持通过原生协议对外部数据进行异步插入。此前,只有将数据内联到查询中时才支持这一功能。#54730 (Anton Popov).
- 新增聚合函数
lttb,使用 Largest-Triangle-Three-Buckets 算法对数据进行降采样,以便用于可视化。#53145 (Sinan) 。 CHECK TABLE查询具有更好的性能和可用性 (会发送进度更新,并支持取消) 。支持使用CHECK TABLE ... PART 'part_name'检查特定分片。#53404 (vdimir).- 添加了函数
jsonMergePatch。在将 JSON 数据作为字符串处理时,它提供了一种将这些字符串 (JSON 对象字符串) 合并起来的方法,从而生成一个仅包含单个 JSON 对象的字符串。#54364 (Memo) 。 - Kusto Query Language 方言支持的第二部分。第 1 阶段实现已完成合并。#42510 (larryluogit) 。
- 新增了一个新的 SQL 函数
arrayRandomSample(arr, k),可从输入数组中返回包含 k 个元素的样本。此前,类似功能只能通过不太便捷的语法实现,例如 “SELECT arrayReduce(‘groupArraySample(3)’, range(10))”。#54391 (itayisraelov) 。 - 引入
-ArgMin/-ArgMax聚合组合器,使其仅基于最小/最大值进行聚合。相关用例见 #54818。此 PR 还将组合器重新整理到专用文件夹中。#54947 (Amos Bird) 。 - 允许通过
SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]清除 Protobuf format 的缓存。#55064 (Aleksandr Musorin) 。 - 新增外部 HTTP Basic 认证器。#55199 (Aleksei Filatov) 。
- 新增了函数
byteSwap,可将无符号整数的字节顺序颠倒。这对于颠倒那些在内部以无符号整数形式表示的类型的值特别有用,例如 IPv4。#55211 (Priyansh Agrawal) 。 - 新增函数
formatQuery,用于返回 SQL 查询字符串的格式化版本 (可能为多行) 。同时还新增了函数formatQuerySingleLine,作用相同,但返回的字符串不包含换行符。#55239 (Salvatore Mesoraca). - 新增了
DWARF输入格式,可从 ELF 可执行文件/库/目标文件中读取调试符号。#55450 (Michael Kolupaev) 。 - 允许在 RabbitMQ、NATS 和 FileLog 引擎中保存未解析的记录和错误。新增虚拟列
_error以及_raw_message(用于 NATS 和 RabbitMQ) 和_raw_record(用于 FileLog) ;当 ClickHouse 无法解析新记录时,这些列会被填充。该行为由存储设置控制:NATS 使用nats_handle_error_mode,RabbitMQ 使用rabbitmq_handle_error_mode,FileLog 使用handle_error_mode,与kafka_handle_error_mode类似。如果将其设置为default,当 ClickHouse 无法解析记录时会抛出异常;如果设置为stream,则错误和原始记录会保存到虚拟列中。关闭 #36035。#55477 (Kruglov Pavel) 。 - Keeper 客户端改进:新增
get_all_children_number command,用于返回特定路径下所有子节点的数量。#55485 (guoxiaolong) 。 - Keeper 客户端改进:新增
get_direct_children_number命令,返回某个路径下直接子节点的数量。#55898 (xuzifu666). - 新增语句
SHOW SETTING setting_name,作为现有语句SHOW SETTINGS的简化版本。#55979 (Maksim Kita) 。 - 向
system.parts_columns表中新增了字段substreams和filenames。#55108 (Anton Popov) 。 - 新增了对
SHOW MERGES查询的支持。#55815 (megao). - 引入设置
create_table_empty_primary_key_by_default,将默认ORDER BY设为()。#55899 (Srikanth Chekuri) 。
性能提升
- 添加选项
query_plan_preserve_num_streams_after_window_functions,用于在计算窗口函数后保留流的数量,以支持并行流处理。#50771 (frinkr). - 如果数据量较小,则释放更多流。#53867 (Jiebin Sun) 。
- 在序列化前优化 RoaringBitmaps。#55044 (UnamedRus).
- 倒排索引中的倒排列表现已优化,内部 bitmap 会采用尽可能紧凑的表示形式。根据数据的重复程度,这可能会显著降低倒排索引的空间占用。 #55069 (Harry Lee).
- 修复了 Context 锁竞争问题,显著提升了大量短时运行的并发查询性能。 #55121 (Maksim Kita).
- 将倒排索引的创建性能提升了 30%。这是通过将
std::unordered_map替换为absl::flat_hash_map实现的。#55210 (Harry Lee) 。 - 支持 ORC 过滤器下推 (行组级) 。#55330 (李扬).
- 改进在存在大量临时 File 时的外部聚合性能。#55489 (Maksim Kita) 。
- 默认将二级索引的标记缓存设为合理的大小,以避免反复加载标记。#55654 (Alexey Milovidov).
- 读取跳过索引时,避免不必要地重建索引粒度。这修复了 #55653。#55683 (Amos Bird).
- 在执行期间缓存集合中的 CAST 函数,以便在集合元素类型与列类型不完全匹配时提升
IN函数的性能。#55712 (Duc Canh Le). - 提升了
ColumnVector::insertMany和ColumnVector::insertManyFrom的性能。#55714 (frinkr) 。 - 通过预测下一行中键的位置并减少比较次数,优化了 Map 下标操作。#55929 (lgbo) 。
- 支持 Parquet 中结构体字段裁剪 (此前的版本在某些情况下无法生效) 。#56117 (lgbo).
- 新增了可根据预计待读取的行数调整查询执行中所用并行副本数量的能力。#51692 (Raúl Marín).
- 在生成大量临时 File 时,优化了外部聚合的内存消耗。#54798 (Nikita Taranov) 。
- 以
async_socket_for_remote模式 (默认) 执行的分布式查询现在会遵循max_threads限制。此前,某些查询可能会创建过多的线程 (最多可达max_distributed_connections) ,从而导致服务器性能问题。#53504 (filimonov). - 在执行来自 Zookeeper 分布式 DDL 队列的 DDL 时,缓存可跳过的条目。#54828 (Duc Canh Le) 。
- Experimental 倒排索引不会存储匹配项过多的标记 (即倒排列表中的行 id) 。这样可以节省空间,并避免在顺序扫描同样快甚至更快时进行低效的索引查找。此前用于控制何时不存储标记的启发式规则 (传递给索引定义的
density参数) 让用户颇感困惑。现在引入了一种简单得多的启发式规则,基于参数max_rows_per_postings_list(默认值:64k) ,可直接控制倒排列表中允许包含的最大行 id 数量。#55616 (Harry Lee). - 改进了
EmbeddedRocksDB表的写入性能。#55732 (Duc Canh Le) 。 - 提升了 ClickHouse 在分区内存在大量 parts (超过 1000 个) 时的整体稳定性。这可能会减少
TOO_MANY_PARTS错误。#55526 (Nikita Mikhaylov) 。 - 降低了加载层次结构字典时的内存占用。#55838 (Nikita Taranov) 。
- 所有字典均支持设置
dictionary_use_async_executor。 #55839 (vdimir). - 防止在反序列化 AggregateFunctionTopKGenericData 时内存占用过高。#55947 (Raúl Marín).
- 在具有大量 watch 的 Keeper 上,AsyncMetrics 线程可能会在
DB::KeeperStorage::getSessionsWithWatchesCount中持续一段明显的时间占满 100% CPU。该修复通过避免遍历开销较大的watches和list_watches集合来解决此问题。#56054 (Alexander Gololobov). - 新增设置
optimize_trivial_approximate_count_query,使存储引擎 EmbeddedRocksDB 可使用count近似计数。为 StorageJoin 启用 trivial count。#55806 (Duc Canh Le).
改进
- 函数
toDayOfWeek(MySQL 别名:DAYOFWEEK) 、toYearWeek(YEARWEEK) 和toWeek(WEEK) 现已支持String参数。这使其行为与 MySQL 保持一致。#55589 (Robert Schulze) 。 - 引入了设置
date_time_overflow_behavior,可选值为ignore、throw、saturate,用于控制从 Date、Date32、DateTime64、Integer 或 Float 转换为 Date、Date32、DateTime 或 DateTime64 时的溢出处理行为。 #55696 (Andrey Zvonov). - 为
ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}添加了查询参数支持。合并了 #49516。关闭了 #49449。#55604 (alesapin) 。 - 在 EXPLAIN 中以更美观的方式显示处理器 ID。#48852 (Vlad Seliverstov) 。
- 创建包含
lifetime字段的直接字典时会在创建阶段被拒绝 (因为lifetime对直接字典没有意义) 。修复:#27861。#49043 (Rory Crispin) 。 - 允许在带有分区子句的查询中使用参数,例如
ALTER TABLE t DROP PARTITION。关闭 #49449。#49516 (Nikolay Degterinsky) 。 - 为
system.zookeeper_connection新增xid列。#50702 (helifu) 。 - 配置重新加载后,在
system.server_settings中显示正确的服务器设置。#53774 (helifu) 。 - 在查询中新增了对数学减号字符
−的支持,其行为与-类似。#54100 (Alexey Milovidov) 。 - 为 Experimental
Replicated数据库引擎添加副本组。关闭 #53620。#54421 (Nikolay Degterinsky) 。 - 与其让查询直接失败,不如对可重试的 S3 错误进行重试。默认增大 s3_retry_attempts 的值。#54770 (Sema Checherinda).
- 新增了负载均衡模式
hostname_levenshtein_distance。#54826 (JackyWoo) 。 - 改进了在日志中隐藏敏感信息的功能。 #55089 (Vitaly Baranov).
- 目前,投影分析将仅基于查询计划执行。设置
query_plan_optimize_projection已废弃 (很久以前就已默认启用) 。#55112 (Nikita Mikhaylov) 。 - 现在,当函数
untuple用于具有命名元素的 Tuple,且该函数本身也带有别名时 (例如select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias) ,结果列名将根据 untuple 的别名和 Tuple 元素的别名生成 (在此示例中为:“untuple_alias.element_alias”) 。#55123 (garcher22) 。 - 新增设置
describe_include_virtual_columns,可将表的虚拟列包含在DESCRIBE查询结果中。新增设置describe_compact_output。如果设为true,DESCRIBE查询将仅返回列名和类型,不包含额外信息。#55129 (Anton Popov) 。 - 有时,带有
optimize_throw_if_noop=1的OPTIMIZE可能会因unknown reason错误而失败,而真正原因是不同 parts 中存在不同的 projections。此问题已修复。#55130 (Nikita Mikhaylov). - 允许多个
MaterializedPostgreSQL表对应同一个 Postgres 表。默认情况下,此行为未启用 (出于兼容性考虑,因为这是一项向后不兼容的更改) ,但可通过设置materialized_postgresql_use_unique_replication_consumer_identifier启用。关闭 #54918。#55145 (Kseniia Sumarokova) 。 - 允许从较短的字符串中解析带小数部分的负
DateTime64和DateTime。#55146 (Andrey Zvonov) 。 - 为了提升与 MySQL 的兼容性,1.
information_schema.tables现已新增字段table_rows,2.information_schema.columns现已新增字段extra。#55215 (Robert Schulze) 。 - 如果结果为 0 且抛出了异常,Clickhouse-client 将不会显示 “0 rows in set”。#55240 (Salvatore Mesoraca) 。
- 支持在不带
TABLE关键字的情况下重命名表,例如RENAME db.t1 to db.t2。#55373 (凌涛) 。 - 在
system.clusters中添加internal_replication。#55377 (Konstantin Morozov) 。 - 根据请求协议选择远程代理解析器,补充代理功能文档,并移除
DB::ProxyConfiguration::Protocol::ANY。#55430 (Arthur Passos) 。 - 避免在表关闭后于 INSERT 过程中重试 Keeper 操作。#55519 (Azat Khuzhin) 。
SHOW COLUMNS现在会在启用设置use_mysql_types_in_show_columns时,正确将FixedString类型报告为BLOB。此外,还新增了两个设置:mysql_map_string_to_text_in_show_columns和mysql_map_fixed_string_to_text_in_show_columns,用于将String和FixedString类型的输出切换为TEXT或BLOB。#55617 (Serge Klochkov) 。- 在 ReplicatedMergeTree 表启动期间,ClickHouse server 会检查 parts 集合中是否存在异常 parts (本地存在,但在 ZooKeeper 中不存在) 。所有异常 parts 都会被移到 detached 目录中,server 会尝试恢复它们最近的某些祖先 (被覆盖的) parts 作为替代。现在,server 会尝试恢复最近的祖先,而不是随机的被覆盖 parts。#55645 (alesapin).
- 高级仪表板现已支持在触摸设备上拖拽图表。此项改动解决了 #54206。#55649 (Alexey Milovidov) 。
- 如果已声明默认查询格式,则在使用
http_write_exception_in_output_format输出异常时采用该格式。#55739 (Raúl Marín) 。 - 为常见的 MATERIALIZED VIEW 陷阱提供更清晰的提示信息。#55826 (Raúl Marín) 。
- 如果你删除了当前数据库,仍然可以在
clickhouse-local中运行一些查询,并切换到另一个数据库。这样可使其行为与clickhouse-client保持一致。此更改解决了 #55834。#55853 (Alexey Milovidov) 。 - 函数
(add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond)现已支持以字符串编码的日期参数,例如SELECT addDays('2023-10-22', 1)。这提升了与 MySQL 的兼容性,也是 Tableau Online 所必需的。#55869 (Robert Schulze) 。 - 禁用设置
apply_deleted_mask后,可读取被轻量级 DELETE 查询标记为已删除的行。这对调试很有帮助。#55952 (Alexander Gololobov) 。 - 在将 Tuple 序列化为 JSON 对象时,允许跳过
null值,从而能够与 Spark 的to_json函数保持兼容,这对 gluten 也很有帮助。#55956 (李扬). - 函数
(add|sub)Date现在支持以字符串编码的日期参数,例如SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE)。加号和减号运算符现也支持以字符串编码的日期参数,例如SELECT '2023-10-23' + INTERVAL 1 DAY。这提升了与 MySQL 的兼容性,也是 Tableau Online 所必需的。#55960 (Robert Schulze) 。 - 允许在 CSV 格式中使用包含 CR (
\r) 的未加引号字符串。已关闭 #39930。#56046 (Kruglov Pavel) 。 - 支持使用嵌入式配置运行
clickhouse-keeper。#56086 (Maksim Kita) 。 - 为
queued.min.messages的最大配置值设定上限,以避免开始从 Kafka 拉取数据时出现问题。#56121 (Stas Morozov) 。 - 修复了 SQL 函数
minSampleSizeContinous中的拼写错误 (已重命名为minSampleSizeContinuous) 。保留旧名称以保持向后兼容。此项关闭了: #56139。#56143 (Dorota Szeremeta) 。 - 在关闭 server 之前,打印磁盘上损坏的 parts 的路径。在此更改之前,如果某个 part 在磁盘上损坏且 server 无法启动,几乎无法判断究竟是哪个 part 损坏了。此问题现已修复。#56181 (Duc Canh Le).
构建/测试/打包改进
- 如果 Docker 中的数据库已经初始化,后续启动时就无需再次初始化。这可能会修复数据库在 1000 次尝试内未能加载时容器无限重启的问题 (与超大数据库和多节点部署相关) 。#50724 (Alexander Nikolaev).
- 包含子模块源码的资源会在 Darwin 的特殊构建任务中构建。这样无需检出子模块也可构建 ClickHouse。#51435 (Ilya Yatsishin).
- 在全局启用 AVX 指令集系列 (不推荐) 来构建 ClickHouse 时会报错。原因是 snappy 未启用
SNAPPY_HAVE_X86_CRC32。#55049 (monchickey). - 解决了从
clickhouse-serverpackage 启动独立clickhouse-keeper的问题。#55226 (Mikhail f. Shiryaev). - 测试中将 RabbitMQ 版本更新到了 3.12.6,并改进了 RabbitMQ 测试的日志收集。#55424 (Ilya Yatsishin).
- 调整了 openssl 与 boringssl 之间错误消息的差异,以修复功能测试。#55975 (MeenaRenganathan22).
- apache datasketches 改为使用上游仓库。#55787 (Nikita Taranov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 在变更期间跳过对倒排索引文件进行硬链接 #47663 (cangyin) 。
- 修复了
match函数 (正则表达式) 的一个错误:当 pattern 包含交替分支时,会生成错误的键条件。关闭 #53222。 #54696 (Yakov Olkhovskiy). - 修复在按序读取优化中使用 ARRAY JOIN 时出现的“Cannot find column”问题 #51746 (Nikolai Kochetov) 。
- 支持在查询中使用缺失的实验性
Object(Nullable(json))子列。#54052 (zps) 。 - 重新加入
accurateCastOrNull的修复 #54629 (Salvatore Mesoraca) 。 - 修复了对未使用 AS 创建的分布式表中列的
DEFAULT检测问题 #55060 (Vitaly Baranov). - 修复 ShellCommandSource 的 ctor 中发生异常时未正确清理的问题 #55103 (Alexander Gololobov).
- 修复 LDAP 分配角色更新时的死锁问题 #55119 (Julian Maicher) 。
- 抑制对内部异常的错误统计信息更新 #55128 (Robert Schulze).
- 修复备份中的死锁问题 #55132 (alesapin) 。
- 修复存储层检索 Iceberg 文件的问题 #55144 (Kseniia Sumarokova) 。
- 修复 set 中额外列的分区剪枝问题。#55172 (Amos Bird) 。
- 修复了在表启用自适应粒度时,ALTER UPDATE 查询中跳过索引重新计算的问题 #55202 (Duc Canh Le).
- 修复了 fs cache 的后台下载问题 #55252 (Kseniia Sumarokova) 。
- 避免在缓冲区未最终处理时压缩器中可能发生的内存泄漏 #55262 (Azat Khuzhin) 。
- 修复函数在稀疏列上执行时的问题 #55275 (Azat Khuzhin).
- 修复在 SummingMergeTree 上执行
SELECT FINAL FROM时 Nested 被错误合并的问题 #55276 (Azat Khuzhin) 。 - 修复了在未启用 zero copy 时,无法在基于 S3 的 replicated merge tree 中删除 detached 分区的问题 #55309 (alesapin) 。
- 修复 MergeSortingPartialResultTransform 中的崩溃问题 (原因是
remerge后 chunks 数为 0) #55335 (Azat Khuzhin) 。 - 修复 CreatingSetsTransform 中因抛出共享异常而在出错时发生的数据竞争问题 #55338 (Azat Khuzhin).
- 修复了 trash 优化中的问题 (在一定程度上) #55353 (Alexey Milovidov) 。
- 修复 StorageHDFS 中的泄漏问题 #55370 (Azat Khuzhin) 。
- 修复
CAST运算符中数组解析错误 #55417 (Anton Popov). - 修复了查询中使用 OR 过滤器时无法按虚拟列过滤的问题 #55418 (Azat Khuzhin) 。
- 修复 MongoDB 连接问题 #55419 (Nikolay Degterinsky) 。
- 修复 MySQL 接口中布尔值的表示方式 #55427 (Serge Klochkov) 。
- 修复 MySQL 文本协议中 DateTime 的格式化问题,以及 LowCardinality(Nullable(T)) 类型报告问题 #55479 (Serge Klochkov) 。
- 使
use_mysql_types_in_show_columns只对SHOW COLUMNS生效 #55481 (Robert Schulze) 。 - 修复栈符号化器对
DW_FORM_ref_addr解析错误并偶发崩溃的问题 #55483 (Michael Kolupaev). - 在 AsyncTaskExecutor 中,如果 cancelBefore 发生异常,则销毁 fiber #55516 (Kruglov Pavel) 。
- 修复自定义 HTTP 处理程序中查询参数无法生效的问题 #55521 (Konstantin Bogdanov).
- 修复了对 Values format 中未处理数据的检查问题 #55527 (Azat Khuzhin) 。
- 修复 ODBC 与 MS SQL Server 交互时出现的 ‘Invalid cursor state’ 错误 #55558 (vdimir) 。
- 修复最大执行时间和 ‘break’ 溢出模式的问题 #55577 (Alexander Gololobov) 。
- 修复 QueryNormalizer 在存在循环别名时崩溃的问题 #55602 (vdimir).
- 禁用错误的优化,并添加测试 #55609 (Alexey Milovidov) 。
- 合并 #52352 #55621 (Alexey Milovidov) 。
- 添加了一项测试,以避免小数排序错误 #55662 (Amos Bird).
- 修复 S3 和 Azure 的 Cluster 函数在 URL 不含通配符时的进度条问题 #55666 (Kruglov Pavel).
- 修复查询中使用 OR 过滤器按虚拟列过滤时的问题 (重新提交) #55678 (Azat Khuzhin).
- Iceberg 存储的修复和改进 #55695 (Kruglov Pavel).
- 修复 CreatingSetsTransform (v2) 中的数据竞争问题 #55786 (Azat Khuzhin).
- 如果
precise_float_parsing为 true,则在将非法字符串解析为浮点数时会抛出异常 #55861 (李扬). - 若 CTE 包含有状态函数,则禁用谓词下推 #55871 (Raúl Marín).
- 修复 normalize ASTSelectWithUnionQuery,此前它会从查询中移除
FORMAT#55887 (flynn). - 尝试修复原生 ORC 输入格式中可能发生的段错误 #55891 (Kruglov Pavel) 。
- 修复了稀疏列场景下的窗口函数问题。#55895 (János Benjamin Antal).
- 修复:StorageNull 现已支持子列 #55912 (FFish).
- 不要将 Replicated mutate/merge 的可重试错误写入错误日志中 #55944 (Azat Khuzhin) 。
- 修复
SHOW DATABASES LIMIT <N>的问题 #55962 (Raúl Marín) 。 - 修复自动生成的 Protobuf schema 中带下划线的字段 #55974 (Kruglov Pavel) 。
- 修复了
dateTime64ToSnowflake64()在非默认标度下的问题 #55983 (Robert Schulze) 。 - 修复 Arrow 字典列的输入/输出问题 #55989 (Kruglov Pavel) 。
- 修复 AvroConfluent 中从 Schema Registry 拉取 schema 时的问题 #55991 (Kruglov Pavel) 。
- 修复在 Buffer 表上并发执行 ALTER 和 INSERT 时出现的“块结构不匹配”问题 #55995 (Michael Kolupaev).
- 修复 least_used JBOD 策略中空闲空间统计错误 #56030 (Azat Khuzhin) 。
- 修复在表函数中评估子查询时缺少标量值的问题 #56057 (Amos Bird).
- 修复在
http_write_exception_in_output_format=1时查询结果错误的问题 #56135 (Kruglov Pavel). - 修复在设置变更时回退到 JSON->JSONEachRow 的 schema 缓存问题 #56172 (Kruglov Pavel) 。
- 为 odbc-bridge 添加错误处理器 #56185 (Yakov Olkhovskiy) 。
ClickHouse 发布 23.9,2023-09-28。 演示文稿, 视频
向后不兼容变更
- 从默认的 Prometheus handler 中移除
status_info配置选项和字典状态。#54090 (Alexey Milovidov). - Experimental 的 parts 元数据缓存已从代码库中移除。#54215 (Alexey Milovidov).
- 默认禁用设置
input_format_json_try_infer_numbers_from_strings,因此在 JSON formats 中默认不再尝试从字符串推断数值,以避免当样本数据中包含看起来像数字的字符串时出现解析错误。#55099 (Kruglov Pavel).
新特性
- 改进了 JSON formats 中的 schema 推断:1) 现在可以在 JSON formats 中通过设置
input_format_json_try_infer_named_tuples_from_objects,在不使用 Experimental JSON type 的情况下,从 JSON object 推断出命名元组。此前如果不使用 Experimental 类型 JSON,我们只能将 JSON object 推断为 String 或 Map,现在则可以推断为命名 Tuple。推断得到的 Tuple 类型将包含 schema 推断期间从数据样本中读取到的 object 的所有 key。这对于读取不包含稀疏 object 的结构化 JSON 数据很有帮助。该设置默认启用。2) 允许通过设置input_format_json_read_arrays_as_strings将 JSON array 解析到 String 类型的列中。这有助于读取包含不同类型值的数组。3) 允许通过设置input_format_json_infer_incomplete_types_as_strings,将样本数据中类型未知的 JSON key (null/[]/{}) 推断为 String 类型。现在,在 JSON formats 中我们可以将任意值读入 String 列,还可以通过对未知类型使用 String 类型,避免在 schema 推断期间出现错误Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps,从而成功读取数据。#54427 (Kruglov Pavel) 。 - 为远程磁盘新增了 IO 调度支持。磁盘类型
s3、s3_plain、hdfs和azure_blob_storage的存储配置现在可以包含read_resource和write_resource元素,用于存放资源名称。这些资源的调度策略可在单独的服务器配置部分resources中进行配置。可以使用设置workload为查询添加标记,并使用服务器配置部分workload_classifiers对其进行分类,以实现不同的资源调度目标。更多详情请参见文档。#47009 (Sergei Trifonov) 。新增了bandwidth_limitIO 调度节点类型。它允许你对通过该节点的流量指定max_speed和max_burst约束。#54618 (Sergei Trifonov) 。 - 新增了一种基于 SSH 密钥的身份验证类型。它仅适用于原生 TCP 协议。#41109 (George Gamezardashvili) 。
- 为 MergeTree 表新增了
_block_number列。#44532。#47532 (SmitaRKulkarni) 。 - 在
DROP TABLE查询中新增IF EMPTY子句。#48915 (Pavel Novitskiy) 。 - SQL 函数
toString(datetime, timezone)和formatDateTime(datetime, format, timezone)现已支持使用非常量的 timezone 参数。#53680 (Yarik Briukhovetskyi) 。 - 新增了对
ALTER TABLE MODIFY COMMENT的支持。注意:很久以前曾有外部贡献者添加过类似功能,但它实际上完全无法使用,反而只会让用户困惑。此更改关闭了 #36377。#51304 (Alexey Milovidov) 。注意:此命令不会在副本之间传播,因此同一张表的不同副本可能带有不同的注释。 - 新增了
GCD(即 “最大公约数”) 这一新的数据压缩编解码器。该编解码器会计算所有列值的 GCD,然后将每个值都除以该 GCD。GCD 编解码器属于数据预处理编解码器 (类似于 Delta 和 DoubleDelta) ,不能单独使用。它适用于整数、Decimal 以及日期/时间类型的数据。GCD 编解码器的一个典型适用场景是:列值按 GCD 的倍数变化 (增加/减少) ,例如 24 - 28 - 16 - 24 - 8 - 24 (假设 GCD = 4) 。#53149 (Alexander Nam) 。 - 新增了两个新的类型别名:
DECIMAL(P)(作为DECIMAL(P, 0)的简写) 和DECIMAL(作为DECIMAL(10, 0)的简写) 。这让 ClickHouse 与 MySQL 的 SQL 方言更加兼容。#53328 (Val Doroshchuk) 。 - 新增系统日志表
backup_log,用于跟踪所有BACKUP和RESTORE操作。#53638 (Victor Krasnov) 。 - 新增格式设置
output_format_markdown_escape_special_characters(默认值:false) 。该设置用于控制在Markdown输出格式中,是否对!、#、$等特殊字符进行转义 (即在其前面添加反斜杠) 。#53860 (irenjj) 。 - 新增函数
decodeHTMLComponent。 #54097 (Bharat Nallan). - 在 query_log 表中新增了
peak_threads_usage。#54335 (Alexey Gerasimchuck) 。 - 为 clickhouse-client 新增
SHOW FUNCTIONS支持。#54337 (Julia Kartseva) 。 - 新增函数
toDaysSinceYearZero,别名为TO_DAYS(用于兼容 MySQL) ,该函数返回自0001-01-01起经过的天数 (采用前推公历) 。#54479 (Robert Schulze) 。函数toDaysSinceYearZero现已支持DateTime和DateTime64类型的参数。#54856 (Serge Klochkov) 。 - 新增了函数
YYYYMMDDtoDate、YYYYMMDDtoDate32、YYYYMMDDhhmmssToDateTime和YYYYMMDDhhmmssToDateTime64。它们可将编码为整数的日期或日期时间 (例如 20230911) 转换为原生日期或日期时间。因此,这些函数与现有函数YYYYMMDDToDate、YYYYMMDDToDateTime、YYYYMMDDhhmmddToDateTime、YYYYMMDDhhmmddToDateTime64的功能正好相反。#54509 (Quanfa Fu) (Robert Schulze) 。 - 新增了多个字符串距离函数,包括
byteHammingDistance和editDistance。#54935 (flynn) 。 - 支持使用
VALID UNTIL datetime子句为用户凭证指定过期日期,并可选地指定具体时间。#51261 (Nikolay Degterinsky) 。 - 允许表函数
s3、gcs、oss使用 S3 风格的 URL,URL 会自动转换为 HTTP。例如:'s3://clickhouse-public-datasets/hits.csv'会被转换为'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'。#54931 (Yarik Briukhovetskyi) 。 - 添加新设置
print_pretty_type_names,用于以 Pretty 形式打印深度嵌套类型名称,例如 Tuple/Map/Array。#55095 (Kruglov Pavel) 。
性能提升
- 默认启用预取,加快从 S3 读取数据的速度。#53709 (Alexey Milovidov) 。
- 如果 FINAL 查询无此需要,则不要在单独的 parts 中隐式读取 PK 和版本列。#53919 (Duc Canh Le).
- 优化按常量键进行 group by。在 https://github.com/ClickHouse/ClickHouse/pull/53529 之后,将优化按
_file/_path进行 group by 的查询。#53549 (Kruglov Pavel) 。 - 提升
Decimal列的排序性能。若 ORDER BY 包含Decimal列,则提升向MergeTree插入数据时的性能。提升在数据已经排好序或接近有序时的排序性能。#35961 (Maksim Kita) 。 - 提升超大查询分析的性能。修复了 #51224。#51469 (frinkr).
- 一项优化:如果是从带有 GROUP BY 的子查询中进行选择,可将
COUNT(DISTINCT ...)和各种uniq变体重写为count。 #52082 #52645 (JackyWoo) 。 - 移除对
mmap/mremap/munmap的手动调用,改由jemalloc统一处理这些工作——性能也会略有提升。#52792 (Nikita Taranov) 。 - 修复了使用 NATS 时 CPU 占用过高的问题。#54399 (Vasilev Pyotr) 。
- 由于我们为带有 datetime 参数的
toString执行采用了单独的指令,因此可以略微提升非 datetime 参数的性能,并使部分代码更加简洁。这是对 #53680 的后续改进。#54443 (Yarik Briukhovetskyi). - 这个 PR 不再将 JSON 元素序列化到
std::stringstream中,而是尝试直接将序列化结果写入ColumnString。#54613 (lgbo) 。 - 启用 ORDER BY 优化,以便在表后存在视图时,按相应顺序从 MergeTree 表中读取数据。#54628 (Vitaly Baranov) 。
- 通过复用
GeneratorJSONPath并移除多个共享指针,优化 JSON SQL 函数。#54735 (lgbo). - Keeper 会尝试将 flush 请求批量处理,以提升性能。#53049 (Antonio Andelic) 。
- 现在,
clickhouse-client在使用INFILE 'glob_expression'时可以并行处理文件。已关闭 #54218。#54533 (Max K.) 。 - 允许在主键列类型与
IN函数右侧列类型不一致时,对IN函数使用主键。示例:SELECT id FROM test_table WHERE id IN (SELECT '5')。关闭了 #48936。#54544 (Maksim Kita) 。 - Hash JOIN 会尝试缩减内部缓冲区,这些缓冲区会占用最大可用内存的一半 (由
max_bytes_in_join设置) 。#54584 (vdimir) 。 - 使
array join遵循max_block_size,以避免可能发生 OOM。关闭 #54290。#54664 (李扬). - 在
s3表函数中复用 HTTP 连接。#54812 (Michael Kolupaev) 。 - 将
MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules中的线性搜索改为二分查找。#54869 (usurai).
Experimental 功能
- 现在可以使用设置
max_threads_for_annoy_index_creation并行创建Annoy索引。#54047 (Robert Schulze) 。 - 在 Distributed 上的并行副本不会从所有副本读取数据。#54199 (Igor Nikonov) 。
改进
- 允许将
MergeTree数据分区片段中列文件的长文件名替换为名称哈希。这有助于在某些情况下避免出现File name too long错误。#50612 (Anton Popov). - 如果元数据解析失败,则将
JSON格式的数据按JSONEachRow格式解析。这样一来,即使实际格式是 JSONEachRow,也能读取扩展名为.json的文件。关闭 #45740。#54405 (Kruglov Pavel) 。 - 在 HTTP 查询执行期间发生异常时,也会输出有效的 JSON/XML。新增设置
http_write_exception_in_output_format,用于启用/禁用此行为 (默认启用) 。#52853 (Kruglov Pavel) 。 - 视图
information_schema.tables现新增字段data_length,用于显示磁盘上数据的大致大小。运行 Amazon QuickSight 生成的查询需要该字段。#55037 (Robert Schulze) 。 - MySQL 接口新增了对预处理语句的基础实现,刚好足以让 Tableau Online 通过 MySQL 连接器连接到 ClickHouse。#54115 (Serge Klochkov) 。请注意:预处理语句的实现目前还很基础,我们尚未支持参数绑定,因为在 Tableau Online 的这个特定使用场景中并不需要。如果后续在对 Tableau Online 进行充分测试后发现问题且确有必要,我们会在后续版本中补上这一功能。
- 支持在
regexp_tree字典中使用不区分大小写和 dot-all 模式进行匹配。#50906 (Johann Gan) 。 - Keeper 改进:新增
createIfNotExistsKeeper 命令。#48855 (Konstantin Bogdanov) 。 - 更准确的整数类型推断,修复 #51236。#53003 (Chen768959) 。
- 为 MaterializedMySQL 新增了对字符串字面量中字符集的解析支持。#53220 (Val Doroshchuk).
- 修复了
EmbeddedRocksDB表引擎在一种极罕见情况下的细微问题:执行DROP TABLE后,有时EmbeddedRocksDB表引擎无法正确关闭 NFS 上的文件。#53502 (Mingliang Pan) 。 RESTORE TABLE ON CLUSTER必须在各主机上创建 UUID 一致的复制表。否则,ZooKeeper 路径中的宏{uuid}在 RESTORE 后将无法正常工作。此 PR 实现了这一点。#53765 (Vitaly Baranov) 。- 新增恢复设置
restore_broken_parts_as_detached:如果为 true,RESTORE 过程中在恢复时遇到损坏的 parts 不会停止,而是会将所有损坏的 parts 复制到detached文件夹中,并加上前缀 `broken-from-backup’。如果为 false,RESTORE 过程会在遇到第一个损坏的 part 时停止 (如果有的话) 。默认值为 false。#53877 (Vitaly Baranov) 。 - 为 HTTP 请求头 X-ClickHouse-Progress 和 X-ClickHouse-Summary 新增
elapsed_ns字段。#54179 (joelynch) 。 - 为 keeper-client 新增
reconfig(https://github.com/ClickHouse/ClickHouse/pull/49450) 、sync和exists命令的实现。#54201 (pufit) 。 clickhouse-local和clickhouse-client现在支持多次指定--query参数,例如./clickhouse-client --query "SELECT 1" --query "SELECT 2"。相比./clickhouse-client --multiquery "SELECT 1;S ELECT 2",这种语法略微更直观,也更便于编写脚本 (例如queries.push_back('--query "$q"')) ,并且与现有参数--queries-file的行为更一致 (例如./clickhouse client --queries-file queries1.sql --queries-file queries2.sql) 。#54249 (Robert Schulze) 。- 为
formatReadableTimeDelta增加子秒级精度。#54250 (Andrey Zvonov) 。 - 默认开启
allow_remove_stale_moving_parts。 #54260 (vdimir). - 修复使用缓存中的计数值的问题,并改进从归档文件读取时的进度条。#54271 (Kruglov Pavel) 。
- 新增了对通过 SSO 使用 S3 credentials 的支持。要定义用于 SSO 的 profile,请设置
AWS_PROFILE环境变量。#54347 (Antonio Andelic) 。 - 支持在输入格式中将 NULL 用作嵌套类型 Array/Tuple/Map 的默认值。关闭 #51100。#54351 (Kruglov Pavel) 。
- 支持读取 Arrow/Parquet 格式中的某些非常规 chunk 配置。#54370 (Arthur Passos) 。
- 为兼容 MySQL,为
stddevPop函数添加STD别名。关闭 #54274。#54382 (Nikolay Degterinsky) 。 - 新增
addDate函数以兼容 MySQL,并新增subDate以保持一致性。参见 #54275。#54400 (Nikolay Degterinsky) 。 - 向
system.detached_parts添加modification_time。#54506 (Azat Khuzhin) 。 - 新增了一个设置
splitby_max_substrings_includes_remaining_string,用于控制当参数 “max_substring” > 0 时,“splitBy*()” 函数是否将剩余字符串 (如有) 包含在结果数组中 (即 Python/Spark 语义) 。默认行为不变。#54518 (Robert Schulze) 。 - 改进了
Int64/UInt64字段的整数类型推断。这是 #53003 的延续。现在也支持 Array 嵌套 Array 这类嵌套类型,以及map/tuple之类的函数。问题:#51236。#54553 (Kruglov Pavel). - 新增了标量与数组之间的乘法、除法和取模运算。支持双向运算,例如
5 * [5, 5]和[5, 5] * 5——这两种写法都可以。#54608 (Yarik Briukhovetskyi). - 为
keeper-client中的rm命令添加可选的version参数,以便更安全地执行删除操作。#54708 (János Benjamin Antal). - 禁用 systemd 终止服务器 (使用 Buffer tables 时,这可能会导致数据丢失) 。#54744 (Azat Khuzhin) 。
- 向系统表
system.functions中新增字段is_deterministic,用于指示某个函数在两次调用之间 (在输入完全相同的情况下) 其结果是否保持不变。 #54766 #55035 (Robert Schulze). - 使 schema
information_schema中的视图与 MySQL 中对应的视图更加兼容 (即对其进行了修改和扩展) ,从而使 Tableau Online 能够连接到 ClickHouse。更具体地说:1. 字段information_schema.tables.table_type的类型已从 Enum8 更改为 String。2. 向视图information_schema.table添加了字段table_comment和table_collation。3. 添加了视图information_schema.key_column_usage和referential_constraints。4. 将information_schema视图中的大写别名替换为实际的大写列。#54773 (Serge Klochkov) 。 - 现在,如果你尝试缓存包含
now、randomString和dictGet等非确定性函数的查询结果,query cache 会返回错误。与之前的行为 (静默地不缓存结果) 相比,这样可以减少困惑和意外。 #54801 (Robert Schulze). - 禁止在
file/s3/url/… 存储中使用物化列/临时列/别名列,修复从文件向临时列插入数据的问题。关闭了 #53477。#54803 (Kruglov Pavel) 。 - 备份元数据收集提供了更多可配置选项。#54804 (Vitaly Baranov) 。
clickhouse-local’的日志文件 (如果通过 —server_logs_file 标志启用) 现在会像clickhouse-server一样,在每行前加上时间戳、线程 ID 等信息。#54807 (Michael Kolupaev) 。system.merge_tree_settings表中的字段is_obsolete——对于已废弃的 MergeTree 设置,该字段的值现为 1。此前,只有在描述中才会表明该设置已废弃。#54837 (Robert Schulze) 。- 支持在使用时间间隔字面量时使用复数形式。
INTERVAL 2 HOURS应等同于INTERVAL 2 HOUR。#54860 (Jordi Villar) 。 - 始终允许创建主键为
Nullable的投影。这修复了 #54814。#54895 (Amos Bird) 。 - 在连接重置导致失败后,重试备份的 S3 操作。#54900 (Vitaly Baranov).
- 当某项设置的最大值小于最小值时,使异常消息更准确。#54925 (János Benjamin Antal) 。
LIKE、match和其他正则表达式匹配函数现在支持通过回退到二进制匹配来匹配包含非 UTF-8 子字符串的模式。示例:你可以使用string LIKE '\xFE\xFF%'来检测 BOM。这修复了 #54486。#54942 (Alexey Milovidov) 。- 新增了
ContextLockWaitMicrosecondsprofile 事件。#55029 (Maksim Kita) 。 - Keeper 可动态调整日志级别。#50372 (helifu) 。
- 新增了函数
timestamp,以兼容 MySQL。已关闭 #54275。#54639 (Nikolay Degterinsky) 。
构建/测试/打包改进
- 将 ClickHouse 官方构建和持续集成构建所使用的编译器从 Clang 16 升级到 17。#53831 (Robert Schulze).
- 重新生成了用于 lookup 的 tld 数据 (
tldLookup.generated.cpp) 。#54269 (Bharat Nallan). - 删除了多余的
clickhouse-keeper-client符号链接。#54587 (Tomas Barton). - 使用
/usr/bin/env来解析 bash,现在已支持 Nix OS。#54603 (Fionera). - CMake 新增了执行
perf record所需的PROFILE_CPU选项,无需使用 DWARF 调用图。#54917 (Maksim Kita). - 如果链接器不是 LLD,则直接报致命错误并停止。#55036 (Alexey Milovidov).
- 将用于处理 (编码/解码) base64 值的库从 Turbo-Base64 替换为 aklomp-base64。两者在 x86 和 ARM 上都支持 SIMD 加速,但作出这一更改主要有四个原因:1. 后者的许可证 (BSD-2) 对 ClickHouse 更有利,而 Turbo64 此前已切换到 GPL-3;2. aklomp-base64 在 GitHub 上的 star 更多,看起来更具长期可持续性;3. aklomp-base64 的 API 稍好一些 (当然,这一点多少有些主观) ;4. aklomp-base64 不需要我们通过各种变通手段绕过 bug (例如非线程安全的初始化) 。注意:aklomp-base64 会拒绝未填充的 base64 值,而 Turbo-Base64 会尽力对其进行解码。RFC-4648 并未明确规定填充是否是强制要求,但视具体上下文而定,这可能会带来需要注意的行为变化。#54119 (Mikhail Koviazin).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复在使用 zero-copy 复制时 REPLACE/MOVE PARTITION 的问题 (注意:“zero-copy 复制”是一项 Experimental 功能) #54193 (Alexander Tokmakov) 。
- 修复使用硬链接时的零拷贝锁问题 (注意:“zero-copy replication”是一项 Experimental 功能) #54859 (Alexander Tokmakov) 。
- 修复 zero copy 垃圾问题 (注意:“zero-copy replication” 是一项 Experimental 功能) #54550 (Alexander Tokmakov) 。
- 将 HTTP 重试超时按毫秒传递 (此前有误) 。#54438 (Duc Canh Le).
- 修复了 OUTFILE 中
CapnProto/Protobuf的误导性错误信息 #52870 (Kruglov Pavel) 。 - 修复在使用并行副本和 LIMIT 时的汇总报告错误 #53050 (Raúl Marín).
- 修复从/向 S3 执行 BACKUP 时的限流问题 (在未使用原生复制时) ,以及其他一些位置的同类问题 #53336 (Azat Khuzhin) 。
- 修复复制整个目录时的 IO 限流问题 #53338 (Azat Khuzhin).
- 修复:移至 prewhere 条件的操作时可能会丢失列 #53492 (Yakov Olkhovskiy) 。
- 修复了用字节级相同的 parts 替换时出现的内部错误 #53735 (Pedro Riera).
- 修复:要求参与
interpolate表达式的项必须为列 #53754 (Yakov Olkhovskiy) 。 - 修复 cluster discovery 初始化问题 + 在配置中设置故障注入点 #54113 (vdimir).
- 修复
accurateCastOrNull的问题 #54136 (Salvatore Mesoraca) 。 - 修复 Nullable 主键在使用 FINAL 修饰符时的问题 #54164 (Amos Bird).
- 修复了一个错误:在存在重复数据的情况下,该错误会阻止向 replicated materialized view 插入新数据。#54184 (Pedro Riera).
- 修复:允许布隆过滤器支持
IPv6#54200 (Yakov Olkhovskiy) 。 - 修复可能出现的
IPv4类型不匹配问题 #54212 (Bharat Nallan). - 修复重建后索引的
system.data_skipping_indices问题 #54225 (Artur Malchanau) 。 - 修复 multiple join rewriter v2 的命名冲突 #54240 (Tao Wang).
- 修复 join 后
system.errors中出现的异常错误 #54306 (vdimir). - 修复
isZeroOrNull(NULL)的问题 #54316 (flynn). - 修复:在
prefer_localhost_replica= 1 时,Distributed 表上的并行副本问题 #54334 (Igor Nikonov). - 修复 vertical merge、replacing merge tree 和 optimize cleanup 中的逻辑错误 #54368 (alesapin) 。
- 修复
s3表函数中可能出现的URI contains invalid characters错误 #54373 (Kruglov Pavel) 。 - 修复
arrayExists函数在 AST 优化中的段错误 #54379 (Nikolay Degterinsky) 。 - 在
analysisOfVariance函数中执行加法前检查溢出 #54385 (Antonio Andelic) 。 - 复现并修复 removeSharedRecursive 中的缺陷 #54430 (Sema Checherinda) 。
- 修复了在 PREWHERE 和 FINAL 中使用 SimpleAggregateFunction 时可能产生错误结果的问题 #54436 (Azat Khuzhin).
- 修复在非 analyzer 情况下使用 indexHint 过滤 parts 的问题 #54449 (Azat Khuzhin) 。
- 修复带有归一化状态的聚合投影问题 #54480 (Amos Bird) 。
clickhouse-local:与多查询参数相关的一项改动 #54498 (CuiShuoGuo) 。clickhouse-local支持--database命令行参数 #54503 (vdimir) 。- 修复了在禁用
input_format_with_names_use_header时,-WithNames格式中可能出现的解析错误 #54513 (Kruglov Pavel) 。 - 修复极少数情况下出现的 CHECKSUM_DOESNT_MATCH 错误 #54549 (alesapin).
- 修复对已排序结果执行 UNION ALL 后排序异常的问题 #54564 (Vitaly Baranov) 。
- 修复 Keeper 中的快照安装问题 #54572 (Antonio Andelic) 。
- 修复
ColumnUnique中的竞争条件问题 #54575 (Nikita Taranov) 。 - Annoy/Usearch 索引:修复在使用默认值构建时出现的 LOGICAL_ERROR #54600 (Robert Schulze) 。
- 修复
ColumnDecimal的序列化问题 #54601 (Nikita Taranov). - 修复 *Cluster 函数在处理带空格的列名时的 schema inference 问题 #54635 (Kruglov Pavel) 。
- 修复了在存在默认值和显式插入列时,使用插入表的结构的问题 #54655 (Kruglov Pavel).
- 修复:避免将可能包含交替项的正则匹配用作键条件。#54696 (Yakov Olkhovskiy) 。
- 修复 ReplacingMergeTree 在垂直合并和清理方面的问题 #54706 (SmitaRKulkarni) 。
- 修复了虚拟列在 ORDER BY 后值不正确的问题 #54811 (Michael Kolupaev) 。
- 修复了在非 analyzer 情况下使用 indexHint 过滤 parts 的问题 #54825 #54449 (Azat Khuzhin).
- 修复 Keeper 在关闭过程中发生段错误的问题 #54841 (Antonio Andelic).
- 修复了 MaterializedPostgreSQL 中的
Invalid number of rows in Chunk问题 #54844 (Kseniia Sumarokova) 。 - 将已废弃的格式设置移至独立章节 #54855 (Kruglov Pavel) 。
- 分区键被修改时,重新构建
minmax_count_projection#54943 (Amos Bird). - 修复函数
if中错误地转换为ColumnVector<Int128>的问题 #55019 (Kruglov Pavel). - 防止附加来自具有不同 projections 或索引的表的 parts #55062 (János Benjamin Antal).
- 对于空的子查询结果,在标量结果映射中存储 NULL #52240 (vdimir).
- 修复了
FINAL在极少数情况下会生成无效读取范围的问题 #54934 (Nikita Taranov) 。 - 修复:无 Keeper 重试时的 insert quorum 问题 #55026 (Igor Nikonov).
- 修复带 Nullable 的 simple state 问题 #55030 (Pedro Riera).
ClickHouse 发布 23.8 LTS,2023-08-31。 演示文稿, 视频
向后不兼容变更
- 如果动态磁盘带有名称,则应在磁盘函数参数中将其指定为
disk = disk(name = 'disk_name', …)。在之前的版本中,也可以指定为disk = disk_<disk_name>(...),但现已不再支持。#52820 (Kseniia Sumarokova). - 当以大于 1 的
--concurrency调用clickhouse-benchmark时,它会并行建立连接。此前,如果从欧洲到美国运行 1000 个并发连接,它几乎无法使用。现在可正确计算高延迟连接的 QPS。向后不兼容的更改:clickhouse-benchmark的 JSON 输出选项已被移除。如果你此前使用过该选项,也可以作为变通方案,从system.query_log中提取 JSON 格式的数据。#53293 (Alexey Milovidov). - 已从
system.text_log中移除microseconds列,并从system.metric_log中移除milliseconds列,因为在有event_time_microseconds列的情况下,它们是冗余的。#53601 (Alexey Milovidov). - 弃用元数据缓存功能。它仍处于 Experimental 状态,而且我们从未使用过它。该功能存在风险:#51182。移除
system.merge_tree_metadata_cache系统表。元数据缓存在此版本中仍然可用,但很快就会被移除。此更改关闭了 #39197。#51303 (Alexey Milovidov). - 禁用 TLS 连接对 3DES 的支持。#52893 (Kenji Noguchi).
新特性
- 支持直接从 zip/7z/tar 压缩包导入。示例:
file('*.zip :: *.csv')。#50321 (nikitakeba). - 向
system.trace_log添加ptr列,用于trace_type = 'MemorySample'。此列包含分配的地址。新增函数flameGraph,可构建包含已分配但未释放内存的 flamegraph。对 #38391 的重做。#45322 (Nikolai Kochetov) 。 - 新增了表函数
azureBlobStorageCluster。其支持的功能与表函数s3Cluster非常相似。#50795 (SmitaRKulkarni). - 在议题 #50808 中,允许在不指定表名的情况下使用
cluster、clusterAllReplicas、remote和remoteSecure。#50848 (Yangkuan Liu) 。 - 用于监控 Kafka 消费者的系统表。#50999 (Ilya Golshtein) 。
- 新增了
max_sessions_for_user设置。#51724 (Alexey Gerasimchuck) 。 - 新增函数
toUTCTimestamp/fromUTCTimestamp,其行为与 Spark 的to_utc_timestamp/from_utc_timestamp相同。#52117 (KevinyhZou) 。 - 新增函数
structureToCapnProtoSchema/structureToProtobufSchema,用于将 ClickHouse 表结构转换为 CapnProto/Protobuf 格式的 schema。支持在不使用外部格式 schema 的情况下,基于表结构自动生成的 schema 以 CapnProto/Protobuf 格式输入/输出数据 (由设置format_capn_proto_use_autogenerated_schema/format_protobuf_use_autogenerated_schema控制) 。还支持在输入/输出时通过设置output_format_schema导出自动生成的 schema。#52278 (Kruglov Pavel) 。 system.query_log中新增了字段query_cache_usage,用于显示是否使用了查询缓存,以及具体是如何使用的。#52384 (Robert Schulze).- 新增
startsWithUTF8和endsWithUTF8函数。#52555 (李扬) 。 - 允许 TSV/CustomSeparated/JSONCompactEachRow 中的列数可变,并使 schema 推断支持可变列数。新增设置
input_format_tsv_allow_variable_number_of_columns、input_format_custom_allow_variable_number_of_columns、input_format_json_compact_allow_variable_number_of_columns。#52692 (Kruglov Pavel) 。 - 新增了
SYSTEM STOP/START PULLING REPLICATION LOG查询 (用于测试ReplicatedMergeTree) 。#52881 (Alexander Tokmakov) 。 - 允许在发起端的变更中执行常量非确定性函数。#53129 (Anton Popov) 。
- 新增输入格式
One:该格式不读取任何数据,并始终返回一行,包含一个名为dummy、类型为UInt8、值为0的列,类似于system.one。它可与_file/_path虚拟列配合使用,在不读取任何数据的情况下列出 file/s3/url/hdfs/etc 表函数中的文件。#53209 (Kruglov Pavel) 。 - 新增
tupleConcat函数。解决了 #52759。#53239 (Nikolay Degterinsky) 。 - 支持
TRUNCATE DATABASE操作。#53261 (Bharat Nallan) 。 - 新增
max_threads_for_indexes设置,用于限制主键处理使用的线程数。#53313 (jorisgio). - 重新加入 SipHash 带密钥函数。#53525 (Salvatore Mesoraca) 。
- (#52755, #52895) 新增函数
arrayRotateLeft、arrayRotateRight、arrayShiftLeft和arrayShiftRight。#53557 (Mikhail Koviazin) 。 - 向
system.clusters添加列name,作为cluster的别名。#53605 (irenjj) 。 - 高级仪表板现已支持批量编辑 (保存/加载) 。#53608 (Alexey Milovidov) 。
- 高级仪表板现已支持将图表最大化并自由移动。#53622 (Alexey Milovidov).
- 新增了对数组加减法的支持:
[5,2] + [1,7]。由于按元素乘法与参数的标量积之间容易混淆,因此未实现除法和乘法。关闭 #49939。#52625 (Yarik Briukhovetskyi) 。 - 新增了对使用字符串字面量作为表名的支持。已关闭 #52178。#52635 (hendrik-m) 。
Experimental 功能
- 新增表引擎
S3Queue,用于从 S3 流式导入数据。关闭了 #37012。#49086 (s-kat) 。该功能尚未可用。请勿使用。 - 启用通过分布式表从副本并行读取。与 #49708 相关。#53005 (Igor Nikonov) 。
- 新增对将 HNSW 用作近似邻居搜索方法的实验性支持。#53447 (Davit Vardanyan) 。目前仅供继续进行该实现工作的人员使用。请勿使用。
性能提升
- Parquet 过滤器下推。即,读取 Parquet 文件时,会根据 WHERE 条件以及各列的最小/最大值跳过行组 (文件块) 。特别是,如果文件大致按某一列排序,那么按该列某个较小范围进行过滤的查询会快得多。#52951 (Michael Kolupaev).
- 通过在 Parquet 中将较小的行组按批次合并读取来优化读取性能。关闭了 #53069。#53281 (Kruglov Pavel) 。
- 优化大多数输入格式下从文件执行 count 的性能。关闭 #44334。#53637 (Kruglov Pavel)。
- 在
url/file/hdfs表函数中,支持在读取前按文件/路径进行过滤。#53529 (Kruglov Pavel) 。 - 为 AArch64、PowerPC、SystemZ 和 RISC-V 启用 JIT 编译。#38217 (Maksim Kita) 。
- 新增设置
rewrite_count_distinct_if_with_count_distinct_implementation,用于将countDistinctIf改写为使用count_distinct_implementation。关闭 #30642。#46051 (flynn) 。 - 通过在合并前并行执行转换,加快
uniq和uniqExact聚合函数状态的合并。#50748 (Jiebin Sun) 。 - 针对大量变长键场景,优化 Nullable String 键的聚合性能。#51399 (LiuNeng) 。
- 在 Analyzer 中新增了一个基于原像的时间过滤器优化 pass。SSB 在 ICX 设备 (Intel Xeon Platinum 8380 CPU,80 核,160 线程) 上的性能实验表明,启用 Experimental analyzer 后,这一变更可将几何平均 QPS 提升 8.5%。#52091 (Zhiguo Zhou) 。
- 如果
uniqExact(COUNT DISTINCT) 函数中的所有哈希集均为单层结构,则可优化合并过程。#52973 (Jiebin Sun) 。 Join表引擎:不再克隆包含所有列的哈希连接数据结构。#53046 (Duc Canh Le).- 实现原生
ORC输入格式,无需使用 “apache arrow” 库即可提升性能。#53324 (李扬) 。 - 该仪表板会通知服务器压缩数据,这对于在慢速网络连接下查看较大时间范围的数据很有帮助。例如,一个包含 86400 个点的图表未压缩时可能有 1.5 MB,而使用
br压缩后只有 60 KB。#53569 (Alexey Milovidov). - 进一步提高 BACKUP 和 RESTORE 对线程池的利用率。#53649 (Nikita Mikhaylov) 。
- 启动时并行加载文件系统缓存元数据。可通过缓存配置中的
load_metadata_threads设置项进行配置 (默认值:1) 。相关内容见 #52037。#52943 (Kseniia Sumarokova) 。 - 优化
move_primary_key_columns_to_end_of_prewhere。#53337 (Han Fei) 。 - 这项优化改进了与 ClickHouse Keeper 的交互。此前,调用方可以多次注册同一个 watch 回调。在这种情况下,每个条目都会占用内存,而且同一个回调也会被重复调用多次,这并没有太大意义。为避免这种情况,调用方原本需要自行编写一些逻辑,避免重复添加相同的 watch。此次变更后,如果 watch 回调通过 shared_ptr 传递,这种去重会在内部自动完成。 #53452 (Alexander Gololobov).
- 在 file/s3/url/hdfs/azure 函数中,为 count 操作缓存文件中的行数。可通过设置
use_cache_for_count_from_files启用或禁用该缓存 (默认启用) 。这是对 https://github.com/ClickHouse/ClickHouse/pull/53637 的延续。#53692 (Kruglov Pavel). - 更精细的线程管理可使 S3 表函数在处理大量文件时的速度提升超过约 25%。#53668 (pufit) 。
改进
- 添加
stderr_reaction配置/设置,用于控制当外部命令的 stderr 中有数据时如何处理 (none、log 或 throw) 。这有助于简化对外部命令的调试。#43210 (Amos Bird) 。 - 向
system part_log和 merge 表中添加partition列。#48990 (Jianfei Hu) 。 - (索引) 未压缩缓存/标记缓存、mmap 缓存和查询缓存的大小现在都可以在运行时动态配置 (无需重启服务器) 。#51446 (Robert Schulze) 。
- 如果字典是使用复杂键创建的,则会自动选择 “complex key” 布局变体。#49587 (xiebin) 。
- 新增设置
use_concurrency_control,便于更好地测试新的并发控制功能。#49618 (Alexey Milovidov). - 为拼写错误的数据库和表名增加了建议提示。#49801 (Yarik Briukhovetskyi) 。
- 在 Gluten 从 HDFS 读取小文件时,我们发现与 Spark 直接查询相比,耗时更长。对此我们做了一些改进。#50063 (KevinyhZou).
- 会话过期后出现了太多无意义的错误日志,这不是我们想看到的。#50171 (helifu).
- 引入了有时限的 ZooKeeper 回退会话。修复了 system.zookeeper_connection 中针对 DNS 地址的
index列。#50424 (Anton Kozlov) 。 - 新增了在达到 max_partitions_per_insert_block 时记录日志的能力。#50948 (Sean Haynes).
- 为 clickhouse-keeper-client 新增了一批自定义命令 (主要是为了让 ClickHouse 调试更方便) 。#51117 (pufit) 。
- 更新了
azureBlobStorage表函数中对 connection string 的检查,因为包含 “sas” 的 connection string 并不总是以默认端点开头;同时在将 Azure 的容器添加到 URL 后,也更新了连接 URL,使其包含 “sas” 标记。#51141 (SmitaRKulkarni). - 修正了
full_sorting_mergeJOIN 算法中过滤集合的描述。#51329 (Tanay Tummalapalli) 。 - 修复了
max_block_size很大时Aggregator的内存占用问题。#51566 (Nikita Taranov) 。 - 新增
SYSTEM SYNC FILESYSTEM CACHE命令。该命令会将文件系统缓存的内存状态与磁盘上的实际内容进行比较,并在需要时修正内存状态。只有在你手动修改磁盘数据时才需要这样做,但强烈不建议这么做。#51622 (Kseniia Sumarokova). - 尝试为 CH 创建一个通用的代理解析器,同时保持与现有 S3 存储配置代理解析器的向后兼容性。#51749 (Arthur Passos).
- 支持从 file/s3/hdfs/url/azureBlobStorage 表函数读取 Tuple 子列。#51806 (Kruglov Pavel) 。
- 函数
arrayIntersect现在会按第一个参数中对应的顺序返回值。关闭 #27622。#51850 (Yarik Briukhovetskyi) 。 - 新增了新查询,允许在指定的访问存储中创建/删除访问实体,或将访问实体从一个访问存储迁移到另一个访问存储。#51912 (pufit).
- 使
ALTER TABLE FREEZE查询在 Replicated database engine 中不进行复制。#52064 (Mike Kot). - 新增了在意外关闭时刷新系统表的功能。#52174 (Alexey Gerasimchuck).
- 修复了
s3表函数无法使用预签名 URL 的问题。关闭 #50846。#52310 (chen). - 在
system.events和system.metrics表中,新增列name,作为event和metric的别名。关闭 #51257。#52315 (chen) 。 - 在解析器中新增了对语法
CREATE UNIQUE INDEX的支持,并将其视为空操作,以提升 SQL 兼容性。UNIQUE索引暂不支持。将create_index_ignore_unique = 1设为 1 以忽略查询中的UNIQUE关键字。#52320 (Ilya Yatsishin) 。 - 在 Kafka 引擎的某些设置中增加了对预定义宏 (
{database}和{table}) 的支持:topic、消费者、client_id 等。#52386 (Yury Bogomolov) 。 - 在备份/恢复期间禁用文件系统缓存更新。备份/恢复期间不应更新文件系统缓存,因为这似乎只会拖慢过程而没有任何收益 (因为 BACKUP 命令可能会读取大量数据,把这些数据全部放入文件系统缓存后又立即逐出,并无意义) 。#52402 (Vitaly Baranov) 。
- S3 端点配置支持从根路径使用,并会在需要时自动追加 ’/’。 #47809。 #52600 (xiaolei565)。
- 为 clickhouse-local 支持位置参数选项,并补充全局 UDF 设置 (user_scripts_path 和 user_defined_executable_functions_config) 。#52643 (Yakov Olkhovskiy) 。
system.asynchronous_metrics现已包含指标 “QueryCacheEntries” 和 “QueryCacheBytes”,可用于查看查询缓存。#52650 (Robert Schulze) 。- 新增支持在备份到 S3 时,于
BACKUP语句的SETTINGS子句中使用s3_storage_class参数。#52658 (Roman Vasin). - 新增实用工具
print-backup-info.py,用于解析备份元数据文件并输出备份信息。#52690 (Vitaly Baranov) 。 - 关闭 #49510。目前,database 和表名称区分大小写,但 BI 工具查询
information_schema时,有时使用小写,有时使用大写。因此,我们有information_schemadatabase,其中包含小写表,例如information_schema.tables;也有INFORMATION_SCHEMAdatabase,其中包含大写表,例如INFORMATION_SCHEMA.TABLES。但有些工具会查询INFORMATION_SCHEMA.tables和information_schema.TABLES。提出的解决方案是:在小写和大写的information_schemadatabase 中,同时复制小写和大写表。#52695 (Yarik Briukhovetskyi) 。 - 查询
CHECK TABLE具有更好的性能和可用性 (会发送进度更新,并且可取消) 。#52745 (vdimir) 。 - 新增对元组的
modulo、intDiv和intDivOrZero的支持,方式是将这些函数分发到元组的各个元素上。#52758 (Yakov Olkhovskiy) 。 - 在 clickhouse-client 中,默认会在
xml之后查找yaml和yml配置。#52767 (Alexey Milovidov) 。 - 在合并到非 ‘clickhouse’ 根的配置时,根节点名称不同的配置会被直接跳过,不会抛出异常。#52770 (Yakov Olkhovskiy) 。
- 现在可以为由采样内存分析器跟踪的内存分配指定最小 (
memory_profiler_sample_min_allocation_size) 和最大 (memory_profiler_sample_max_allocation_size) 大小。#52779 (alesapin) 。 - 新增
precise_float_parsing设置,用于切换浮点数解析方式 (快速/精确) 。#52791 (Andrey Zvonov) 。 - 对
clickhouse-keeper(符号链接) 使用与clickhouse-keeper(可执行文件) 相同的默认 path。#52861 (Vitaly Baranov) 。 - 改进表函数
remote的错误消息。关闭 #40220。#52959 (jiyoungyoooo). - 新增支持在
RESTORE查询的SETTINGS子句中指定自定义存储策略。#52970 (Victor Krasnov). - 新增了在执行备份操作时对 S3 请求进行限流的能力 (
BACKUP和RESTORE命令现支持遵循s3_max_[get/put]_[rps/burst]) 。#52974 (Daniel Pozo Escalona). - 新增设置,可在用于管理复制用户自定义函数或采用复制存储的访问控制实体的查询中忽略 ON CLUSTER 子句。#52975 (Aleksei Filatov) 。
- 为 JOIN 步骤添加了 EXPLAIN actions。#53006 (Maksim Kita).
- 使
hasTokenOrNull和hasTokenCaseInsensitiveOrNull在 needle 为空时返回 null。#53059 (ltrk2). - 允许限制文件系统缓存可使用的路径。主要对动态磁盘有用。如果在 server 配置中指定了
filesystem_caches_path,则所有文件系统缓存的路径都将被限制在此目录下。例如,如果缓存配置中的path是相对路径,它将被放在filesystem_caches_path中;如果缓存配置中的path是绝对路径,则必须位于filesystem_caches_path内。如果配置中未指定filesystem_caches_path,则其行为将与早期版本相同。#53124 (Kseniia Sumarokova) 。 - 新增了一批自定义命令 (主要是为了让 ClickHouse 的调试更方便) 。#53127 (pufit).
- 在 schema 推断期间添加文件名诊断信息——当你使用通配符处理多个文件时,这会很有帮助。#53135 (Alexey Milovidov) 。
- 如果第二个连接不允许创建 session,客户端将通过主连接加载建议。 #53177 (Alexey Gerasimchuck).
- 在
SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM]查询中添加 EXCEPT 子句,例如SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP。#53280 (Nikolay Degterinsky) 。 - 将
max_concurrent_queries的默认值从 100 提高到 1000。如果查询负载不高,而且大部分时间都在等待网络,那么有很多并发查询是没问题的。注意:不要混淆并发查询和 QPS:例如,ClickHouse server 在并发查询数不到 100 的情况下,也可以达到数万 QPS。#53285 (Alexey Milovidov) 。 - 限制并发后台分区 optimize 合并的数量。#53405 (Duc Canh Le) 。
- 新增了一个设置
allow_moving_table_directory_to_trash,可在复制/恢复Replicated数据库时忽略Directory for table data already exists错误。#53425 (Alexander Tokmakov) 。 - 如果服务器设置
asynchronous_metrics_update_period_s和asynchronous_heavy_metrics_update_period_s被误配置为 0,现在将不再终止应用程序,而是会以更平稳的方式失败。#53428 (Robert Schulze). - ClickHouse 服务器现在会在重新加载配置时遵从通过 cgroups 更改的内存限制。#53455 (Robert Schulze) 。
- 新增了可在
DETACH、DROP或服务器关闭时禁用分布式表 flush 的功能。#53501 (Azat Khuzhin). domainRFC函数现已支持用方括号括起来的 IPv6。 #53506 (Chen768959).- 对用于 backups 的 S3 CopyObject 请求采用更长的超时时间。#53533 (Michael Kolupaev) 。
- 新增了服务器设置
aggregate_function_group_array_max_element_size。该设置用于限制groupArray函数在序列化时的数组大小。默认值为16777215。#53550 (Nikolai Kochetov) 。 - 新增了
SCHEMA作为DATABASE的别名,以提升与 MySQL 的兼容性。#53587 (Daniël van Eeden) 。 - 为系统数据库中的表添加异步指标,例如
TotalBytesOfMergeTreeTablesSystem。此更改修复了 #53603。#53604 (Alexey Milovidov) 。 - Play UI 和 Dashboard 中的 SQL 编辑器将不再使用 Grammarly。#53614 (Alexey Milovidov).
- 作为专家级设置项,现在可以 (1) 配置 [索引] 标记缓存/未压缩缓存的 size_ratio (即受保护队列的相对大小) , (2) 配置索引标记缓存和索引未压缩缓存的缓存策略。#53657 (Robert Schulze) 。
- 在 TCPHandler 的查询数据包中新增了客户端信息校验。#53673 (Alexey Gerasimchuck) 。
- 在与 Microsoft Azure 交互时如果发生网络错误,则重试加载 parts。#53750 (SmitaRKulkarni).
- 异常将显示堆栈跟踪,物化视图异常会向上传递。#53766 (Ilya Golshtein) 。
- 如果未指定主机名或端口,keeper 客户端会尝试在 ClickHouse 的 config.xml 中查找连接字符串。#53769 (pufit) 。
- 新增 profile 事件
PartsLockMicroseconds,用于显示在 MergeTree 表引擎家族中持有数据分区片段锁的时长 (以微秒为单位) 。#53797 (alesapin). - 使 keeper 中 RAFT 限制的重连次数上限可配置。此配置有助于在当前连接中断时,让 keeper 更快地与其他节点重新建立连接。#53817 (Pengyuan Bian) 。
- 在表定义中忽略外键,以提高与 MySQL 的兼容性,这样用户就无需重写 SQL 中与外键相关的部分,参见 #53380。#53864 (jsc0218).
构建/测试/打包改进
- 不要将 ClickHouse 二进制文件中的符号暴露给动态链接器。这或许能修复 #43933。#47475 (Alexey Milovidov) 。
- 在 clickhouse-server 软件包中添加
clickhouse-keeper-client符号链接。#51882 (Mikhail f. Shiryaev) 。 - 将 https://github.com/elliotchance/sqltest 添加到 CI 中,用于报告对 SQL 2016 的符合情况。#52293 (Alexey Milovidov) 。
- 将 PRQL 升级至 0.9.3。#53060 (Maximilian Roos) 。
- CI 检查中的系统表已导出到 ClickHouse Cloud。#53086 (Alexey Milovidov).
- 编译器的 profile 数据 (
-ftime-trace) 会上传到 ClickHouse Cloud。#53100 (Alexey Milovidov) 。 - 加快 Debug 和 Tidy 构建。#53178 (Alexey Milovidov) 。
- 通过清理大量无用内容来加快构建速度。一个经常被包含的头文件受到了 boost 的污染。#53180 (Alexey Milovidov).
- 进一步清理垃圾代码。#53182 (Alexey Milovidov) 。
- 函数
arrayAUC之前使用了大量复杂的 C++ 模板——现已移除。 #53183 (Alexey Milovidov). - 无论是否使用
ccache,某些翻译单元都会被重新构建。问题已查明并修复。#53184 (Alexey Milovidov) 。 - 编译器的 profile 数据 (
-ftime-trace) 已上传到 ClickHouse Cloud。这是继 #53100 之后的第二次尝试。#53213 (Alexey Milovidov) 。 - 将 CI 中有状态测试的日志导出至 ClickHouse Cloud。#53351 (Alexey Milovidov).
- 在压力测试期间从 CI 导出日志。#53353 (Alexey Milovidov) 。
- 在 fuzzer 中导出 CI 日志。#53354 (Alexey Milovidov) 。
- 在
clickhouse start命令中保留环境变量参数。修复了 #51962。#53418 (Mikhail f. Shiryaev) 。 - 跟进 #53418。对 install_check.py 做了一些小改进,并新增测试,以验证执行
init.d start时 ENV 参数能否正确传递给主进程。#53457 (Mikhail f. Shiryaev) 。 - 重组 CMake 中的文件管理,以避免潜在的重复。例如,
indexHint.cpp同时在dbms_sources和clickhouse_functions_sources中重复出现。#53621 (Amos Bird) 。 - 将 snappy 升级至 1.1.10。 #53672 (李扬).
- 通过梳理部分依赖并移除一些重复项,对 cmake 构建做了小幅改进。每个提交都附有对所做更改的简短说明。#53759 (Amos Bird) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 在构建过程中,当标记超过一个时,不要重置 (Experimental) Annoy 索引 #51325 (Tian Xinhui) 。
- 修复了 RESTORE 期间临时目录使用不当的问题 #51493 (Azat Khuzhin) 。
- 修复 Nullable(IPv4) 的二元算术运算问题 #51642 (Yakov Olkhovskiy) 。
- 支持 IPv4 和 IPv6 数据类型作为字典属性 #51756 (Yakov Olkhovskiy) 。
- 修复了压缩标记校验和的问题 #51777 (SmitaRKulkarni) 。
- 修复了在 CSV 尽力解析过程中误将逗号解析为日期时间组成部分的问题 #51950 (Kruglov Pavel).
- 可执行 UDF 带有参数时不再抛出异常 #51961 (Nikita Taranov) 。
- 修复
ALTER DELETE查询中跳过索引和投影重算的问题 #52530 (Anton Popov). - MaterializedMySQL:修复了 ReadBuffer::read 中的无限循环问题 #52621 (Val Doroshchuk) 。
- 仅对
clickhouse方言加载建议 #52628 (János Benjamin Antal) 。 - 按需初始化和销毁 ares 通道。#52634 (Arthur Passos) 。
- 修复了使用 OR 表达式过滤虚拟列时的问题 #52653 (Azat Khuzhin).
- 修复函数
tuple在仅有一个稀疏列参数时的崩溃问题 #52659 (Anton Popov). - 修复集群中的命名集合问题 #52687 (Al Korgun) 。
- 修复在多阶段
PREWHERE情况下读取不必要列的问题 #52689 (Anton Popov). - 修复多列排序中使用 NULL 优先方向时出现的异常排序结果 #52761 (copperybean).
- 修复 Keeper 重新配置时的数据竞争 #52804 (Antonio Andelic).
- 修复了在 limit 较大时对稀疏列排序的问题 #52827 (Anton Popov).
- clickhouse-keeper:修复基于 poll 的服务器实现。#52833 (Andy Fiddaman) 。
- 让 regexp analyzer 能够识别命名捕获组 #52840 (Han Fei) 。
- 修复 clickhouse-local 中
~PushingAsyncPipelineExecutor里可能触发的断言 #52862 (Kruglov Pavel) 。 - 修复空
Nested(Array(LowCardinality(...)))的读取问题 #52949 (Anton Popov) 。 - 为 session_log 新增了测试,并修复了登录与注销之间不一致的问题。#52958 (Alexey Gerasimchuck) 。
- 修复
show create mysql table中的密码泄露问题 #52962 (Duc Canh Le) 。 - 将 CreateSetAndFilterOnTheFlyStep 中的稀疏列格式转换为完整格式 #53000 (vdimir) 。
- 修复了 fs 缓存中删除 key 前缀为空的目录时出现的一种罕见竞态条件 #53055 (Kseniia Sumarokova) 。
- 修复了 ZstdDeflatingWriteBuffer 有时会导致输出被截断的问题 #53064 (Michael Kolupaev) 。
- 修复异步 flush 查询中 part_log 中的 query_id 问题 #53103 (Raúl Marín).
- 修复了可能由缓存引发的错误 “Read unexpected size” #53121 (Kseniia Sumarokova).
- 禁用新版 Parquet 编码器 #53130 (Alexey Milovidov) 。
- 修复 “Not-ready Set” 异常 #53162 (Nikolai Kochetov) 。
- 修复 PostgreSQL 引擎中的字符转义 #53250 (Nikolay Degterinsky) 。
- Experimental session_log 表:新增了 session_log 的测试,并修复了登录与登出状态不一致的问题。#53255 (Alexey Gerasimchuck)。修复了登录成功与登出状态不一致的问题 #53302 (Alexey Gerasimchuck)。
- 修复向 DateTime 添加亚秒级时间间隔时的问题 #53309 (Michael Kolupaev).
- 修复字典中“Context has expired”错误 #53342 (Alexey Milovidov).
- 修复普通投影 AST 格式错误 #53347 (Amos Bird) 。
- 执行 Scalar 时,禁止在表函数中使用 use_structure_from_insertion_table_in_table_functions #53348 (flynn).
- 修复在执行 system.table select 查询时加载 lazy 数据库的问题 #53372 (SmitaRKulkarni).
- 修复了 MaterializedMySQL 中的 system.data_skipping_indices 问题 #53381 (Filipp Ozinov) 。
- 修复 TSV 文件分段引擎中单个回车符的处理问题 #53407 (Kruglov Pavel) 。
- 妥善修复
Context has expired错误 #53433 (Michael Kolupaev) 。 - 修复了在 IN 右侧包含子查询时
timeout_overflow_mode的问题 #53439 (Duc Canh Le) 。 - 修复了 #53152 中的异常行为 #53440 (Zhiguo Zhou) 。
- 修复 path 全为数字时 JSON_QUERY 函数的解析报错 #53470 (KevinyhZou).
- 修复并行 FINAL 查询中的列顺序错误。#53489 (Nikolai Kochetov) 。
- 修复了启用 do_not_merge_across_partitions_select_final 时从 ReplacingMergeTree 执行 SELECT 的问题 #53511 (Vasily Nemkov).
- 关闭时先将 async insert 队列刷写到存储 #53547 (joelynch).
- 修复在稀疏列上进行 join 时发生的崩溃 #53548 (vdimir).
- 修复 Set 跳过索引在函数参数不正确时可能出现的未定义行为 #53559 (Azat Khuzhin).
- 修复倒排索引中可能出现的 UB (Experimental 功能) #53560 (Azat Khuzhin) 。
- 修复:
interpolate表达式会使用源列,而不是使用select表达式中的同名别名。#53572 (Yakov Olkhovskiy) 。 - 修复 EXPLAIN PLAN index=1 中被跳过的粒度数量 #53616 (wangxiaobo).
- 正确处理
DelayedSource中的总计和极值 #53644 (Antonio Andelic) 。 - 修复变更管道中预备 Set 缓存卡住的问题 #53645 (Nikolai Kochetov).
- 修复了在
UPDATE和DELETE查询的谓词中使用 JSON 类型子列时,变更操作出现的问题。#53677 (VanDarkholme7). - 修复 full_sorting_merge join 中的过滤器下推问题 #53699 (vdimir).
- 尝试修复
NULL::LowCardinality(Nullable(...)) NOT IN相关缺陷 #53706 (Andrey Zvonov) 。 - 修复:对稀疏列执行排序后的 DISTINCT 时出现的问题 #53711 (Igor Nikonov).
transform:正确处理多行情况下的默认列 #53742 (Salvatore Mesoraca) 。- 修复 parseDateTime 中的 fuzzer 崩溃 #53764 (Robert Schulze).
- MaterializedPostgreSQL:修复 getCreateTableQueryImpl 中未处理的异常 #53832 (Kseniia Sumarokova) 。
- 修复使用 PostgreSQL 引擎时可能出现的段错误 #53847 (Kseniia Sumarokova) 。
- 修复 named_collection_admin 别名问题 #54066 (Kseniia Sumarokova) 。
ClickHouse 发布 23.7,2023-07-27。 演示文稿, 视频
向后不兼容变更
- 新增
NAMED COLLECTION访问类型 (别名为USE NAMED COLLECTION、NAMED COLLECTION USAGE) 。此 PR 属于向后不兼容变更,因为该访问类型默认是禁用的 (其父级访问类型NAMED COLLECTION ADMIN也默认禁用) 。提案见 #50277。如需授权,请使用GRANT NAMED COLLECTION ON collection_name TO user或GRANT NAMED COLLECTION ON * TO user;若要授予这些授权,则需要在配置中启用named_collection_admin(此前名为named_collection_control,因此会继续保留为别名) 。#50625 (Kseniia Sumarokova). - 修复了
system.parts列名last_removal_attemp_time中的拼写错误,现更名为last_removal_attempt_time。#52104 (filimonov). - 默认将 distributed_ddl_entry_format_version 升级到版本 5 (启用 OpenTelemetry 和 initial_query_idd 透传) 。这意味着在降级后,将无法处理 distributed DDL 的现有条目 (不过请注意,通常不应该存在这类未处理条目) 。#52128 (Azat Khuzhin).
- 现在会像检查普通元数据一样检查投影元数据。如果某个表包含无效投影,此变更可能导致 server 无法启动。一个例子是投影在 PK 中创建了位置列 (例如
projection p (select * order by 1, 4);这在表 PK 中是不允许的,并且可能在 insert/merge 期间导致崩溃) 。请在更新前删除这类投影。修复 #52353。#52361 (Nikolai Kochetov). - 实验性功能
hashid因存在缺陷而被移除。它的实现质量从一开始就存疑,也始终未走出实验阶段。此变更关闭了 #52406。#52449 (Alexey Milovidov).
新特性
- 新增
Overlay数据库引擎,可将多个数据库组合为一个。新增Filesystem数据库引擎,可将文件系统中的目录表示为一组隐式可用的表,并自动检测 format 和结构。新的S3数据库引擎可将前缀表示为一组表,从而以只读方式与 S3 存储交互。新的HDFS数据库引擎可用相同方式与 HDFS 存储交互。#48821 (alekseygolub). - 为 Keeper 新增对外部磁盘的支持,用于存储快照和日志。#50098 (Antonio Andelic) 。
- 新增了对多目录选择 (
{}) 通配符的支持。#50559 (Andrey Zvonov) 。 - Kafka connector 可使用经过 URL 编码的凭据进行基本身份验证,从 Schema Registry 拉取 Avro schema。 #49664 (Ilya Golshtein).
- 新增函数
arrayJaccardIndex,用于计算两个数组之间的 Jaccard 相似度。#50076 (FFFFFFFHHHHHHH). - 为
system.settings和类似的表新增is_obsolete列。解决了 #50819。#50826 (flynn) 。 - 增加了对配置文件中加密元素的支持。现在可以在配置文件的叶子元素中使用加密文本。文本使用
<encryption_codecs>部分中的加密编解码器进行加密。#50986 (Roman Vasin) 。 - Grace Hash Join 算法现已可用于 FULL 和 RIGHT JOIN。#49483。#51013 (lgbo) 。
- 新增
SYSTEM STOP LISTEN查询,以实现更优雅的终止。关闭了 #47972。#51016 (Nikolay Degterinsky) 。 - 添加了
input_format_csv_allow_variable_number_of_columns选项。#51273 (Dmitry Kardymon) 。 - 另一个平平无奇的功能:新增函数
substring_index,与 Spark 或 MySQL 中的相同。#51472 (李扬). - 新增一个用于显示 jemalloc bins 统计信息的系统表
jemalloc_bins。示例:SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10。敬请体验。#51674 (Alexander Gololobov) 。 - 新增
RowBinaryWithDefaults格式,在每个列前添加一个额外字节,作为是否使用该列默认值的标志。关闭 #50854。#51695 (Kruglov Pavel) 。 - 新增了
default_temporary_table_engine设置。它与default_table_engine相同,但适用于临时表。#51292。#51708 (velavokr) 。 - 新增了
initcap/initcapUTF8函数,可将每个单词的首字母转为大写,其余字母转为小写。#51735 (Dmitry Kardymon) 。 - 现在,创建表时已支持在列定义中使用
PRIMARY KEY语法。列会按其定义顺序添加到主索引中。#51881 (Ilya Yatsishin). - 新增了在日志文件和错误日志文件名中使用日期和时间格式说明符的能力,可在配置文件 (
log和errorlog标签) 或命令行参数 (--log-file和--errorlog-file) 中使用。#51945 (Victor Krasnov). - 在 HTTP 请求头中新增了峰值内存占用统计。#51946 (Dmitry Kardymon) 。
- 新增了用于匹配字符串中子序列的
hasSubsequence函数 (以及CaseInsensitive和UTF8版本) 。#52050 (Dmitry Kardymon) 。 - 为兼容 PostgreSQL,新增
array_agg作为groupArray的别名。关闭 #52100。 ### 面向用户可见变更的文档条目。 #52135 (flynn). - 新增
any_value,作为any聚合函数的兼容别名。关闭 #52140。#52147 (flynn). - 新增聚合函数
array_concat_agg,以兼容 BigQuery;它是groupArrayArray的别名。关闭 #52139。#52149 (flynn). - 新增
OCTET_LENGTH作为length的别名。关闭 #52153。#52176 (FFFFFFFHHHHHHH) 。 - 新增了
firstLine函数,用于从多行字符串中提取第一行。该改动修复了 #51172。#52209 (Mikhail Koviazin) 。 - 为
Interval数据类型添加 KQL 风格的格式化支持。这仅在兼容Kusto查询语言时才需要。#45671 (ltrk2) 。 - 新增
SYSTEM FLUSH ASYNC INSERT QUEUE查询,用于将所有待处理的异步插入刷写到目标表中。新增服务端设置async_insert_queue_flush_on_shutdown(默认为true) ,用于确定在优雅停机时是否刷写异步插入队列。async_insert_threads现也成为服务端设置。#49160 (Anton Popov). - 为兼容 PostgreSQL,新增了别名
current_database以及新函数current_schemas。#51076 (Pedro Riera). - 为函数
today新增别名curdate/current_date,并为now新增别名current_timestamp。#52106 (Lloyd-Pottiger) 。 - 支持 async insert 的
async_deduplication_token。#52136 (Han Fei) 。 - 新增设置
disable_url_encoding,可在 URL engine 中禁用对 URI 中 path 的解码/编码。#52337 (Kruglov Pavel) 。
性能提升
- 默认启用稀疏序列化格式的自动选择功能。这会提升性能。该格式自 22.1 版本起受支持。进行此更改后,可能无法再降级到早于 22.1 的版本。降级时可能需要设置
ratio_of_defaults_for_sparse_serialization=0.937555153。你可以通过为 MergeTree 表设置ratio_of_defaults_for_sparse_serialization = 1来禁用稀疏序列化格式。#49631 (Alexey Milovidov) 。 - 默认开启
move_all_conditions_to_prewhere和enable_multiple_prewhere_read_steps设置。#46365 (Alexander Gololobov) 。 - 通过调优内存分配器,提升了部分查询的性能。#46416 (Azat Khuzhin) 。
- 现在,我们在
MergeTreePrefetchedReadPool中和MergeTreeReadPool一样使用固定大小的任务。此外,从现在起,S3 请求也使用连接池。#49732 (Nikita Taranov) 。 - 将更多操作下推到 join 的右侧。 #50532 (Nikita Taranov) 。
- 通过预留哈希表大小来优化 grace_hash join (重新提交) 。#50875 (lgbo).
- 在
OpenedFileCache上等待锁有时会比较明显。我们将其拆分为多个子映射 (每个子映射都有自己的锁) ,以避免锁争用。#51341 (Nikita Taranov). - 将包含主键列的条件移至 PREWHERE 事件链的末尾。其思路是,包含 PK 列的条件很可能会在 PK 分析中使用,因此对 PREWHERE 过滤带来的额外收益不大。#51958 (Alexander Gololobov).
- 通过内联 SipHash,加速 String 类型的
COUNT(DISTINCT)。在 ICX 设备 (Intel Xeon Platinum 8380 CPU,80 核、160 线程) 上对 OnTime 进行的性能测试表明,这一改动可使查询 Q8 的 QPS 提升 11.6%,而对其他查询没有影响。#52036 (Zhiguo Zhou) 。 - 默认启用
allow_vertical_merges_from_compact_to_wide_parts。这将在合并期间节省内存使用量。#52295 (Alexey Milovidov). - 修复了错误的投影分析导致主键失效的问题。此问题仅在
query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1时存在。此修复解决了 #48823。此修复解决了 #51173。#52308 (Amos Bird) 。 - 减少
FileCache::loadMetadata中的系统调用次数——在配置了文件系统缓存时,可加快服务器启动速度。#52435 (Raúl Marín) 。 - 通过在后台下载剩余数据,可为 File 段大小设置严格的下界值。File 段的最小大小 (如果实际文件大小更大) 由 cache 配置项
boundary_alignment指定,默认值为4Mi。后台线程数由 cache 配置项background_download_threads指定,默认值为2。此外,在此 PR 中,max_file_segment_size也已从8Mi提高到32Mi。#51000 (Kseniia Sumarokova) 。 - 将 S3 的默认超时时间从 30 秒下调至 3 秒,并将其他 HTTP 的默认超时时间从 180 秒下调至 30 秒。#51171 (Michael Kolupaev) 。
- 新增设置
merge_tree_determine_task_size_by_prewhere_columns。如果设为true,则确定读取任务大小时只会考虑PREWHERE部分中的列大小;否则,会考虑查询中的所有列。#52606 (Nikita Taranov).
改进
- 在 s3/file/url/… 表函数中使用 read_bytes/total_bytes_to_read 作为进度条,以便更准确地显示进度。#51286 (Kruglov Pavel) 。
- 引入表设置
wait_for_unique_parts_send_before_shutdown_ms,用于指定副本在关闭用于 replicated send 的服务器间 handler 之前的等待时长。同时还修复了表与服务器间 handler 关闭顺序不一致的问题:现在 server 会先关闭表,之后才会关闭服务器间 handler。#51851 (alesapin) 。 - 允许使用 SQL 标准
FETCH而无需OFFSET。参见 https://antonz.org/sql-fetch/。[#51293](https://github.com/ClickHouse/ClickHouse/pull/51293) (Alexey Milovidov) 。 - 允许在配置中使用新的
http_forbid_headers部分,对 URL/S3 表函数的 HTTP 请求头进行过滤。支持精确匹配和正则表达式过滤。#51038 (Nikolay Degterinsky) 。 - 不要在日志中显示
16 EiB可用空间之类的消息,因为这毫无意义。此修复关闭了 #49320。#49342 (Alexey Milovidov). - 适当检查
sleepEachRow函数的限制。新增设置function_sleep_max_microseconds_per_block。这是通用查询 fuzzer 所必需的。#49343 (Alexey Milovidov) 。 - 修复了
geoHash函数中的两个问题。#50066 (李扬) 。 - 将 async insert flush 查询记入
system.query_log。#51160 (Raúl Marín) 。 - 函数
date_diff和age现已支持毫秒/微秒单位,并可按微秒精度运行。#51291 (Dmitry Kardymon) 。 - 改进 clickhouse-keeper-client 中的路径解析。 #51359 (Azat Khuzhin).
- 一个依赖 ClickHouse 的第三方产品 (Gluten:可将 Spark SQL 性能翻倍的插件) 存在一个缺陷。此修复可避免该产品在从 HDFS 读取时发生堆溢出。 #51386 (李扬).
- 新增了可禁用 S3 原生复制的功能 (用于 BACKUP/RESTORE 的设置
allow_s3_native_copy,以及用于s3/s3_plain磁盘的s3_allow_native_copy) 。#51448 (Azat Khuzhin) 。 - 向
system.parts表中添加列primary_key_size,用于显示磁盘上压缩后的主键大小。修复 #51400。#51496 (Yarik Briukhovetskyi). - 允许在没有 procfs、主目录不存在以及缺少 glibc 名称解析插件的情况下运行
clickhouse-local。#51518 (Alexey Milovidov) 。 - 在 rename_files_after_processing 设置中,为 rull 文件名新增占位符
%a。#51603 (Kruglov Pavel) 。 - 在
system.parts_columns中新增列modification_time。#51685 (Azat Khuzhin) 。 - 为 CSV 格式新增设置
input_format_csv_use_default_on_bad_values,允许在单个字段解析失败时插入默认值。#51716 (KevinyhZou) 。 - 新增了在发生意外崩溃后将崩溃日志刷写到磁盘的功能。#51720 (Alexey Gerasimchuck).
- 修复了 dashboard 页面中与身份验证无关的错误无法显示的问题。还修复了图表“重叠”的问题。 #51744 (Zach Naimon).
- 允许 UUID 转换为 UInt128。#51765 (Dmitry Kardymon) 。
- 新增了对接受 Nullable 参数的
range函数的支持。#51767 (Dmitry Kardymon) 。 - 将
toyear(x) = c这类条件改写为c1 <= x < c2。#51795 (Han Fei) 。 - 改进语句
SHOW INDEX的 MySQL 兼容性。#51796 (Robert Schulze) 。 - 修复了
use_structure_from_insertion_table_in_table_functions无法与MATERIALIZED和ALIAS列一起使用的问题。关闭了 #51817。关闭了 #51019。#51825 (flynn) 。 - 缓存字典现在只会从数据源请求唯一键。关闭了 #51762。#51853 (Maksim Kita) 。
- 修复了在指定 FORMAT 时,设置未应用于 EXPLAIN 查询的问题。#51859 (Nikita Taranov) 。
- 为与 SELECT 查询保持兼容,在 DESCRIBE TABLE 查询中允许将 SETTINGS 放在 FORMAT 之前。关闭 #51544。#51899 (Nikolay Degterinsky) 。
- 经 Var-Int 编码的整数 (例如用于 native protocol) 现在可使用完整的 64 位范围。建议 3rd party 客户端相应更新其 var-int 代码。#51905 (Robert Schulze) 。
- 证书变更时可自动更新,无需手动执行 SYSTEM RELOAD CONFIG。#52030 (Mike Kot) 。
- 新增了
allow_create_index_without_type设置,允许忽略未指定TYPE的ADD INDEX查询。标准 SQL 查询将直接成功执行,而不会更改表 schema。#52056 (Ilya Yatsishin) 。 - 从服务器启动开始,日志消息就会写入
system.text_log。#52113 (Dmitry Kardymon) 。 - 在 HTTP 端点具有多个 IP 地址且第一个地址不可达时,此前会抛出超时异常。现已改进会话创建逻辑,以处理所有已解析出的端点。#52116 (Aleksei Filatov).
- Avro 输入格式现已支持 Union,即使其中只包含一种类型。关闭 #52131。#52137 (flynn) 。
- 添加设置
optimize_use_implicit_projections,用于禁用隐式投影 (当前仅有min_max_count投影) 。#52152 (Amos Bird) 。 - 此前可利用函数
hasToken触发无限循环。现在这一可能性已被消除。此修复关闭了 #52156。#52160 (Alexey Milovidov) 。 - 以乐观方式创建 ZK 上级节点。#52195 (Raúl Marín) 。
- 修复了 #50582。避免在顺序读取和处理常量的某些情况下出现
Not found column ... in block错误。#52259 (Chen768959) 。 - 尽可能在 ClickHouse 侧尽早检查 S2 Geo 基本类型是否无效。此项已关闭:#27090。#52260 (Nikita Mikhaylov) 。
- 当
query_plan_optimize_projection = 1时,补回缺失的 projection QueryAccessInfo。此项修复解决了 #50183。此项修复解决了 #50093。#52327 (Amos Bird) 。 - 当
ZooKeeperRetriesControl重新抛出错误时,显示其原始 stack trace 比显示ZooKeeperRetriesControl自身的 stack trace 更有用。#52347 (Vitaly Baranov). - 即使某些磁盘不支持零拷贝复制,也会等待零拷贝复制锁。#52376 (Raúl Marín) 。
- 现在,只有在表被关闭后,服务器间端口才会关闭。#52498 (alesapin) 。
Experimental 功能
- 写入 Parquet 文件的速度提升了 10 倍,现已支持多线程,速度几乎与读取相当。#49367 (Michael Kolupaev)。该功能由设置
output_format_parquet_use_custom_encoder控制,默认处于禁用状态,因为该特性仍不够完善。 - 新增对 PRQL 作为查询语言的支持。#50686 (János Benjamin Antal)。
- 允许为自定义磁盘指定磁盘名称。此前,自定义磁盘会使用内部生成的磁盘名。现在可以通过
disk = disk_<name>(...)来实现 (例如,磁盘名将为name) 。#51552 (Kseniia Sumarokova)。此语法可能会在本次发布中调整。 - (experimental MaterializedMySQL) 修复了在
mysqlxx::Pool::Entry断开连接后继续使用时导致崩溃的问题。#52063 (Val Doroshchuk)。 - (experimental MaterializedMySQL) MaterializedMySQL 现已支持
CREATE TABLE ... AS SELECT..。#52067 (Val Doroshchuk)。 - (experimental MaterializedMySQL) 为 MaterializedMySQL 引入了将文本类型自动转换为 utf8 的功能。#52084 (Val Doroshchuk)。
- (experimental MaterializedMySQL) MaterializedMySQL 现已支持在 DDL 中使用不带引号的 UTF-8 字符串。#52318 (Val Doroshchuk)。
- (experimental MaterializedMySQL) MaterializedMySQL 现已支持双引号注释。#52355 (Val Doroshchuk)。
- 将 Intel QPL 从 v1.1.0 升级到 v1.2.0;将 Intel accel-config 从 v3.5 升级到 v4.0;修复了 Device IOTLB miss 对 IAA 加速器性能影响较大的问题。#52180 (jasperzhu)。
session_timezone设置 (于 23.6 版本中新增) 被降为实验性功能。#52445 (Alexey Milovidov)。- ClickHouse Keeper 现已支持 ZooKeeper 的
reconfig命令,可进行增量重配置,并可通过keeper_server.enable_reconfiguration设置启用。支持添加 server、移除 server,以及更改 server 优先级。#49450 (Mike Kot)。该功能疑似尚未完整实现。
构建/测试/打包改进
- 在 CI 中新增适用于 Linux RISC-V 64 的实验性 ClickHouse 构建。 #31398 (Alexey Milovidov).
- 新增启用 analyzer 时的集成测试检查。 #50926 #52210 (Dmitry Novik).
- Rust 的可复现构建。 #52395 (Azat Khuzhin).
- 更新 Cargo 依赖。 #51721 (Raúl Marín).
- 使函数
CHColumnToArrowColumn::fillArrowArrayWithArrayColumnData能够处理 Nullable 数组;这类数组在 ClickHouse 中虽不可能存在,但 Gluten 需要它。 #52112 (李扬). - 我们已将 CCTZ 库更新到 master,但没有用户可见的变更。 #52124 (Alexey Milovidov).
system.licenses表现在已包含硬分叉版本的库 Poco。此更改关闭了 #52066。 #52127 (Alexey Milovidov).- 检查是否存在错误的标点用法:例如在逗号前加空格,写成
Hello ,world,而不是Hello, world。 #52549 (Alexey Milovidov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复 MaterializedPostgreSQL 的 syncTables 问题 #49698 (Kseniia Sumarokova) 。
- 修复启用
optimize_aggregators_of_group_by_keys时 projection 的问题 #49709 (Amos Bird). - 修复 JOIN 场景下的 optimize_skip_unused_shards 问题 #51037 (Azat Khuzhin) 。
- 修复 formatDateTime() 在处理带小数部分的负 datetime64 时的问题 #51290 (Dmitry Kardymon).
- 函数
hasToken*之前完全不正确。为 #43358 添加测试 #51378 (Alexey Milovidov) 。 - 修复了将函数移到排序前这一优化中的问题。#51481 (Nikolai Kochetov) 。
- 修复 Pipe::unitePipes 在 FINAL 中的块结构不匹配问题 #51492 (Nikita Taranov) 。
- 修复所有分片权重均为零的集群中出现的 SIGSEGV (修复 INSERT INTO FUNCTION clusterAllReplicas()) #51545 (Azat Khuzhin) 。
- 修复对冲请求超时问题 #51582 (Azat Khuzhin) 。
- 修复 ANTI join 在涉及 NULL 时的逻辑错误 #51601 (vdimir).
- 修复了将 ‘IN’ 条件下推到 PREWHERE 的问题 #51610 (Alexander Gololobov) 。
- 不要对 ASOF/ANTI join 应用 PredicateExpressionsOptimizer #51633 (vdimir).
- 修复了 ReplicatedMergeTree 在使用 merging 算法时,async insert 与去重功能配合使用的问题 #51676 (Antonio Andelic).
- 修复了
parseSipHashKey从空列读取的问题 #51804 (Nikita Taranov). - 修复创建无效 EmbeddedRocksdb 表时发生的段错误 #51847 (Duc Canh Le) 。
- 修复向 MongoDB 表插入数据时的问题 #51876 (Nikolay Degterinsky) 。
- 修复 DatabaseCatalog 在关闭时发生的死锁问题 #51908 (Alexander Tokmakov) 。
- 修复子查询运算符相关错误 #51922 (Alexey Milovidov) 。
- 修复异步连接具有多个 IP 地址的主机时出现的问题 #51934 (Kruglov Pavel) 。
- 在 ActionsDAG::merge 后不要移除输入 #51947 (Nikolai Kochetov).
- 在
RemoveManyObjectStorageOperation::finalize中检查引用计数,而不是在execute中检查 #51954 (vdimir) 。 - 允许使用参数化 UDFs #51964 (Alexey Milovidov) 。
- 修复了 toDateTime64() 在处理 2283-12-31 之后日期时的一个小问题 #52130 (Andrey Zvonov) 。
- 修复 WINDOW 函数中 ORDER BY 元组的问题 #52145 (Alexey Milovidov) 。
- 修复聚合表达式包含单调函数时的错误投影分析 #52151 (Amos Bird).
- 修复
groupArrayMoving函数中的报错 #52161 (Alexey Milovidov) 。 - 为范围字典禁用 Direct JOIN #52187 (Duc Canh Le) 。
- 修复卡住的变更测试 (以及一种极其罕见的竞态条件) #52197 (alesapin) 。
- 修复 Web 磁盘中的竞态问题 #52211 (Kseniia Sumarokova) 。
- 修复了 Connection::setAsyncCallback 在收到来自服务器的未知数据包时发生的数据竞争问题 #52219 (Kruglov Pavel) 。
- 修复启动时误删临时数据的问题,并添加测试 #52275 (vdimir).
- 统计 Nullable 列时,不要使用 minmax_count 投影 #52297 (Amos Bird) 。
- MergeTree/ReplicatedMergeTree 处理日志记录时应使用服务器时区 #52325 (Azat Khuzhin) 。
- 修复带有 CTE 且被多次使用的参数化视图问题 #52328 (SmitaRKulkarni) 。
- 禁用用于时间间隔的表达式模板 #52335 (Alexander Tokmakov) 。
- 修复 Keeper 中的
apply_snapshot#52358 (Antonio Andelic) 。 - 更新了 build-osx.md #52377 (AlexBykovski) 。
- 修复
countSubstrings在 needle 为空且 haystack 为列时卡住的问题 #52409 (Sergei Trifonov). - 修复 Merge 表中的普通投影问题 #52432 (Amos Bird).
- 修复 Aggregator 中可能发生的双重释放问题 #52439 (Nikita Taranov).
- 修复了向 Buffer 引擎插入数据时的问题 #52440 (Vasily Nemkov).
- AnyHash 的实现不符合规范。#52448 (Alexey Milovidov) 。
- 检查 OptimizedRegularExpression 的递归深度 #52451 (Alexey Milovidov) 。
- 修复 DatabaseReplicated::startupTables()/canExecuteReplicatedMetadataAlter() 中的数据竞争问题 #52490 (Azat Khuzhin) 。
- 修复函数
transform中的异常中止问题 #52513 (Alexey Milovidov) 。 - 修复删除投影后轻量级删除失效的问题 #52517 (Anton Popov).
- 修复可能出现的错误:“无法释放连接:请先取消” #52585 (Kruglov Pavel).
ClickHouse 发布 23.6,2023-06-29。演示文稿,视频
向后不兼容的变更
- 删除文件系统缓存中的特性
do_not_evict_index_and_mark_files。该特性只会让情况变得更糟。#51253 (Kseniia Sumarokova). - 移除对 Experimental LIVE VIEW 的 ALTER 支持。#51287 (Alexey Milovidov).
- 将
http_max_field_value_size和http_max_field_name_size的默认值下调至 128 KiB。#51163 (Mikhail f. Shiryaev). - 与 CPU 相关的 CGroups 指标现统一为一个指标
CGroupMaxCPU,以提升易用性。设置了 CGroups 限制后,NormalizedCPU 使用指标将按 CGroups 限制而非 CPU 总数进行归一化。这关闭了 #50836。#50835 (Alexey Milovidov).
新功能
- 函数
transform以及带值匹配的CASE现已支持所有数据类型。此更改修复了 #29730、#32387、#50827、#31336 和 #40493。#51351 (Alexey Milovidov) 。 - 新增选项
--rename_files_after_processing <pattern>。此更改修复了 #34207。#49626 (alekseygolub) 。 - 为
INTO OUTFILEclause 添加对TRUNCATEmodifier 的支持。建议在文件已存在时,为INTO OUTFILE使用APPEND或TRUNCATE。#50950 (alekar) 。 - 新增
Redis表引擎和redis表函数,可用于查询外部 Redis server。#50150 (JackyWoo) 。 - 允许在 file/s3/url/hdfs 表函数中使用设置
s3_skip_empty_files、hdfs_skip_empty_files、engine_file_skip_empty_files、engine_url_skip_empty_files跳过空文件。#50364 (Kruglov Pavel) 。 - 新增名为
use_mysql_types_in_show_columns的 setting,用于调整SHOW COLUMNSSQL statement,使客户端通过 MySQL 兼容端口连接时显示对应的 MySQL 类型。#49577 (Thomas Panetti) 。 - 现在调用 Clickhouse-client 时,可以使用 connection string,而不必再通过 “—host”、“—port”、“—user” 等参数指定连接信息。#50689 (Alexey Gerasimchuck) 。
- 新增 setting
session_timezone;在未显式指定时,它会作为 session 的默认 timezone。#44149 (Andrey Zvonov) 。 - Codec DEFLATE_QPL 现在通过 server setting “enable_deflate_qpl_codec” (默认值:false) 控制,而不再通过 setting “allow_experimental_codecs” 控制。这意味着 DEFLATE_QPL 不再属于 Experimental。#50775 (Robert Schulze) 。
性能改进
- 改进了
ReplicatedMergeTree中合并选择与清理任务的调度。当没有可合并或可清理的内容时,这些任务不会再过于频繁地执行。新增设置max_merge_selecting_sleep_ms、merge_selecting_sleep_slowdown_factor、max_cleanup_delay_period和cleanup_thread_preferred_points_per_iteration。此更改应可解决 #31919。#50107 (Alexander Tokmakov)。 - 支持在 cross join 中进行过滤器下推。#50605 (Han Fei)。
- 在启用 QueryProfiler 时,使用线程本地
timer_id代替全局对象,从而提升性能。#48778 (Jiebin Sun)。 - 重写 CapnProto 输入/输出格式以提升性能。Map 列名与 CapnProto 字段名现在大小写不敏感,并修复了嵌套结构字段的读写问题。#49752 (Kruglov Pavel)。
- 优化并行线程下的 Parquet 写入性能。#50102 (Hongbin Ma)。
- 对处理 MATERIALIZED VIEW 和仅包含一个块的存储禁用
parallelize_output_from_storages。#50214 (Azat Khuzhin)。 - 合并 PR #46558。如果块已排好序,则在 sort 过程中避免对块进行置换。#50697 (Alexey Milovidov, Maksim Kita)。
- 并行向 ZooKeeper 发起多个 list 请求,以加快从 system.zookeeper 表读取数据的速度。#51042 (Alexander Gololobov)。
- 加快 time zone 的 DateTime lookup 表初始化。这应能缩短 clickhouse-client 的启动/连接时间,尤其是在 debug 构建中,因为这部分开销较大。#51347 (Alexander Gololobov)。
- 修复了因同步 HEAD 请求导致的数据湖访问缓慢问题。 (与 Iceberg/Deltalake/Hudi 在文件很多时性能较慢有关) 。#50976 (Kseniia Sumarokova)。
- 不再从右侧 GLOBAL JOIN 表读取所有列。#50721 (Nikolai Kochetov)。
Experimental 功能
- 支持 analyzer 的并行副本。#50441 (Raúl Marín).
- 在执行大型合并/变更前增加随机休眠,以便在零拷贝复制场景下让各副本间的负载分布更均匀。#51282 (alesapin).
- 如果
Replicated数据库只有一个分片,且底层表为ReplicatedMergeTree,则不通过该数据库复制ALTER PARTITION查询和变更。#51049 (Alexander Tokmakov).
改进
- 放宽“parts 过多”的阈值,使其更符合当前实践。在长时间运行的 insert 查询期间恢复背压。#50856 (Alexey Milovidov).
- 允许将 CIDR ::ffff:0:0/96 (IPv4 映射地址) 范围内的 IPv6 地址转换为 IPv4 地址。 #49759 (Yakov Olkhovskiy).
- 更新了 MongoDB 协议,以支持 MongoDB 5.1 及更高版本,同时保留了对旧协议版本 (<3.6) 的支持。关闭了 #45621 和 #49879。#50061 (Nikolay Degterinsky) 。
- 添加设置
input_format_max_bytes_to_read_for_schema_inference,用于限制 schema 推断时读取的字节数。关闭了 #50577。#50592 (Kruglov Pavel) 。 - 在 schema 推断中尊重设置
input_format_null_as_default。#50602 (Kruglov Pavel) 。 - 允许通过设置
input_format_csv_skip_trailing_empty_lines、input_format_tsv_skip_trailing_empty_lines和input_format_custom_skip_trailing_empty_lines跳过 CSV/TSV/CustomSeparated format 中末尾的空行 (默认禁用) 。已修复 #49315。#50635 (Kruglov Pavel) 。 - 函数 “toDateOrDefault|OrNull” 和 “accuateCast[OrDefault|OrNull]” 现在可以正确解析数值参数。#50709 (Dmitry Kardymon) 。
- 支持使用空白字符或
\t作为字段分隔符的 CSV,且 Spark 也支持这些分隔符。#50712 (KevinyhZou). - 设置
number_of_mutations_to_delay和number_of_mutations_to_throw现已默认启用,取值分别为 500 和 1000。#50726 (Anton Popov) 。 - 仪表板现已能正确显示缺失值。此更改修复了 #50831。#50832 (Alexey Milovidov) 。
- 新增了在函数
parseDateTimeBestEffort*和parseDateTime64BestEffort*中支持使用 syslog 时间戳格式的日期和时间参数。#50925 (Victor Krasnov). - clickhouse-client 中的命令行参数 “—password” 现在仅可指定一次。#50966 (Alexey Gerasimchuck) 。
- 在集群备份期间,使用
system.parts中的hash_of_all_files来校验 parts 的标识。 #50997 (Vitaly Baranov). - 系统表 zookeeper_connection 的 connected_time 用于标识连接建立的时间 (标准格式) ,并新增了 session_uptime_elapsed_seconds,用于标示已建立连接会话的耗时 (以秒为单位) 。 #51026 (郭小龙).
- 通过利用源数据的块大小,并在每个线程中以增量方式统计总大小,改进了 file/S3/hdfs/url 表函数的进度条。修复了 *Cluster 函数的进度条。此更改关闭了 #47250。#51088 (Kruglov Pavel).
- 在 TCP 协议中向 Progress 数据包添加 total_bytes_to_read,以优化 Progress 进度条的显示。#51158 (Kruglov Pavel) 。
- 借助文件系统缓存,可以更好地检查磁盘上的数据分区片段。#51164 (Anton Popov).
- 修复 fs cache 中
current_elements_num偶尔不正确的问题。#51242 (Kseniia Sumarokova).
构建/测试/打包改进
- 为独立的 Keeper 二进制文件添加嵌入式 keeper-client。#50964 (pufit).
- 现在会使用实际的 LZ4 版本。#50621 (Nikita Taranov).
- ClickHouse server 现在会在发生致命错误时打印已修改 settings 的列表。此更改关闭了 #51137。#51138 (Alexey Milovidov).
- 允许使用 clang-17 构建 ClickHouse。#51300 (Alexey Milovidov).
- SQLancer 检查现已被视为稳定版本,因为它触发的缺陷已被修复。现在,SQLancer 检查失败会被报告为检查状态失败。#51340 (Ilya Yatsishin).
- 将 Dockerfile 中庞大的
RUN拆分为更小的条件块。在同一个RUNlayer 中按需安装必要工具,并在之后将其移除。仅在开始时升级一次操作系统。使用更现代的方式检查已签名的 repository。将基础 repo 降级为 ubuntu:20.04,以解决旧版 docker 中的问题。升级 golang 版本以修复 golang 漏洞。#51504 (Mikhail f. Shiryaev).
缺陷修复 (官方稳定版本中用户可见的异常表现)
- 修正了可执行字典的加载状态报告 #48775 (Anton Kozlov) 。
- 正确处理数据跳过索引和投影的变更 #50104 (Amos Bird).
- 清理移动中的 parts #50489 (vdimir).
- 修复聚合函数中 IP 类型哈希的向后兼容问题 #50551 (Yakov Olkhovskiy).
- 修复 Log 家族表在 TRUNCATE 后返回行数错误的问题 #50585 (flynn).
- 修复
uniqExact并行合并中的问题 #50590 (Nikita Taranov) 。 - 回滚最近的 grace hash join 变更 #50699 (vdimir).
- 查询缓存:尝试修复将
ColumnConst错误转换为ColumnVector<char8_t>的问题 #50704 (Robert Schulze) 。 - 避免在 Keeper 中存储包含未知操作的日志 #50751 (Antonio Andelic) 。
- SummingMergeTree 现已支持 DateTime64 #50797 (Jordi Villar) 。
- 为非常量时区新增兼容性设置 #50834 (Robert Schulze) 。
- 修复缓存条目中 LDAP 参数哈希处理的问题 #50865 (Julian Maicher) 。
- 在 Parquet 格式中,解析 String 中的大整数时会回退处理,而不再抛出异常 #50873 (Kruglov Pavel).
- 修复写入备份时过于频繁检查锁文件的问题 #50889 (Vitaly Baranov).
- 如果已启用按顺序读取,则不要应用投影。#50923 (Nikolai Kochetov) 。
- 修复 Azure Blob 存储迭代器中的竞争条件 #50936 (SmitaRKulkarni).
- 修复
CreatingSets中sort_description的错误传播问题 #50955 (Nikita Taranov) 。 - 修复 Iceberg v2 中可选元数据的解析问题 #50974 (Kseniia Sumarokova) 。
- MaterializedMySQL:为空表覆盖项保留括号 #50977 (Val Doroshchuk) 。
- 修复 BackupCoordinationStageSync::setError() 中发生的崩溃 #51012 (Vitaly Baranov).
- 修复 ColumnLowCardinality 字典写时复制中一个较为隐蔽的损坏问题 #51064 (Michael Kolupaev) 。
- 生成更安全的 IV #51086 (Salvatore Mesoraca) 。
- 修复包含子查询的 SELECT 查询缓存失效问题 #51132 (Robert Schulze) 。
- 修复 Set 索引与常量 Nullable 值比较时的问题。#51205 (Nikolai Kochetov) 。
- 修复 s3 和 s3Cluster 函数中的崩溃问题 #51209 (Nikolay Degterinsky) 。
- 修复了与已编译表达式相关的崩溃问题 #51231 (LiuNeng).
- 修复 StorageURL 在切换 URL 时发生的释放后使用问题 #51260 (Michael Kolupaev) 。
- 更新了参数化视图的检查逻辑 #51272 (SmitaRKulkarni) 。
- 修复同一文件被多次写入备份的问题 #51299 (Vitaly Baranov) 。
- 修复 ActionsDAG 中的 fuzzer 失败问题 #51301 (Alexey Milovidov).
- 清理函数
transform中的无用内容 #51350 (Alexey Milovidov).
ClickHouse 23.5 版本发布,2023-06-08。演示文稿, 视频
升级说明
- 默认压缩标记和主键。这会显著缩短冷查询时间。升级说明:自 22.9 版本起已支持压缩标记和主键。如果你已启用压缩标记或主键,或者安装了 23.5 及更高版本 (这些版本默认启用压缩标记或主键) ,则无法再降级到 22.8 或更早版本。你也可以在服务器配置文件的
<merge_tree>部分中,通过指定compress_marks和compress_primary_key设置来显式禁用压缩标记或主键。升级说明: 如果你是从 22.9 之前的版本升级,应一次性升级所有副本,或在升级前禁用压缩,或者先升级到支持压缩标记但默认未启用的中间版本,例如 23.3。#42587 (Alexey Milovidov). - 使本地对象存储与 S3 对象存储的行为保持一致,修复 append 问题 (关闭 #48465) ,并支持将其配置为独立存储。此变更向后不兼容,因为位于本地对象存储之上的 cache 与旧版本不兼容。#48791 (Kseniia Sumarokova).
- 已移除 Experimental 功能 “in-memory data parts”。该数据格式仍然受支持,但相关设置现在是空操作,系统将改用 compact 或 wide parts。这关闭了 #45409。#49429 (Alexey Milovidov).
- 调整了设置
parallelize_output_from_storages和input_format_parquet_preserve_order的默认值。这使 ClickHouse 在从文件 (例如 CSV 或 Parquet) 读取时可以重排行,从而在很多情况下显著提升性能。若要恢复保序的旧行为,请使用parallelize_output_from_storages = 0、input_format_parquet_preserve_order = 1。#49479 (Michael Kolupaev). - 使 projections 达到生产就绪状态。新增
optimize_use_projections设置,用于控制是否为 SELECT 查询选择 projections。设置allow_experimental_projection_optimization已废弃,不再起作用。#49719 (Alexey Milovidov). - 将
joinGet标记为非确定性 (dictGet也是如此) 。这样一来,就可以在变更中使用它们,而无需额外设置。#49843 (Azat Khuzhin). - 回退 “
groupArrayreturns cannot be nullable” 这一变更 (因为这会破坏Nullable类型上groupArray/groupArrayLast/groupArraySample的 binary compatibility,并很可能导致TOO_LARGE_ARRAY_SIZE或CANNOT_READ_ALL_DATA) 。#49971 (Azat Khuzhin). - 设置
enable_memory_bound_merging_of_aggregation_results现已默认启用。如果你是从 22.12 之前的版本升级,建议在升级完成前将该标志设为false。#50319 (Nikita Taranov).
新功能
- 新增了存储引擎 AzureBlobStorage 和 azureBlobStorage 表函数。其支持的功能与存储/表函数 S3 非常相似 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) (alesapin) (SmitaRKulkarni.
- 新增了原生的 ClickHouse Keeper CLI 客户端,可通过
clickhouse keeper-client使用 #47414 (pufit) 。 - 新增
urlCluster表函数。重构所有 *Cluster 表函数,以减少代码重复。让 schema 推断支持所有可能的 *Cluster 函数签名以及命名集合。关闭 #38499。#45427 (attack204), Pavel Kruglov. - 查询缓存现已可用于生产 workloads。#47977 (Robert Schulze)。查询缓存现已支持带有
totals和extremesmodifier 的查询。#48853 (Robert Schulze)。为保持向后兼容性,allow_experimental_query_cachesetting 现已标记为 Obsolete。该设置已在 https://github.com/ClickHouse/ClickHouse/pull/47977 中移除。#49934 (Timur Solodovnikov)。 - 地理空间数据类型 (
Point、Ring、Polygon和MultiPolygon) 已达到生产可用状态。#50022 (Alexey Milovidov) 。 - 为 PostgreSQL、MySQL、MeiliSearch 和 SQLite 表引擎新增 schema inference。关闭 #49972。#50000 (Nikolay Degterinsky) 。
- 在
CREATE USER u IDENTIFIED BY 'p'这类查询中,密码类型会根据服务器上config.xml中的default_password_type设置自动确定。关闭了 #42915。#44674 (Nikolay Degterinsky) 。 - 新增 bcrypt 密码身份验证类型。关闭 #34599。#44905 (Nikolay Degterinsky) 。
- 新增关键字
INTO OUTFILE 'file.txt' APPEND。#48880 (alekar) 。 - 新增了
system.zookeeper_connection表,用于显示 Keeper 连接相关信息。#45245 (mateng915) 。 - 新增函数
generateRandomStructure,用于生成随机表结构,可与表函数generateRandom配合使用。#47409 (Kruglov Pavel) 。 - 允许在不带
ELSE分支的情况下使用CASE,并扩展了transform以支持更多数据类型。还修复了一些问题:当 decimal 类型与其他数值类型混用时,这些问题会导致 transform() 返回不正确的结果。#48300 (Salvatore Mesoraca) 。这解决了 #2655。这解决了 #9596。这解决了 #38666。 - 为 S3 表新增了使用 KMS 密钥的服务端加密支持,并为 S3 磁盘新增了
header设置。关闭了 #48723。#48724 (Johann Gan) 。 - 为后台任务 (合并和变更) 添加了 MemoryTracker。引入了
merges_mutations_memory_usage_soft_limit和merges_mutations_memory_usage_to_ram_ratio设置,用于表示合并和变更的软内存限制。如果达到该限制,ClickHouse 将不再调度新的合并或变更任务。此外,还引入了MergesMutationsMemoryTracking指标,以便观察后台任务当前的内存使用量。重新提交 #46089。关闭 #48774。#48787 (Dmitry Novik) 。 - 函数
dotProduct现已支持数组。#49050 (FFFFFFFHHHHHHH). - 新增对
SHOW INDEX语句的支持,以提升与 MySQL 的兼容性。#49158 (Robert Schulze) 。 - 为表函数
url新增对虚拟列_file和_path的支持。- 改进表函数url的错误信息。- 解决了 #49231 - 解决了 #49232。#49356 (Ziyi Tan). - 在 users.xml 文件中新增
grants字段,用于为用户指定授权。#49381 (pufit) 。 - 通过 grace hash join 算法支持 full/right join。#49483 (lgbo).
WITH FILL修饰符会按排序前缀对填充进行分组。由use_with_fill_by_sorting_prefix设置控制 (默认启用) 。相关内容见 #33203#issuecomment-1418736794。#49503 (Igor Nikonov) 。- 现在,如果未指定 “—query” (或 “-q”) ,Clickhouse-client 也支持在 “—multiquery” 后直接接收查询。示例:clickhouse-client —multiquery “select 1; select 2;”。#49870 (Alexey Gerasimchuk) 。
- 为接收来自副本的 Hello 数据包新增了单独的
handshake_timeout。关闭了 #48854。#49948 (Kruglov Pavel)。 - 新增了函数 “space”,可按指定次数重复输出空格。#50103 (Robert Schulze) 。
- 新增了 —input_format_csv_trim_whitespaces 选项。#50215 (Alexey Gerasimchuk) 。
- 允许
dictGetAll函数对 regexp tree dictionaries 以数组形式返回多个匹配项的值。关闭 #50254。#50255 (Johann Gan). - 新增了
toLastDayOfWeek函数,用于将日期或日期时间向上取整到最近的星期六或星期日。#50315 (Victor Krasnov) 。 - 可通过指定
ignore_data_skipping_indices参数来忽略跳过索引。#50329 (Boris Kuschel) 。 - 新增
system.user_processes表和SHOW USER PROCESSES查询,用于在用户级别显示内存信息和 ProfileEvents。#50492 (János Benjamin Antal) 。 - 新增服务器和格式设置
display_secrets_in_show_and_select,用于显示表、数据库、表函数和字典中的敏感信息。新增权限displaySecretsInShowAndSelect,用于控制哪些用户可以查看这些敏感信息。#46528 (Mike Kot). - 允许为某个数据库中的所有表设置 ROW POLICY。#47640 (Ilya Golshtein) 。
性能改进
- 默认压缩标记和主键,可显著缩短冷 查询时间。升级说明:22.9 版本新增了对压缩标记和主键的支持。如果您启用了压缩标记或主键,或者安装了 23.5 及以上版本 (这些版本默认启用压缩标记和主键) ,则无法再降级到 22.8 或更早版本。您也可以在服务器配置文件的
<merge_tree>部分中,通过指定compress_marks和compress_primary_key设置来显式禁用压缩标记或主键。#42587 (Alexey Milovidov). - 新增设置 s3_max_inflight_parts_for_one_file 用于限制单个文件范围内分段上传请求中可并发加载的分片数量。#49961 (Sema Checherinda).
- 从多个文件读取数据时,减少每个文件的并行解析线程数。修复了 #42192。#46661 (SmitaRKulkarni) 。
- 仅当聚合投影读取的粒度比常规读取更少时,才使用它。如果查询命中了表的 PK,但未命中投影,它会有所帮助。修复了 #49150。#49417 (Nikolai Kochetov) 。
- 如果未插入任何内容,则不要在
ANY哈希 JOIN 中存储块。#48633 (vdimir). - 修复了聚合组合器
-If在 JIT 编译时的问题,并为聚合函数启用 JIT 编译。关闭 #48120。#49083 (Igor Nikonov). - 对于从远程表读取,我们使用更小的任务 (而不是读取整个分片) ,以让任务窃取机制发挥作用 * 任务大小由待读取列的大小决定 * 从 S3 读取时始终使用 1 MB 缓冲区 * 缓存分段的边界按 1 MB 对齐,因此即使任务较小,也能保持合适的大小。这也有助于防止碎片化。#49287 (Nikita Taranov) 。
- 引入了以下设置:-
merge_max_block_size_bytes,用于限制后台操作的内存使用量。-vertical_merge_algorithm_min_bytes_to_activate,用于新增一个激活垂直合并的条件。#49313 (Nikita Mikhaylov). - 用于从本地文件系统读取的读缓冲区默认大小已调整为一个稍优的值。同时还引入了两个新设置:
max_read_buffer_size_local_fs和max_read_buffer_size_remote_fs。#49321 (Nikita Taranov) 。 - 改进了
SPARSE_HASHED/HASHED字典的内存占用和性能 (例如,SPARSE_HASHED现在的内存占用减少了 2.6 倍,速度提升约 2 倍) 。#49380 (Azat Khuzhin) 。 - 在适当情况下,通过对
system.query_log和system.query_thread_log表应用LowCardinality来进行优化。针对这些表的查询速度会更快。#49530 (Alexey Milovidov) 。 - 读取本地
Parquet文件时性能有所提升 (通过并行读取) 。#49539 (Michael Kolupaev) 。 - 在某些场景下,
RIGHT/FULL JOIN的性能最多可提升 2 倍,尤其是在将较小的左表与较大的右表进行连接时。#49585 (lgbo). - 通过为 Rust 启用 LTO,BLAKE3 的性能提升了 11%。#49600 (Azat Khuzhin) 。现在其性能已与 C++ 相当。
- 优化
system.opentelemetry_span_log的结构。在适当的地方使用LowCardinality。虽然这个表总体上仍然很糟糕 (就连常见属性也使用了 Map 数据类型) ,但还是会略有改善。#49647 (Alexey Milovidov) 。 - 尝试在
grace_hashJOIN 中为哈希表预留空间。#49816 (lgbo) 。 - 支持对
uniqExactIf状态进行并行合并。关闭 #49885。#50285 (flynn). - Keeper 改进:向 Keeper 添加
CheckNotExists请求,以提升复制表的性能。#48897 (Antonio Andelic). - Keeper 性能改进:避免在处理过程中对同一请求重复序列化。缓存大型请求的反序列化结果。由新的协调设置
min_request_size_for_cache控制。#49004 (Antonio Andelic) 。 - 在选择要合并的 parts,且许多分区实际上没有任何可合并内容时,减少了
ListZooKeeper 请求的数量。#49637 (Alexander Tokmakov) 。 - 优化 FS 缓存中的锁机制 #44985 (Kseniia Sumarokova) 。
- 如果可以使用简单的 count 优化,则禁用纯并行副本。#50594 (Raúl Marín) 。
- 在 Iceberg schema 推断中,不要为所有键发送 HEAD 请求,只对用于读取数据的键发送。#50203 (Kruglov Pavel) 。
- 设置
enable_memory_bound_merging_of_aggregation_results默认处于启用状态。#50319 (Nikita Taranov) 。
Experimental 功能
DEFLATE_QPLcodec 将最低 SIMD 版本要求降至 SSE 4.2。qpl 中的文档变更 - Intel® QPL 依赖运行时内核分发器和 cpuid 检查来选择最佳可用实现 (sse/avx2/avx512) - 重构了 ClickHouse 中用于构建 qpl 的 cmakefile,以与最新的上游 qpl 保持一致。#49811 (jasperzhu).- 新增了对使用纯并行副本执行 JOIN 的初步支持。#49544 (Raúl Marín).
- 在“零拷贝复制”中,提高了移除
过期parts 时的并行度。#49630 (Alexander Tokmakov). - 并行副本:1) 修复了在禁用设置
parallel_replicas_for_non_replicated_merge_tree的情况下,将并行副本用于非复制表存储时出现的NOT_FOUND_COLUMN_IN_BLOCK错误;2) 现在allow_experimental_parallel_reading_from_replicas有 3 个可能的值:0、1 和 2。0 - disabled,1 - enabled,在失败时静默禁用并行副本 (例如 FINAL 或 JOIN 的情况) ,2 - enabled,在失败时抛出异常。3) 如果在 SELECT 查询中使用了 FINAL 修饰符,且启用了并行副本,那么当allow_experimental_parallel_reading_from_replicas设为 1 时,ClickHouse 会尝试禁用并行副本,否则将抛出异常。#50195 (Nikita Mikhaylov). - 启用并行副本后,将始终跳过不可用的服务器 (此行为由设置
skip_unavailable_shards控制,该设置默认启用且只能禁用) 。此更改关闭了: #48565。#50293 (Nikita Mikhaylov).
改进
BACKUP命令在创建备份时不会解密加密磁盘上的数据。相反,数据会以加密形式存储在备份中。此类备份只能恢复到使用相同 (或扩展后的) 加密密钥列表的加密磁盘上。#48896 (Vitaly Baranov) 。- 新增支持在 ATTACH PARTITION FROM 和 REPLACE PARTITION FROM 的 FROM 子句中使用临时表。#49436 (Roman Vasin) 。
- 为
MergeTree表新增了设置async_insert。它与查询级设置async_insert的含义相同,可为特定表启用异步插入。注意:对于来自clickhouse-client的插入查询,该设置不会生效,此时请使用查询级设置。#49122 (Anton Popov) 。 - 为配额创建语句的参数新增了大小后缀支持。#49087 (Eridanus).
- 扩展
first_value和last_value,使其支持 NULL。#46467 (lgbo) 。 - 为
extractKeyValuePairs新增别名str_to_map和mapFromString。修复 https://github.com/clickhouse/clickhouse/issues/47185。 #49466 (flynn). - 增加了对 CGroup 版本 2 的支持,以提供有关内存使用量和可用性的异步指标。此项变更关闭了 #37983。#45999 (sichenzhao).
- Cluster 表函数应始终跳过不可用的分片。已关闭 #46314。#46765 (zk_kiger)。
- 允许 CSV 文件表头中包含空列。#47496 (你不要过来啊).
- 新增 Google Cloud Storage 的 S3 兼容表函数
gcs。与oss和cosn函数一样,它只是s3表函数的别名,并未引入任何新功能。#47815 (Kuba Kaflik) 。 - 新增了为 S3 使用严格分片大小的功能 (兼容 CloudFlare R2 S3 存储) 。#48492 (Azat Khuzhin).
- 在
system.clusters中新增了几个用于表示Replicated数据库副本信息的列:database_shard_name、database_replica_name、is_active。为SYSTEM DROP DATABASE REPLICA查询新增了可选的FROM SHARD子句。#48548 (Alexander Tokmakov) 。 - 在 system.replicas 中新增一列
zookeeper_name,用于指示复制表的元数据存储在哪个 (辅助) zookeeper 集群中。#48549 (cangyin). IN运算符现已支持比较Date和Date32。修复了 #48736。#48806 (flynn).- 支持
HDFS中的纠删码,作者:@M1eyu2018、@tomscut。#48833 (M1eyu) 。 - 支持从辅助 ZooKeeper 集群执行 SYSTEM DROP REPLICA,可能会关闭 #48931。#48932 (wangxiaobo) 。
- 为 MongoDB 添加 Array 数据类型。关闭 #48598。#48983 (Nikolay Degterinsky) 。
- 支持将
Interval数据类型存储在表中。#49085 (larryluogit) 。 - 允许在未显式定义窗口帧的情况下使用
ntile窗口函数:ntile(3) OVER (ORDER BY a),解决了 #46763。#49093 (vdimir) 。 - 新增了设置 (
number_of_mutations_to_delay、number_of_mutations_to_throw) ,用于在表中已有大量未完成变更时,对会创建变更的ALTER查询 (ALTER UPDATE、ALTER DELETE、ALTER MODIFY COLUMN、…) 进行延迟处理或直接报错。#49117 (Anton Popov) 。 - 在文件系统缓存中捕获
create_directories抛出的异常。#49203 (Kseniia Sumarokova) 。 - 将内嵌示例复制到
system.functions中的新字段example,以补充description字段。#49222 (Dan Roscigno) 。 - 为 MongoDB 字典启用连接选项。示例:
xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source>### 面向用户变更的文档条目。#49225 (MikhailBurdukov) 。 - 为
kolmogorovSmirnovTest的asymp计算方法新增了别名asymptotic。文档也已改进。#49286 (Nikita Mikhaylov). - 聚合函数 groupBitAnd/Or/Xor 现在也支持有符号整数数据。这使其与标量函数 bitAnd/Or/Xor 的行为保持一致。#49292 (exmy).
- 将函数文档拆分成更细化的字段。#49300 (Robert Schulze) 。
- 使用服务器内所有表共享的多个线程来加载过期的数据分区片段。线程池及其队列的大小由
max_outdated_parts_loading_thread_pool_size和outdated_part_loading_thread_pool_queue_size设置控制。#49317 (Nikita Mikhaylov) 。 - 当
LowCardinality列在块之间共享字典时,不要高估处理后数据的大小。此更改修复了 #49322。另请参见 #48745。#49323 (Alexey Milovidov) 。 - Parquet 写入器现在在通过
OUTFILE调用时,会使用合理的行组大小。#49325 (Michael Kolupaev) 。 - 如果别名带引号,则允许将
ARRAY这类受限关键字用作别名。关闭 #49324。#49360 (Nikolay Degterinsky) 。 - 数据分区片段的加载和删除作业已从按表分别使用的池迁移到全服务器范围的共享池中。池大小由顶层配置中的设置
max_active_parts_loading_thread_pool_size、max_outdated_parts_loading_thread_pool_size和max_parts_cleaning_thread_pool_size控制。表级设置max_part_loading_threads和max_part_removal_threads已过时。#49474 (Nikita Mikhaylov) 。 - 允许在 Play UI 的 URL 中使用
?password=pass。密码会在浏览器历史记录中被替换掉。#49505 (Mike Kot). - 允许从远程文件系统读取大小为 0 的对象。 (因为空文件不会被备份,所以元数据文件中最终可能会出现零个 blob。) 关闭 #49480。#49519 (Kseniia Sumarokova) 。
- 在
ThreadGroup脱离后,将线程的 MemoryTracker 挂接到total_memory_tracker。#49527 (Dmitry Novik) 。 - 修复了在查询中多次使用同一个查询参数时参数化视图出现的问题。#49556 (Azat Khuzhin).
- 释放查询上下文中为最近一次发送的 ProfileEvents snapshot 分配的内存。后续跟进见 #47564。#49561 (Dmitry Novik) 。
- 函数 “makeDate” 现已提供一个与 MySQL 兼容的重载版本 (year 和一年中的第几天这两个参数) 。#49603 (Robert Schulze) 。
- 支持
RegExpTreeDictionary的dictionary表函数。#49666 (Han Fei) 。 - 新增了加权公平 IO 调度策略。新增了动态资源管理器,可在运行时更新 IO 调度层级,而无需重启服务器。#49671 (Sergei Trifonov) 。
- 在向 GCS 完成分段上传后新增 compose 请求。这样一来,就可以对通过分段上传上传的对象执行复制操作。建议将
s3_strict_upload_part_size设置为某个值,因为如果对象由大小不同的分片组成,compose 请求可能会失败。#49693 (Antonio Andelic) 。 - 对于
extractKeyValuePairs函数:改进“尽力而为”的解析逻辑,使其将key_value_delimiter视为值的有效组成部分。这也简化了分支逻辑,甚至可能稍微提升一些速度。#49760 (Arthur Passos). - 为 system.processors_profile_log 添加
initial_query_id字段 #49777 (helifu) 。 - 系统日志表现已支持自定义排序键。#49778 (helifu).
system.query_log中新增了一个字段partitions,用于标识哪些分区参与了计算。#49779 (helifu).- 为
ReplicatedMergeTree新增了enable_the_endpoint_id_with_zookeeper_name_prefix设置 (默认禁用) 。启用后,它会将 ZooKeeper 集群名称添加到表的服务器间通信端点中。这样可以避免在存在路径相同但辅助 ZooKeeper 不同的复制表时出现Duplicate interserver IO endpoint错误。#49780 (helifu) 。 - 为
clickhouse-local增加查询参数。修复了 #46561。#49785 (Nikolay Degterinsky) 。 - 默认允许从 YAML 加载字典和函数。在早期版本中,由于它们默认期望的是
*.xml文件,因此需要在配置文件中编辑dictionaries_config或user_defined_executable_functions_config。#49812 (Alexey Milovidov) 。 - Kafka 表引擎现已支持使用别名列。#49824 (Aleksandr Musorin) 。
- 新增一项设置,用于限制
extractKeyValuePairs生成的键值对最大数量,以避免占用过多内存,起到保护作用。#49836 (Arthur Passos) 。 - 增加了对一种 (不常见的) 情况的支持,即
IN运算符中的参数为单元素 Tuple。 #49844 (MikhailBurdukov). bitHammingDistance函数支持String和FixedString数据类型。已关闭 #48827。#49858 (flynn).- 修复了 OS X 上客户端中重置 timeout 时出现的错误。#49863 (alekar) 。
- 为函数
bitCount新增了对大整数的支持,例如 UInt128、Int128、UInt256 和 Int256。这使 AI 应用能够在大型位掩码上计算 Hamming 距离。#49867 (Alexey Milovidov) 。 - 在加密磁盘中可使用指纹代替密钥 ID。这简化了加密磁盘的配置。#49882 (Vitaly Baranov) 。
- 为 PostgreSQL 添加 UUID 数据类型。修复 #49739。#49894 (Nikolay Degterinsky) 。
- 函数
toUnixTimestamp现在支持接受Date和Date32类型的参数。#49989 (Victor Krasnov) 。 - 字典仅计入服务器内存。 #49995 (Azat Khuzhin).
- 服务器将允许把
SQL_*设置 (例如SQL_AUTO_IS_NULL) 作为空操作来使用,以兼容 MySQL。这修复了 #49927。#50013 (Alexey Milovidov) 。 - 为 ON CLUSTER 查询保留 initial_query_id,这对查看内部信息很有帮助 (在
distributed_ddl_entry_format_version=5下) 。#50015 (Azat Khuzhin). - 通过使用别名 (
allow_experimental_projection_optimization用作optimize_use_projections的别名,allow_experimental_lightweight_delete用作enable_lightweight_delete的别名) ,保留对重命名设置的向后兼容性。#50044 (Azat Khuzhin) 。 - 支持通过设置 my_hostname 传入 FQDN,以便在 Keeper 中注册集群节点。新增 invisible 设置,以支持多个计算组。每个计算组都作为一个集群存在,并且对其他计算组不可见。#50186 (Yangkuan Liu).
- 修复了 PostgreSQL 在指定
LIMIT n的情况下仍会读取全部数据的问题。#50187 (Kseniia Sumarokova) 。 - 为包含子查询的查询新增 profile events (
QueriesWithSubqueries/SelectQueriesWithSubqueries/InsertQueriesWithSubqueries) 。#50204 (Azat Khuzhin) 。 - 在 users.xml 文件中新增
roles字段,允许通过配置文件为角色指定授权。#50278 (pufit)。 - 在 AsynchronousMetrics 中上报
CGroupCpuCfsPeriod和CGroupCpuCfsQuota。- 在 server 启动期间遵守 cgroup v2 的内存限制。#50379 (alekar). - 为 SIGQUIT 添加一个信号处理器,使其行为与 SIGINT 相同。关闭 #50298。#50435 (Nikolay Degterinsky) 。
- 如果 JSON 因输出对象过大而解析失败,则输出最后的位置,以便调试。#50474 (Valentin Alexeev) 。
- 支持非固定大小的 Decimal。关闭了 #49130。#50586 (Kruglov Pavel) 。
构建/测试/打包改进
- 全新改进的
keeper-bench。所有内容都可以通过 YAML/XML 文件自定义:- 请求生成器 - 每种类型的请求生成器都可以有一组专用字段 - 只需在multi键下进行相同配置,即可生成多请求 - 可以为 multi 中的每个请求或子请求定义weight字段,以控制分布 - 定义测试运行前需要建立的树 - 可以定义主机,所有 timeout 都可自定义,还能控制为每个主机生成多少个 sessions - 使用min_value和max_value字段定义的整数会作为随机数生成器。#48547 (Antonio Andelic) 。 - Io_uring 不支持 macOS,本地运行测试时请勿选择它,以避免偶发性失败。#49250 (Frank Chen) 。
- 支持用于测试的具名故障注入。#49361 (Han Fei) 。
- 允许 ClickHouse 在不提供
prctl(进程控制) 系统调用的操作系统中运行,例如 AWS Lambda。 #49538 (Alexey Milovidov). - 修复了 qpl 中 contrib/isa-l 与 isa-l 的构建冲突问题 49296。#49584 (jasperzhu).
- 现在,工具仅会在显式指定 (“-DENABLE_UTILS=1”) 时才构建,而不再默认构建,这缩短了典型开发构建中的链接时间。#49620 (Robert Schulze).
- 将 idxd-config 的构建说明拆分到单独的 CMake 文件中,以避免日后被误删。#49651 (jasperzhu) 。
- 在 master 中添加了启用 analyzer 的 CI 检查。后续跟进见 #49562。#49668 (Dmitry Novik) 。
- 切换至 LLVM/clang 16。 #49678 (Azat Khuzhin).
- 支持使用 clang-17 构建 ClickHouse。#49851 (Alexey Milovidov). #50410 (Alexey Milovidov).
- ClickHouse 现在更容易集成到其他 cmake 项目中了。#49991 (Amos Bird) 。 (但强烈不建议这样做 - Alexey Milovidov) 。
- 修复 #47151 之后出现的异常额外 QEMU 日志,参见 https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html。[#50442](https://github.com/ClickHouse/ClickHouse/pull/50442) (Mikhail f. Shiryaev) 。
- ClickHouse 现已可在 Linux RISC-V 6.1.22 上运行。此更改已关闭 #50456。#50457 (Alexey Milovidov) 。
- 将内部 protobuf 升级至 v3.18 (修复误报的 CVE-2022-1941) 。#50400 (Robert Schulze) 。
- 将内部 libxml2 升级至 v2.10.4 (修复了被误报的 CVE-2023-28484 和 CVE-2023-29469) 。#50402 (Robert Schulze) 。
- 将 c-ares 升级至 v1.19.1 (CVE-2023-32067、CVE-2023-31130、CVE-2023-31147 均为误报) 。#50403 (Robert Schulze) 。
- 修复 libgsasl 中误报的 CVE-2022-2469。 #50404 (Robert Schulze).
缺陷修复 (官方稳定版本中用户可见的异常表现)
- ActionsDAG:修复了错误的优化逻辑 #47584 (Salvatore Mesoraca).
- 正确处理 Keeper 中的并发快照 #48466 (Antonio Andelic) 。
- MergeTreeMarksLoader 持有的是 DataPart,而不是 DataPartStorage #48515 (SmitaRKulkarni).
- 修复序列状态 #48603 (Ilya Golshtein) 。
- 此前失败时的 Back/Restore 并发检查 #48726 (SmitaRKulkarni) 。
- 修复:对具有不存在的 ZK 路径的表执行 Attach 时,ReadonlyReplica 指标不会增加的问题 #48954 (wangxiaobo).
- 修复了某些位置可能因未捕获异常而触发 terminate 的问题 #49112 (Kruglov Pavel) 。
- 修复包含多个 StorageJoin 的查询中出现的 key not found 错误 #49137 (vdimir).
- 修复使用 Nullable 主键时查询结果错误的问题 #49172 (Duc Canh Le).
- 修复 reinterpretAs*() 在大端序机器上的问题 #49198 (Suzy Wang) 。
- (Experimental 零拷贝复制) 更原子地锁定零拷贝 parts #49211 (alesapin).
- 修复加载过期分区片段时的竞态条件 #49223 (Alexander Tokmakov) 。
- 修复在所有键值均为 NULL 且分组使用 rollup 时返回错误结果的问题 #49282 (Shuai li).
- 修复带有 SHARDS 的 HASHED 字典在计算 load_factor 时的问题 #49319 (Azat Khuzhin) 。
- 不允许为别名列配置压缩 CODEC #49363 (Timur Solodovnikov) 。
- 修复删除现有分片目录时出现的错误 #49365 (alesapin).
- 正确修复了使用 HMAC 时的 GCS 问题 #49390 (Antonio Andelic) 。
- 修复了从 remote() 读取时未构建子查询结果集的 fuzz 缺陷 #49425 (Alexander Gololobov) 。
- 将
shutdown_wait_unfinished_queries取反 #49427 (Konstantin Bogdanov) 。 - (Experimental 零拷贝复制) 修复另一个零拷贝相关错误 #49473 (alesapin).
- 修复 postgres 数据库设置问题 #49481 (Mal Curtis) 。
- 正确处理
s3Cluster的参数 #49490 (Antonio Andelic). - 修复 TraceCollector 析构函数中的问题。#49508 (Yakov Olkhovskiy) 。
- 修复 AsynchronousReadIndirectBufferFromRemoteFS 在短距离寻道时失效的问题 #49525 (Michael Kolupaev) 。
- 修复字典的加载顺序 #49560 (Alexander Tokmakov) 。
- 禁止修改 Object(‘json’) 列的数据类型 #49563 (Nikolay Degterinsky).
- 修复压力测试问题 (逻辑错误:应满足 7134 >= 11030) #49623 (Kseniia Sumarokova).
- 修复 DISTINCT 的错误 #49628 (Alexey Milovidov) 。
- 修复:按顺序 DISTINCT 在未排序列包含零值时的问题 #49636 (Igor Nikonov) 。
- 修复了在大整数中由 UBSan 配合 fuzzer 发现的一处偶发错误 #49645 (Alexey Milovidov) 。
- 修复重启后读取稀疏列时的问题 #49660 (Anton Popov).
- 修复在 fibers 环境下 SpanHolder::finish() 中的断言问题 #49673 (Kruglov Pavel) 。
- 修复带有稀疏参数的短路函数和变更的问题 #49716 (Anton Popov) 。
- 修复将追加文件写入增量备份时的问题 #49725 (Vitaly Baranov).
- 修复在包含 Object 列的表上执行轻量级删除变更时出现的“表中不存在物理列 _row_exists”错误。#49737 (Alexander Gololobov) 。
- 修复 randomStringUTF8(奇数长度) 中的 msan 问题 #49750 (Robert Schulze).
- 修复聚合函数 kolmogorovSmirnovTest 的问题 #49768 (FFFFFFFHHHHHHH).
- 修复原生协议中的设置别名问题 #49776 (Azat Khuzhin).
- 修复
arrayMap处理单参数元组数组时的问题 #49789 (Anton Popov) 。 - 修复按查询粒度的 IO/BACKUP 限流设置 #49797 (Azat Khuzhin).
- 修复了在 profile 定义中设置 NULL 时的问题 #49831 (Vitaly Baranov) 。
- 修复了 projections 与 aggregate_functions_null_for_empty 设置相关的一个问题 (针对 query_plan_optimize_projection) #49873 (Amos Bird) 。
- 修复重启后 Distributed 异步 INSERT 无法处理待处理批次的问题 #49884 (Azat Khuzhin) 。
- 修复 CacheMetadata::doCleanup 中的断言问题 #49914 (Kseniia Sumarokova) 。
- 修复 OptimizeRegularExpression 中的
is_prefix问题 #49919 (Han Fei) 。 - 修复了指标
WriteBufferFromS3Bytes、WriteBufferFromS3Microseconds和WriteBufferFromS3RequestsErrors#49930 (Aleksandr Musorin) 。 - 修复 protobuf 中 IPv6 的编码问题 #49933 (Yakov Olkhovskiy) 。
- 修复文本格式中错误解析 Nullable 时可能导致的逻辑错误 #49960 (Kruglov Pavel).
- 新增设置 output_format_parquet_compliant_nested_types,以生成兼容性更好的 Parquet 文件 #50001 (Michael Kolupaev) 。
- 修复压力测试中 “Not enough space to add …” 的逻辑错误 #50021 (Kseniia Sumarokova) 。
- 避免在
ReplicatedMergeTree的 attach 线程中启动表时出现死锁 #50026 (Antonio Andelic) 。 - 修复
SpanHolder::finish()中与 fibers 相关的断言问题 (第 2 次尝试) #50034 (Kruglov Pavel) 。 - 为 DDL OpenTelemetry 上下文序列化添加适当的转义处理 #50045 (Azat Khuzhin) 。
- 修复对损坏的 projection parts 的报告问题 #50052 (Amos Bird) 。
- 修复 JIT 编译中“不等于 NaN”判断的问题 #50056 (Maksim Kita) 。
- 修复了不带参数的 Replicated 数据库导致崩溃的问题 #50058 (Azat Khuzhin) 。
- 修复了在常量条件和 Nullable 参数情况下
multiIf发生崩溃的问题 #50123 (Anton Popov). - 修复日期相关键的无效索引分析 #50153 (Amos Bird) 。
- 当不存在 ORDER BY 列时,不允许修改 ORDER BY #50154 (Han Fei) 。
- 修复了当二元运算符包含 NULL 常量参数时索引分析失效的问题 #50177 (Amos Bird) 。
- clickhouse-client:禁止同时使用
--query和--queries-file#50210 (Alexey Gerasimchuk) 。 - 修复 INTO OUTFILE 扩展功能 (APPEND / AND STDOUT) 和 WATCH EVENTS 中的 UB #50216 (Azat Khuzhin) 。
- 修复 CustomSeparatedIgnoreSpaces format 中行尾空格被跳过的问题 #50224 (Kruglov Pavel) 。
- 修复 Iceberg 元数据解析问题 #50232 (Kseniia Sumarokova) 。
- 修复 WITH 子句中嵌套分布式 SELECT 的问题 #50234 (Azat Khuzhin) 。
- 修复 keyed siphash 的 msan 问题 #50245 (Robert Schulze).
- 修复了 Poco 套接字在非阻塞模式下的问题,改用真正的非阻塞套接字 #50252 (Kruglov Pavel) 。
- 修复备份项的校验和计算问题 #50264 (Vitaly Baranov) 。
- 比较函数中的 NaN 修复 #50287 (Maksim Kita) 。
- JIT 聚合中 Nullable 键的修复 #50291 (Maksim Kita).
- 修复
clickhouse-local在写入空的 Arrow 或 Parquet 输出时发生崩溃的问题 #50328 (Michael Kolupaev). - 修复了调用 Pool::Entry::disconnect() 时发生的崩溃 #50334 (Val Doroshchuk) 。
- 通过延长目录锁的持有时间,改进了分片拉取 #50339 (SmitaRKulkarni).
- 修复 bitShift* 函数在两个参数都为常量时的问题 #50343 (Kruglov Pavel) 。
- 修复了 Keeper 在预处理请求时因异常导致的死锁问题。#50387 (frinkr).
- 修复 const 整数值哈希计算的问题 #50421 (Robert Schulze) 。
- 修复了数据跳过索引中 merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek 的问题 #50432 (Azat Khuzhin).
- 限制加载过期分区片段时的并发任务数量 #50450 (Nikita Mikhaylov) 。
- Keeper 修复:安装快照后应用未提交的状态 #50483 (Antonio Andelic) 。
- 修复不正确的常量折叠 #50536 (Alexey Milovidov) 。
- 修复压力测试中的逻辑错误 (没有足够空间添加……) #50583 (Kseniia Sumarokova) 。
- 修复 values 表函数中将 Null 转换为 LowCardinality(Nullable) 的问题 #50637 (Kruglov Pavel).
- 撤销无效的 RegExpTreeDictionary 优化 #50642 (Johann Gan) 。
ClickHouse 23.4 版本发布,2023-04-26。 Presentation, Video
向后不兼容的变更
- function formatDateTime() 中的格式说明符 ‘%M’ 现在输出月份名称,而不是分钟。这使其行为与 MySQL 保持一致。可以使用设置 “formatdatetime_parsedatetime_m_is_month_name = 0” 恢复之前的行为。 #47246 (Robert Schulze).
- 只有在使用虚拟文件系统缓存时,此更改才有意义。如果虚拟文件系统缓存配置中的
path非空且不是绝对路径,则会将其放到<ClickHouse server 数据目录>/caches/<缓存配置中的路径>下。 #48784 (Kseniia Sumarokova). - 现在会拒绝主/二级索引和排序键中表达式相同的情况。可以使用设置
allow_suspicious_indices禁用此行为。 #48536 (凌涛).
新功能
- 支持新的聚合函数
quantileGK/quantilesGK,类似于 Spark 中的 approx_percentile。有关 Greenwald-Khanna 算法,详见 http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf。[#46428](https://github.com/ClickHouse/ClickHouse/pull/46428) (李扬) 。 - 新增语句
SHOW COLUMNS,用于显示从 system.columns 中提取出的精简信息。#48017 (Robert Schulze) 。 - 为
SYSTEM SYNC REPLICA查询新增了LIGHTWEIGHT和PULL修饰符。LIGHTWEIGHT版本只等待拉取和 drop-ranges (忽略合并和变更) 。PULL版本会从 ZooKeeper 拉取新条目,但不会等待这些条目。修复了 #47794。#48085 (Alexander Tokmakov) 。 - 新增
kafkaMurmurHash函数,以兼容 Kafka 的 DefaultPartitioner。关闭 #47834。#48185 (Nikolay Degterinsky) 。 - 允许使用
GRANT CURRENT GRANTS轻松创建一个与当前用户拥有相同授权的用户。#48262 (pufit). - 新增统计聚合函数
kolmogorovSmirnovTest。关闭了 #48228。#48325 (FFFFFFFHHHHHHH) 。 - 向
system.replicas表新增了一个lost_part_count列。该列的值表示对应表中丢失的 parts 总数。该值存储在 ZooKeeper 中,可用于监控,替代非持久化的ReplicatedDataLossprofile 事件。#48526 (Sergei Trifonov) 。 - 添加
soundex函数以提供兼容性支持。关闭 #39880。#48567 (FriendLey) 。 - JSONExtract 现已支持
Map类型。#48629 (李扬). - 新增
PrettyJSONEachRow格式,以美观的 JSON 输出,并使用换行分隔符和 4 个空格缩进。#48898 (Kruglov Pavel) 。 - 新增
ParquetMetadatainput format,以读取 Parquet 文件元数据。#48911 (Kruglov Pavel) 。 - 新增
extractKeyValuePairs函数,用于从字符串中提取键值对。输入字符串中可能包含噪声 (即日志文件 / 不一定 100% 符合键值对格式) ,算法会查找与传递给该函数的参数相匹配的键值对。目前,该函数接受以下参数:data_column(必填) 、key_value_pair_delimiter(默认为:) 、pair_delimiters(默认为\space \, \;) 以及quoting_character(默认为双引号) 。#43606 (Arthur Passos) 。 - 函数 replaceOne()、replaceAll()、replaceRegexpOne() 和 replaceRegexpAll() 现在支持使用非常量的 pattern 和 replacement 参数进行调用。#46589 (Robert Schulze) 。
- 新增了用于操作
Map类型列的函数:mapConcat、mapSort、mapExists。 #48071 (Anton Popov).
性能改进
- 读取
Parquet格式文件的速度现已大幅提升。IO 和解码已实现并行化 (由max_threads设置控制) ,并且只会读取所需的数据范围。#47964 (Michael Kolupaev)。 - 如果执行带有 IN (subquery) 的变更,例如:
ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table),并且表t有多个 parts,那么会为每个 part 在内存中构建一个用于 subquerySELECT id FROM huge_table的 Set。如果 parts 很多,这可能会消耗大量内存 (并导致 OOM) 和 CPU。解决方案是引入一个短生命周期的缓存,用于保存当前由变更任务构建中的 Set。如果同一变更的另一个任务并发执行,它就可以从缓存中查找该 Set,等待其构建完成后复用。#46835 (Alexander Gololobov)。 - 仅在必要时,才会在应用
ALTER TABLE查询时检查依赖项。#48062 (Raúl Marín)。 - 优化函数
mapUpdate。#48118 (Anton Popov)。 - 现在,发往本地副本的内部查询会被显式发送,并通过回环接口接收返回的数据。对于并行副本,设置
prefer_localhost_replica不再生效。这样做是为了获得更好的调度效果,同时也让代码更简洁:initiator 只负责协调读取过程和合并结果,在所有次级查询读取数据时持续响应请求。注意:使用回环接口的性能并不算高;但如果不这样做,某些副本可能会因分配不到任务而饥饿,导致查询执行更慢,也无法充分利用所有可用资源。现在 coordinator 的初始化也变得更惰性了。所有传入请求都包含读取算法的信息,我们会在第一个请求到达时用该信息初始化 coordinator。如果任何副本决定使用不同的算法读取,就会抛出异常并中止查询。#48246 (Nikita Mikhaylov)。 - 当带有 subquery 的
INclause 右侧仅用于分析跳过索引,且跳过索引已通过设置禁用 (use_skip_indexes=0) 时,不再为其构建 Set。此前这可能会影响查询性能。#48299 (Anton Popov)。 - 在读取
FROM file(...)后,查询处理会立即并行化。相关 issue 见 #38755。#48525 (Igor Nikonov)。现在,从任何数据源读取后,查询处理都会立即并行化。受影响的数据源主要是简单存储或外部存储,例如表函数url、file。#48727 (Igor Nikonov)。该行为由设置parallelize_output_from_storages控制,默认未启用。 - 降低了 ThreadPool mutex 的竞争 (在存在大量小作业时,可能提升性能) 。#48750 (Sergei Trifonov)。
- 降低了多个
ALTER DELETE变更的内存占用。#48522 (Nikolai Kochetov)。 - 如果启用了
skip_unavailable_shards设置,则不再进行多余的 connection 尝试。#48771 (Azat Khuzhin)。
Experimental 功能
- 查询缓存中的条目现在会被合并至
max_block_size并压缩。#45912 (Robert Schulze). - 现在可以为每个用户定义查询缓存配额。#48284 (Robert Schulze).
- 修复了并行副本的一些问题。#48433 (Nikita Mikhaylov).
- 在加密磁盘上实现了零拷贝复制 (一项 Experimental 功能) 。#48741 (Vitaly Baranov).
改进
- 将
connect_timeout_with_failover_ms的默认值提高到 1000 毫秒 (因为在 https://github.com/ClickHouse/ClickHouse/pull/47229 中添加了异步连接) 。已关闭 #5188。#49009 (Kruglov Pavel) 。 - 围绕数据湖的多项改进: - 让
Iceberg支持非分区数据。 - 支持Iceberg格式 v2 版本 (此前仅支持 v1) - 支持读取DeltaLake/Hudi的分区数据 - 通过使用 Delta 的检查点文件,加快DeltaLake元数据读取速度 - 修复了Hudi读取不正确的问题:此前会错误地选择要读取的数据,因此只能正确读取小表 - 让这些引擎能够识别变更数据的更新 (此前状态是在创建表时设定的) - 使用 spark 为Iceberg/DeltaLake/Hudi补充了适当的测试。 #47307 (Kseniia Sumarokova). - 为套接字添加异步 connection 和异步写入。使跨分片创建 connection 以及发送查询/外部表支持异步化。使用纤程重构代码。关闭 #46931。在此 PR 合并后,我们将能够默认增大
connect_timeout_with_failover_ms(https://github.com/ClickHouse/ClickHouse/issues/5188) 。#47229 (Kruglov Pavel) 。 - 支持使用配置节
keeper/keeper_server作为zookeeper的替代。关闭 #34766、#34767。#35113 (李扬). - 现在可以在以 ClickHouse 表为源的字典的 named_collections 中设置 secure 标志。修复了 #38450。#46323 (Ilya Golshtein) 。
bitCount函数现已支持FixedString和String数据类型。#49044 (flynn) 。- 为 Backup 查询中所有与 [Zoo]Keeper 相关的操作新增了可配置的重试机制。#47224 (Nikita Mikhaylov) 。
- 默认对 S3 启用
use_environment_credentials,因此默认会构建完整的凭证提供程序链。#47397 (Antonio Andelic) 。 - 目前,JSON_VALUE 函数与 Spark 的 get_json_object 函数类似,都支持通过类似 ‘$.key’ 的路径从 JSON 字符串中提取值。但两者仍有一些区别:1. 在 Spark 的 get_json_object 中,如果路径不存在,则会返回 null,而 JSON_VALUE 会返回空字符串;2. 在 Spark 的 get_json_object 中,会返回复杂类型的值,例如 JSON object/array 值,而 JSON_VALUE 则会返回空字符串。 #47494 (KevinyhZou).
- 对于
use_structure_from_insertion_table_in_table_functions,向表函数传播插入表结构的方式变得更加灵活。修复了名称映射和虚拟列使用方面的一个问题。不再需要 ‘auto’ 设置。#47962 (Yakov Olkhovskiy). - 如果查询被终止或超出限制,请勿继续重试连接 Keeper。#47985 (Raúl Marín).
- 支持
BSONEachRow的枚举输入/输出,允许所有 map 键类型,并避免输出时进行额外计算。#48122 (Kruglov Pavel) 。 - 在
ORC/Arrow/Parquet格式中支持更多 ClickHouse 类型:Enum(8|16)、(U)Int(128|256)、Decimal256 (ORC) ,支持从 Int32 值读取 IPv4 (ORC 会将 IPv4 输出为 Int32,而此前无法再将其读回) ,并修复了从ORC的二进制数据中读取 Nullable(IPv6) 的问题。#48126 (Kruglov Pavel) 。 - 为表
system.storage_policies新增列perform_ttl_move_on_insert和load_balancing,并将列volume_type的类型修改为Enum8。#48167 (lizhuoyu5) 。 - 新增了对
BACKUP ALL命令的支持,可备份所有表和数据库,包括临时表/临时数据库以及系统表/系统数据库。#48189 (Vitaly Baranov). - 函数 mapFromArrays 支持以
Map类型作为输入。#48207 (李扬) 。 - 现在,某些 SHOW PROCESSLIST 的输出结果已排序。#48241 (Robert Schulze) 。
- 支持对远程 IO/本地 IO/备份按查询级别或服务器级别进行限流 (服务器设置:
max_remote_read_network_bandwidth_for_server,max_remote_write_network_bandwidth_for_server,max_local_read_bandwidth_for_server,max_local_write_bandwidth_for_server,max_backup_bandwidth_for_server;设置:max_remote_read_network_bandwidth,max_remote_write_network_bandwidth,max_local_read_bandwidth,max_local_write_bandwidth,max_backup_bandwidth) 。#48242 (Azat Khuzhin) 。 - 在
CapnProto格式中支持更多类型:Map、(U)Int(128|256)、Decimal(128|256)。允许在输入/输出过程中进行整数转换。#48257 (Kruglov Pavel). - 正常情况下不再抛出 CURRENT_WRITE_BUFFER_IS_EXHAUSTED。#48288 (Raúl Marín) 。
- 新增设置
keeper_map_strict_mode,为在KeeperMap表上执行的操作提供额外保证。#48293 (Antonio Andelic) 。 - 检查简单字典的主键类型是否为原生无符号整数类型。添加设置
check_dictionary_primary_key以保持兼容性 (将check_dictionary_primary_key =false设为 false 可禁用检查) 。#48335 (lizhuoyu5) 。 - 无需为
KeeperMap复制变更,因为这并无必要。#48354 (Antonio Andelic) 。 - 支持在 Protobuf format 中将未命名 Tuple 作为嵌套 Message 写入和读取。Tuple 元素与 Message field 按位置对应。#48390 (Kruglov Pavel) 。
- 在新的规划器中支持
additional_table_filters和additional_result_filter设置。此外,还为additional_result_filter添加了文档说明。#48405 (Dmitry Novik). parseDateTime现在可以识别格式字符串 ‘%f’ (秒的小数部分) 。#48420 (Robert Schulze).- formatDateTime() 中的格式字符串 “%f” 现在会在格式化值不包含小数秒时输出 “000000”;此前的行为 (输出单个零) 可通过设置 “formatdatetime_f_prints_single_zero = 1” 恢复。#48422 (Robert Schulze) 。
- 不再为 KeeperMap 复制 DELETE 和 TRUNCATE 操作。#48434 (Antonio Andelic) 。
- 在 generateRandom 函数中生成有效的 Decimal 和 Bool 值。#48436 (Kruglov Pavel) 。
- 允许在
SELECT查询的表达式列表中使用尾随逗号,例如SELECT a, b, c, FROM table。解决了 #37802。#48438 (Nikolay Degterinsky) 。 - 使用
--user和--password客户端参数覆盖CLICKHOUSE_USER和CLICKHOUSE_PASSWORD环境变量。解决了 #38909。#48440 (Nikolay Degterinsky) 。 - 为
MergeTree表中数据分区片段的加载增加了重试机制,以便在发生可重试错误时自动重试。#48442 (Anton Popov) 。 - 为
arrayMin、arrayMax、arrayDifference函数添加对Date、Date32、DateTime、DateTime64数据类型的支持。关闭 #21645。#48445 (Nikolay Degterinsky) 。 - 新增对
{server_uuid}macro 的支持。在运行时会持续新增和移除副本的自动扩缩容集群中,它有助于识别各个副本。此项改动关闭了 #48554。#48563 (Alexey Milovidov) 。 - 如果条件允许,安装脚本将创建硬链接,而不是复制文件。#48578 (Alexey Milovidov).
- 支持
SHOW TABLE语法,其作用与SHOW CREATE TABLE相同。关闭 #48580。#48591 (flynn) 。 - HTTP 临时缓冲区现已支持通过从虚拟文件系统缓存中清除数据来运行。#48664 (Vladimir C) 。
- 使
CREATE AS SELECT支持 schema 推断。关闭 #47599。#48679 (flynn) 。 - 为
ReplicatedMergeTree新增了replicated_max_mutations_in_one_entry设置,可限制每个MUTATE_PART条目中的变更命令数 (默认值为 10000) 。#48731 (Alexander Tokmakov) 。 - 在 AggregateFunction 类型中,不要把 Arena 中未使用的字节计入
read_bytes。#48745 (Raúl Marín) 。 - 修复了 MySQL 字典源 + 命名集合未正确处理部分 MySQL 相关设置的问题。关闭 #48402。#48759 (Kseniia Sumarokova) 。
- 如果用户将
max_single_part_upload_size设为非常大的值,可能会因 AWS S3 SDK 中的一个缺陷而导致崩溃。此修复解决了 #47679。#48816 (Alexey Milovidov) 。 - 修复
RabbitMQ中的数据竞争问题 (报告) ,并重构代码。#48845 (Kseniia Sumarokova) 。 - 新增来自
system.parts和system.part_log的别名name和part_name。关闭了 #48718。#48850 (sichenzhao)。 - 函数 “arrayDifferenceSupport()”、“arrayCumSum()” 和 “arrayCumSumNonNegative()” 现已支持大位宽整数类型 (U)Int128/256 的输入数组。#48866 (cluster) 。
- clickhouse-client 中的多行历史记录现在不再带有填充空格,粘贴起来也更自然。#48870 (Joanna Hulboj) 。
- 针对 ClickHouse 在 LXC 内运行且使用 LXCFS 的少见场景,做了一项小幅改进。LXCFS 存在一个问题:有时读取
/proc中的文件时会返回错误 “Transport endpoint is not connected”。此前,该错误已被正确记录到 ClickHouse 的服务器日志中。我们还通过重新打开文件来额外规避了这一问题。这是一个极小的改动。#48922 (Real). - 改进预取的内存统计。在 CI 中将预取设置随机化。#48973 (Kseniia Sumarokova).
- 在 GCS 上执行原生复制操作时,正确设置请求头。#48981 (Antonio Andelic) 。
- 新增支持在命令行中使用短横线而不是下划线来指定设置名称,例如使用
--max-threads而不是--max_threads。此外,还支持使用 Unicode 短横线字符,例如用—代替--——这在你与另一家公司的团队沟通,而对方团队的经理从 MS Word 复制粘贴代码时会很有用。#48985 (alekseygolub). - 新增了一种回退机制:当 SSL 用户证书身份验证失败时,改用密码身份验证。关闭了 #48974。#48989 (Nikolay Degterinsky) 。
- 改进嵌入式仪表板。已关闭 #46671。#49036 (Kevin Zhang) 。
- 为日志消息添加 profile events,以便轻松查看各严重级别的日志消息数量。#49042 (Alexey Milovidov).
- 在先前版本中,在存在 DOS 或 macOS Classic 换行符的情况下,
LineAsString格式在启用或未启用并行解析时的行为并不一致。此更改解决了 #49039。#49052 (Alexey Milovidov) 。 - 关于无法解析的查询参数的异常消息现在也会指出该参数的名称。重新实现 #48878。关闭 #48772。#49061 (Alexey Milovidov) 。
构建/测试/打包改进
- 更新时区。以下时区已更新:Africa/Cairo、Africa/Casablanca、Africa/El_Aaiun、America/Bogota、America/Cambridge_Bay、America/Ciudad_Juarez、America/Godthab、America/Inuvik、America/Iqaluit、America/Nuuk、America/Ojinaga、America/Pangnirtung、America/Rankin_Inlet、America/Resolute、America/Whitehorse、America/Yellowknife、Asia/Gaza、Asia/Hebron、Asia/Kuala_Lumpur、Asia/Singapore、Canada/Yukon、Egypt、Europe/Kirov、Europe/Volgograd、Singapore。#48572 (Alexey Milovidov) 。
- 减少头文件中的依赖项数量,以加快构建速度。#47984 (Dmitry Novik) 。
- 在测试中对标记和索引的压缩进行随机化处理。#48286 (Alexey Milovidov) 。
- 将内部 ZSTD 从 1.5.4 升级到 1.5.5。#46797 (Robert Schulze) 。
- 在测试中对从 compact parts 到 wide parts 的垂直合并进行随机化处理。#48287 (Raúl Marín) 。
- 支持 HDFS 中的 CRC32 校验和,并修复性能问题。#48614 (Alexey Milovidov) 。
- 移除残留的 GCC 支持代码。#48671 (Robert Schulze) 。
- 新增启用新 analyzer 基础设施的 CI 运行。#48719 (Dmitry Novik) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复从后台线程推送的 MV 的 system.query_views_log 问题 #46668 (Azat Khuzhin) 。
- 修复了多个
RENAME COLUMN相关缺陷 #46946 (alesapin) 。 - 修复 clickhouse-format 中轻微的高亮显示问题 #47610 (Natasha Murashkina) 。
- 修复了 LLVM’s libc++ 中的一个 bug,该 bug 会在上传大小大于 INT_MAX 的 S3 分片时导致崩溃 #47693 (Azat Khuzhin) 。
- 修复
sparkbar函数中的溢出问题 #48121 (Vladimir C) 。 - 修复 S3 中的竞态问题 #48190 (Anton Popov).
- 由于行为表现不一致,已禁用聚合函数的 JIT #48195 (Alexey Milovidov) 。
- 修复 ALTER 格式问题 (轻微) #48289 (Natasha Murashkina) 。
- 修复 RabbitMQ 中的 CPU 使用率问题 (在 #44404 之后,23.2 版本中曾恶化) #48311 (Kseniia Sumarokova) 。
- 修复 EXPLAIN PIPELINE 中 Merge over Distributed 的崩溃问题 #48320 (Azat Khuzhin).
- 修复将 LowCardinality 序列化为 Arrow 字典时出现的问题 #48361 (Kruglov Pavel).
- 重置 TemporaryFileStream 中缓存 File 段的下载器 #48386 (Vladimir C) 。
- 修复在 DROP/REPLACE PARTITION 情况下 SYSTEM SYNC REPLICA 可能卡住的问题 #48391 (Azat Khuzhin).
- 修复了加载依赖字典的分布式表时出现的启动错误 #48419 (MikhailBurdukov).
- 自动重命名系统表时不检查依赖关系 #48431 (Raúl Marín).
- 仅更新 KeeperMap 存储中受影响的行 #48435 (Antonio Andelic).
- 修复 VFS 缓存中可能发生的段错误 #48469 (Kseniia Sumarokova) 。
toTimeZone函数在未提供常量字符串时会报错 #48471 (Jordi Villar).- 修复了 Protobuf 中 IPv4 的逻辑错误,并增加了对 Date32 的支持 #48486 (Kruglov Pavel) 。
- system.settings 中对于具有多个值的设置,“changed” 标志计算不正确 #48516 (MikhailBurdukov).
- 修复
Memory存储启用压缩时的问题 #48517 (Anton Popov) 。 - 修复客户端重新连接时,括号粘贴模式导致密码输入异常的问题 #48528 (Michael Kolupaev).
- 修复了键为 IP 和 UUID 类型的嵌套 Map #48556 (Yakov Olkhovskiy) 。
- 修复了哈希字典在使用并行加载器时可能出现的未捕获异常 #48571 (Azat Khuzhin) 。
groupArrayaggregate function 现已可在 Nullable 类型的空结果上正常工作 #48593 (lgbo).- 修复了 Keeper 中的一个 bug:在 ACL 中,节点有时不会以
auth方案创建。 #48595 (Aleksei Filatov). - 允许 IPv4 与 UInt 之间使用比较运算符 #48611 (Yakov Olkhovskiy).
- 修复了 cache 可能引发的错误 #48636 (Kseniia Sumarokova) 。
- 空数据的异步插入将不再引发异常。#48663 (Anton Popov) 。
- 修复 RENAME TABLE 失败时的表依赖关系问题 #48683 (Azat Khuzhin).
- 如果主键中包含重复列 (这只可能出现在投影中) ,在早期版本中可能会导致一个 bug #48838 (Amos Bird) 。
- 修复了 ZooKeeper 在对 send_thread/receive_thread 调用 join 时的竞态条件问题 #48849 (Alexander Gololobov) 。
- 修复在零拷贝复制中尝试删除已忽略的 detached 分片时,出现意外分片名称错误的问题 #48862 (Michael Lex).
- 修复将
Date32Parquet/Arrow 列读入非Date32列时的问题 #48864 (Kruglov Pavel) 。 - 修复了从带有行级策略且列名包含点号的表中查询时出现的
UNKNOWN_IDENTIFIER错误 #48976 (Kruglov Pavel). - 修复对空 Nullable 字符串进行聚合时的问题 #48999 (LiuNeng) 。
ClickHouse 23.3 LTS 版本,2023-03-30。 演示文稿, 视频
升级说明
- 轻量级删除已达到生产可用级别,且默认启用。现在,MergeTree 表的
DELETE查询默认可用。 *domain*RFC和netloc函数的行为略有调整:放宽了 URL authority 中允许的符号范围,以实现更好的规范兼容性。#46841 (Azat Khuzhin).- 现已禁止创建基于 KafkaEngine 且列使用 DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED 语句的表。#47138 (Aleksandr Musorin).
- “异步连接排空”功能已移除。相关设置和指标也一并移除。该功能原本是内部功能,因此此次移除不应影响此前从未听说过它的用户。#47486 (Alexander Tokmakov).
- 现已在
arraySum/Min/Max/Avg/Product、arrayCumSum/CumSumNonNegative、arrayDifference、数组构造、IN 运算符、查询参数、groupArrayMovingSum、统计函数、min/max/any/argMin/argMax、PostgreSQL wire protocol、MySQL 表引擎和函数、sumMap、mapAdd、mapSubtract、arrayIntersect中支持 256 位 Decimal 数据类型 (超过 38 位数字) 。同时为arrayIntersect增加了对大整数的支持。涉及矩的统计聚合函数 (例如corr或各种TTest) 现在将使用Float64作为内部表示 (在此更改之前使用的是Decimal128,但那并无意义) ,并且这些函数在方差为无穷大时可能返回nan而非inf。此前某些函数虽然允许用于Decimal256数据类型,但返回的却是Decimal128;现在这一问题已修复。此更改关闭了 #47569。此更改关闭了 #44864。此更改关闭了 #28335。#47594 (Alexey Milovidov). - 将 backup_threads/restore_threads 改为服务器级设置 (而非用户级设置) 。#47881 (Azat Khuzhin).
- 不允许使用常量和非确定性的二级索引。#46839 (Anton Popov).
新功能
- 新增一种模式,可使用设置
parallel_replicas_custom_key和parallel_replicas_custom_key_filter_type在各副本之间拆分工作。如果集群由一个分片和多个副本组成,则会随机选择最多max_parallel_replicas个副本,并将其作为分片处理。对于每个分片,都会先在发起节点上为查询添加相应的过滤器,然后再将查询发送到该分片。如果集群由多个分片组成,其行为与sample_key相同,但可以定义任意键。#45108 (Antonio Andelic) 。 - 新增一项可在取消时显示部分结果的选项:添加了查询设置
partial_result_on_first_cancel,使已取消的查询 (例如因按下 Ctrl-C 而取消) 能够返回部分结果。#45689 (Alexey Perevyshin). - 新增了对临时表使用任意表引擎的支持 (Replicated 和 KeeperMap 引擎除外) 。关闭 #31497。#46071 (Roman Vasin).
- 新增支持通过 Keeper 中的集中式存储复制用户定义的 SQL 函数。#46085 (Aleksei Filatov) 。
- 实现
system.server_settings(类似于system.settings) ,用于包含服务器配置。#46550 (pufit) 。 - 支持
UNDROP TABLE查询。已关闭 #46811。#47241 (chen). - 允许为 named collections 单独设置授权 (例如,可仅向特定的 named collection 授予
SHOW/CREATE/ALTER/DROP named collection访问权限,而不是一次性授予所有 named collection) 。已关闭 #40894。新增访问类型NAMED_COLLECTION_CONTROL,默认不会授予用户,除非在用户配置中显式添加 (执行GRANT ALL需要此权限) ;此外,与 23.2 不同,用户默认若要拥有完整访问权限,不再需要手动指定show_named_collections。#46241 (Kseniia Sumarokova). - 支持嵌套式自定义磁盘。此前,自定义磁盘仅支持扁平磁盘结构。 #47106 (Kseniia Sumarokova).
- 引入了函数
widthBucket(另提供WIDTH_BUCKET作为兼容性别名) 。#42974。#46790 (avoiderboi) 。 - 新增函数
parseDateTime/parseDateTimeInJodaSyntax,可按指定的格式字符串进行解析。parseDateTime使用 MySQL 语法将 String 解析为 DateTime,parseDateTimeInJodaSyntax使用 Joda 语法进行解析。#46815 (李扬). - 将
dummy UInt8用作表函数null的默认结构。关闭 #46930。#47006 (flynn) 。 - 支持带逗号的日期格式,例如在
parseDateTimeBestEffort函数中支持Dec 15, 2021。已关闭 #46816。#47071 (chen) 。 - 新增设置
http_wait_end_of_query和http_response_buffer_size,分别对应 HTTP 接口中的 URL 参数wait_end_of_query和buffer_size。这样就可以在 profile 中修改这些设置。#47108 (Vladimir C) 。 - 新增
system.dropped_tables表,用于显示从Atomic数据库中删除但尚未完全清除的表。#47364 (chen) 。 - 新增
INSTR,作为positionCaseInsensitive的别名,以兼容 MySQL。已关闭 #47529。#47535 (flynn). - 新增了
toDecimalString函数,可按固定精度将数字转换为字符串。#47838 (Andrey Zvonov) 。 - 新增 MergeTree 设置
max_number_of_mutations_for_replica。该设置将每个副本的 part mutation 数量限制为指定值。0 表示不限制每个副本的变更数量 (但执行仍可能受其他设置约束) 。#48047 (Vladimir C) 。 - 新增与 Map 相关的函数
mapFromArrays,可通过一对数组创建映射。 #31125 (李扬). - 允许控制 Parquet/ORC/Arrow 输出格式中的压缩,并新增对更多压缩输入格式的支持。此更改修复了 #13541。#47114 (Kruglov Pavel) 。
- 为原生协议添加 SSL 用户证书身份验证。解决了 #47077。#47596 (Nikolay Degterinsky) 。
- 为
parseDateTime新增 *OrNull() 和 *OrZero() 变体,并新增别名str_to_date,以与 MySQL 保持一致。#48000 (Robert Schulze). - 新增了运算符
REGEXP(类似于 “LIKE”、“IN”、“MOD” 等运算符) ,以更好地兼容 MySQL #47869 (Robert Schulze) 。
性能改进
- 内存中的标记现已压缩,内存占用降至原来的 1/3 到 1/6。#47290 (Michael Kolupaev) 。
- 在之前的版本中,涉及大量文件的备份慢得令人难以置信。现在不再如此,如今速度快得同样令人难以置信。#47251 (Alexey Milovidov) 。为备份的 IO 操作引入了独立的线程池,使其能够独立于其他线程池进行扩缩容,并提升性能。#47174 (Nikita Mikhaylov) 。在备份处理的最后阶段,使用 MultiRead 请求和重试机制收集元数据。#47243 (Nikita Mikhaylov) 。如果备份和待恢复的数据都位于 S3 中,今后将使用服务器端复制。#47546 (Vitaly Baranov) 。
- 修复了带有
FINAL的查询中过多读取的问题。#47801 (Nikita Taranov) 。 - 在 server 启动时,
max_final_threads设置将被设为核心数 (使用与max_threads相同的算法) 。这提高了高 CPU 核数 server 上final执行的并发性。#47915 (Nikita Taranov) 。 - 允许对使用 CLICKHOUSE 源的 DIRECT 字典以多线程方式执行读取管道。要启用此功能,请在
CREATE DICTIONARYstatement 中 source 的SETTINGS部分设置dictionary_use_async_executor=1。#47986 (Vladimir C) 。 - 优化单个 Nullable 键聚合性能。#45772 (LiuNeng) 。
- 已支持为
hasTokenOrNull、hasTokenCaseInsensitive和hasTokenCaseInsensitiveOrNull使用小写tokenbf_v1索引。 #46252 (ltrk2). - 通过使用 SIMD 搜索前两个字符,优化了函数
position和LIKE。#46289 (Jiebin Sun) 。 - 优化了对
system.detached_parts的查询,因为该表可能会非常大。考虑到块大小限制,增加了多个来源;在每个块中,都会使用一个 IO 线程池并行执行系统调用来计算 part 的大小。#46624 (Sema Checherinda) 。 - 将 ReplicatedMergeTree 表的
max_replicated_merges_in_queue默认值从 16 提升至 1000。这使拥有大量副本的集群 (例如 ClickHouse Cloud 中使用共享存储的集群) 能够更快地执行后台合并操作。#47050 (Alexey Milovidov). - 将
clickhouse-copier更新为使用GROUP BY而非DISTINCT来获取分区列表。对于大型表,这将查询时间从 500 多秒缩短到不到 1 秒。#47386 (Clayton McClure) 。 - 修复
ASOF JOIN的性能下降问题。#47544 (Ongkong). - 进一步加强 Keeper 中的批处理。通过避免在处理读取请求时拆分批次来提升性能。#47978 (Antonio Andelic).
- 允许在列具有不同 DEFAULT 表达式时,对 Merge 使用 PREWHERE。#46831 (Azat Khuzhin) 。
Experimental 功能
- 并行副本:通过更充分地利用本地副本,提升了整体性能,并且默认禁止从非复制的 MergeTree 使用并行副本读取。#47858 (Nikita Mikhaylov).
- 如果启用 experimental analyzer,则支持将
Join、Dictionary和EmbeddedRocksDB表的 JOIN 中的过滤器下推到左表。#47280 (Maksim Kita). - 现在,启用零拷贝复制的 ReplicatedMergeTree 对 Keeper 的负载更低了。#47676 (alesapin).
- 修复了使用 MaterializedPostgreSQL 创建 materialized view 时的问题 #40807 (Maksim Buren).
改进
- 默认启用
input_format_json_ignore_unknown_keys_in_named_tuple设置。#46742 (Kruglov Pavel) 。 - 允许在写入 MATERIALIZED VIEW 时忽略错误 (新增设置
materialized_views_ignore_errors,默认值为false,但对于将日志刷新到system.*_log表的情况,会无条件设为true) 。#46658 (Azat Khuzhin) 。 - 在内存中跟踪分布式发送的文件队列。#45491 (Azat Khuzhin) 。
- 现在,所有通过 HTTP 协议执行的查询,其响应中都会包含
X-ClickHouse-Query-Id和X-ClickHouse-Timezone这两个头。此前仅SELECT查询会返回这两个头。#46364 (Anton Popov) 。 - 来自
MongoDB的外部表:支持通过包含 host:port 列表的 URI 连接到副本集,并支持在 MongoDB 字典中使用 readPreference 选项。示例 URI:mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl&readPreference=primary。#46524 (artem-yadr) 。 - 这项改进对你来说应该是无感知的。基于查询计划重新实现了 projection 分析。新增设置
query_plan_optimize_projection=1,用于在旧版和新版之间切换。修复了 #44963。#46537 (Nikolai Kochetov) 。 - 默认情况下,在输出格式中使用 Parquet v2 格式而非 v1。新增设置
output_format_parquet_version用于控制 Parquet 版本,可选值为1.0、2.4、2.6、2.latest(默认) 。#46617 (Kruglov Pavel) 。 - 现在可以使用新的配置语法来配置名称中带有句点 (
.) 的 Kafka topic。#46752 (Robert Schulze) 。 - 修复了用于检查 hyperscan 模式中有问题的重复项的启发式规则。#46819 (Robert Schulze).
- 当某个块已由另一个副本并发创建时,不要将“ZK 节点已存在”上报到 system.errors 中。#46820 (Raúl Marín) 。
- 提高
clickhouse-local的打开文件数限制。这样一来,它就能在拥有大量 CPU 核心的服务器上从web表读取数据。即使打开的文件过多,也不要停止从 URL 表引擎读取。此更改修复了 #46852。#46853 (Alexey Milovidov) 。 - 现在,当数字无法解析时抛出的异常会提供更易读的错误信息。#46917 (Robert Schulze) 。
- 在每个任务处理完成后更新
system.backups,以跟踪备份进度。#46989 (Aleksandr Musorin) 。 - 允许在 Native input format 中进行类型转换。新增设置
input_format_native_allow_types_conversion来控制该行为 (默认启用) 。#46990 (Kruglov Pavel) 。 - 允许在
range函数中使用 IPv4,以生成 IP 范围。#46995 (Yakov Olkhovskiy) 。 - 优化了在无法将分片从一个卷/磁盘移动到另一个卷/磁盘时的异常消息。#47032 (alesapin) 。
- 在
JSONType函数中支持Bool类型。此前会错误地对 bool 值返回Null类型。#47046 (Anton Popov) 。 - 使用
_request_body参数配置预定义的 HTTP 查询。#47086 (Constantine Peresypkin) 。 - 在内置 UI 的 SQL 编辑器中按下 Enter 键时,会自动进行缩进。#47113 (Alexey Korepanov) 。
- 使用 ‘sudo’ 进行自解压时,会尝试将解压出的文件的 uid 和 gid 设置为当前运行用户。#47116 (Yakov Olkhovskiy) 。
- 此前,
repeat函数的第二个参数仅接受无符号整数类型,因此无法接受 -1 之类的值。这一行为与 Spark 函数不一致。在此次更新中,repeat函数已调整为与 Spark 函数的行为一致。现在,它接受相同类型的输入,包括负整数。我们已进行了充分测试,以验证更新后实现的正确性。#47134 (KevinyhZou)。注意:该更新日志条目由 ChatGPT 重写。 - 移除 stacktraces 中的
::__1部分。将 stacktraces 中的std::basic_string<char, ...显示为String。#47171 (Mike Kot) 。 - 重新实现服务器间模式,以避免重放攻击 (请注意,此更改与旧版服务器向后兼容) 。#47213 (Azat Khuzhin).
- 改进对正则表达式分组的识别,并优化 regexp_tree 字典。#47218 (Han Fei) 。
- Keeper 改进:新增 4LW
clrs,用于清理 Keeper 占用的资源 (例如释放未使用的内存) 。#47256 (Antonio Andelic) 。 - 为编解码器
DoubleDelta(bytes_size)、Gorilla(bytes_size)、FPC(level, float_size)添加可选参数,从而可以在clickhouse-compressor中无需指定列类型即可使用这些编解码器。修复了clickhouse-compressor使用这些编解码器时可能出现的中止和算术错误。修复:https://github.com/ClickHouse/ClickHouse/discussions/47262。 #47271 (Kruglov Pavel) 。 - 为
runningDifference函数添加对大整数类型的支持。关闭 #47194。#47322 (Nikolay Degterinsky) 。 - 为具有过期时间的 S3 凭证增加了一个过期缓冲窗口,以避免在某些边缘情况下出现
ExpiredToken错误。可通过expiration_window_seconds配置控制,默认值为 120 秒。#47423 (Antonio Andelic). - 在
Avro格式中支持 Decimals 和 Date32。#47434 (Kruglov Pavel) 。 - 如果检测到从
Ordinary到Atomic的转换曾被中断,则不要启动服务器,并输出更清晰的错误消息以及故障排查说明。#47487 (Alexander Tokmakov) 。 - 向
system.opentelemetry_span_log添加一个新列kind。该列用于保存 OpenTelemetry 中定义的 SpanKind 的值。#47499 (Frank Chen) 。 - 允许在
Protobuf格式中读写嵌套 Array 时仅使用根字段名作为列名。此前,列名必须包含所有嵌套字段名 (例如a.b.c Array(Array(Array(UInt32))),现在只需使用a Array(Array(Array(UInt32)))) 。#47650 (Kruglov Pavel). - 为
SYSTEM SYNC REPLICA新增了一个可选的STRICTmodifier,使查询会一直等待,直到复制队列清空 (与此前的行为一致:https://github.com/ClickHouse/ClickHouse/pull/45648) 。#47659 (Alexander Tokmakov) 。 - 优化了一些 OpenTelemetry span 日志的命名。#47667 (Frank Chen) 。
- 防止使用过长的聚合函数组合器链 (这可能导致查询在分析阶段变慢) 。这解决了 #47715。#47716 (Alexey Milovidov) 。
- 参数化视图支持子查询;已解决 #46741 #47725 (SmitaRKulkarni) 。
- 修复 MySQL integration 中的内存泄漏问题 (在
connection_auto_close=1时可复现) 。#47732 (Kseniia Sumarokova) 。 - 改进了与 Decimal 参数相关代码的错误处理,使错误消息更加清晰、信息更充分。此前,如果提供了错误的 Decimal 参数,生成的错误消息往往含义不清,难以帮助排查问题。此次更新修复了输出的错误消息,使其能够提供更详细、更有用的信息,从而更容易识别并纠正与 Decimal 参数相关的问题。#47812 (Yu Feng) 。注意:此更新日志条目由 ChatGPT 改写。
- 参数
exact_rows_before_limit用于让rows_before_limit_at_least更准确地反映达到限制前返回的行数。此拉取请求修复了查询涉及跨多个分片的分布式处理或排序操作时出现的问题。在此次更新之前,这些场景无法按预期工作。#47874 (Amos Bird). - ThreadPools 指标的内部信息。 #47880 (Azat Khuzhin).
- 新增
WriteBufferFromS3Microseconds和WriteBufferFromS3RequestsErrorsprofile events。#47885 (Antonio Andelic) 。 - 为 ClickHouse install 新增
--link和--noninteractive(-y) 选项。修复了 #47750。#47887 (Nikolay Degterinsky) 。 - 修复了在附加到其依赖表不可用的 materialized view 时出现的
UNKNOWN_TABLE异常。这在尝试从备份中恢复状态时可能很有用。#47975 (MikhailBurdukov). - 修复了加密磁盘配置中未添加 (可选) 路径时的问题。#47981 (Kseniia Sumarokova) 。
- 参数化视图现已支持 CTE。实现:现已更新为在计算标量子查询时允许使用查询参数。#48065 (SmitaRKulkarni).
- 支持大整数
(U)Int128/(U)Int256、键类型可为任意类型的Map,以及任意精度的DateTime64(不再仅限于 3 和 6) 。#48119 (Kruglov Pavel) 。 - 允许在行输入格式中跳过由未知枚举值导致的错误。#48133 (Alexey Milovidov) 。
构建/测试/打包改进
- ClickHouse 现已使用
C++23构建。#47424 (Robert Schulze)。 - 在 AST Fuzzer 中对
EXPLAIN查询进行模糊测试。#47803 #47852 (flynn)。 - 将压力测试与自动向后兼容性检查 (现称为升级检查) 拆分开来。#44879 (Kruglov Pavel)。
- 更新了 Docker 使用的 Ubuntu 镜像,以平息一些不实的安全报告。#46784 (Julio Jimenez)。请注意,ClickHouse 没有依赖项,也不需要 Docker。
- 在通过 “curl | sh” 下载 ClickHouse 时,新增了一个提示,允许删除已有的
clickhouse下载文件。提示内容为 “ClickHouse binary clickhouse already exists. Overwrite? [y/N]”。#46859 (Dan Roscigno)。 - 修复了旧版发行版 (例如 Amazon Linux 2) 以及 ARM 平台上服务端启动时因找不到 glibc 2.28 符号而报错的问题。#47008 (Robert Schulze)。
- 为 clang 16 做准备。#47027 (Amos Bird)。
- 新增了一项 CI 检查,以确保 ClickHouse 在 ARM 平台上也能使用旧版 glibc 运行。#47063 (Robert Schulze)。
- 添加了一项风格检查,以防止错误使用
NDEBUG宏。#47699 (Alexey Milovidov)。 - 小幅提升了构建速度。#47714 (Alexey Milovidov)。
- 将
vectorscan升级到 5.4.9。#47955 (Robert Schulze)。 - 添加了一个单元测试,用于验证 Apache Arrow 的 fatal 日志不会导致进程中止。该测试覆盖了 ClickHouse/arrow#16 中的更改。#47958 (Arthur Passos)。
- 恢复了原生 macOS 调试版服务端构建可启动的能力。#48050 (Robert Schulze)。注意:此更改仅与开发有关,因为 ClickHouse 官方构建是通过交叉编译完成的。
缺陷修复 (官方稳定版本中用户可感知的异常行为)
- 修复 formats 解析器重置的问题,测试对
Kafka中错误消息的处理 #45693 (Kruglov Pavel). - 修复 Keeper 中数据大小的计算问题 #46086 (Antonio Andelic) 。
- 修复了
ReplicatedMergeTree表和Atomic数据库中DROP TABLE查询自动重试的一个问题。在极少数情况下,如果 ZooKeeper 会话在执行 DROP 期间过期,同时又并行创建了一个在 ZooKeeper 中使用相同路径的新复制表,可能会导致出现Can't get data for node /zk_path/log_pointer和The specified key does not exist错误。 #46384 (Alexander Tokmakov). - 修复了查询规范化过程中错误的别名递归问题,该问题导致某些查询无法运行。#46609 (Raúl Marín) 。
- 修复二进制格式中 IPv4/IPv6 的序列化和反序列化问题 #46616 (Kruglov Pavel).
- ActionsDAG:优化期间不要更改
and的结果 #46653 (Salvatore Mesoraca) 。 - 改进客户端异常退出时的查询取消机制 #46681 (Alexander Tokmakov).
- 修复聚合优化中的算术运算错误 #46705 (Duc Canh Le).
- 修复
clickhouse-local在 JSONEachRow schema inference 期间可能异常退出的问题 #46731 (Kruglov Pavel) 。 - 修复更改已过期角色时的问题 #46772 (Vitaly Baranov) 。
- 修复多个步骤中的 PREWHERE 列合并累积问题 #46785 (Alexander Gololobov).
- 在 HTTP 读取缓冲区中,使用初始范围获取文件大小。若无此更改,某些远程文件将无法被处理。#46824 (Antonio Andelic).
- 修复使用 URL 表时进度条显示不正确的问题 #46830 (Antonio Andelic) 。
- 修复
maxIntersections函数中的 MSan 报告问题 #46847 (Alexey Milovidov) 。 - 修复
Map数据类型中的一个缺陷 #46856 (Alexey Milovidov). - 修复 LIKE 模式中包含用引号括起来的不可引用字符时,某些 LIKE 搜索返回错误结果的问题 #46875 (Robert Schulze).
- 修复 - 当 Filling Transform 处理空块时,WITH FILL 会导致异常终止 #46897 (Yakov Olkhovskiy).
- 修复 JSON 中从字符串推断日期和整数类型的问题 #46972 (Kruglov Pavel) 。
- 修复了拉取期间 zero-copy 复制中的磁盘选择问题 #47010 (alesapin).
- 修复了 systemd 服务定义中的一个拼写错误 #47051 (Palash Goel) 。
- 修复了
CROSS JOIN在algorithm = auto时触发的NOT_IMPLEMENTED错误 #47068 (Vladimir C) 。 - 修复了这样一个问题:当 ‘part_type’ 配置为 ‘InMemory’ 模式时,‘ReplicatedMergeTree’ 表无法插入两条相似数据 (Experimental 功能) 。#47121 (liding1992).
- 外部字典 / library-bridge:修复 “unknown library method ‘extDict_libClone’” 错误 #47136 (alex filatov).
- 修复带有 limit 的 grace 哈希连接中的竞态条件 #47153 (Vladimir C) 。
- 修复 PREWHERE 对具体列的支持 #47154 (Azat Khuzhin) 。
- 修复 Query Status 中可能发生的死锁 #47161 (Kruglov Pavel) 。
- 禁止对同一
Join表执行 insert select,因为这会导致死锁 #47260 (Vladimir C). - 在
min_age_to_force_merge_seconds合并中跳过已合并的分区 #47303 (Antonio Andelic). - 修改 find_first_symbols,使其在 find_first_not_symbols 中也能按预期工作 #47304 (Arthur Passos).
- 修复 CSV 中大数字的类型推断问题 #47410 (Kruglov Pavel) 。
- 对包含别名的表达式禁用逻辑表达式优化器。#47451 (Nikolai Kochetov) 。
- 修复
decodeURLComponent的错误 #47457 (Alexey Milovidov) 。 - 修复带有 projection 的 explain graph 问题 #47473 (flynn) 。
- 修复查询参数问题 #47488 (Alexey Milovidov).
- 参数化视图:修复了一个错误。#47495 (SmitaRKulkarni) 。
- 数据格式模糊测试器及相关修复。#47519 (Alexey Milovidov) 。
- 修复
DateTime64的单调性检查问题 #47526 (Antonio Andelic) 。 - 修复 Nullable LowCardinality 列中的“块结构不匹配”问题 #47537 (Nikolai Kochetov) 。
- 修复了 Apache Parquet 中的一个缺陷 #45878 #47538 (Kruglov Pavel) 。
- 修复
BSONEachRow在文档大小无效时并行解析的问题 #47540 (Kruglov Pavel). - 在
SYSTEM FLUSH DISTRIBUTED时保留system.distribution_queue中的错误信息 #47541 (Azat Khuzhin). - 检查
BSONEachRow格式中是否存在重复列 #47609 (Kruglov Pavel). - 修复移动操作期间等待 zero copy 锁的问题 #47631 (alesapin).
- 修复按分区进行聚合时的问题 #47634 (Nikita Taranov).
- 修复了
BSONEachRow格式中将 Tuple 作为 Array 序列化时的 bug #47690 (Kruglov Pavel) 。 - 修复
polygonsSymDifferenceCartesian中的崩溃问题 #47702 (pufit). - 修复从存储
File读取采用zlib和gzip压缩的文件时的问题 #47796 (Anton Popov). - 改进 PostgreSQL 的空查询检测 (用于 pgx Go 驱动) #47854 (Azat Khuzhin) 。
- 修复了 LowCardinality 类型的 DateTime 单调性检查问题 #47860 (Antonio Andelic) 。
- RESTORE ASYNC 应使用 restore_threads (而不是 backup_threads) #47861 (Azat Khuzhin) 。
- 修复了包含 projections 的 ReplicatedMergeTree 中的 DROP COLUMN 问题 #47883 (Antonio Andelic) 。
- 修复了 Replicated database 的恢复问题 #47901 (Alexander Tokmakov) 。
- 修复 HTTP 中警告信息过于冗长的问题 #47903 (Alexander Tokmakov) 。
- 修复
catboostEvaluate中“字段值过长”的问题 #47970 (Robert Schulze). - 修复 #36971:Watchdog:如果子进程退出,则以非零退出码退出 #47973 (Коренберг Марк).
- 修复“索引文件
cidx长度异常”问题 #48010 (SmitaRKulkarni) 。 - 修复 MaterializedPostgreSQL 中用于获取属性 (replica-identity) 的查询 #48015 (Solomatov Sergei) 。
- parseDateTime():修复 UB (有符号整数溢出问题) #48019 (Robert Schulze) 。
- 在 Avro 中为 Record 使用唯一名称,以避免其 schema 被重复使用 #48057 (Kruglov Pavel) 。
- 修正 Keeper 中 TCP/HTTP 套接字超时时间的设置 #48108 (Antonio Andelic) 。
- 修复
Avro格式中可能发生的空指针成员调用问题 #48184 (Kruglov Pavel) 。
ClickHouse 23.2 发布,2023-02-23。 演示文稿, 视频
向后不兼容的变更
- 为函数 “toDayOfWeek()” (别名:“DAYOFWEEK”) 新增了一个 mode 参数,用于指示一周是从周一还是周日开始,以及计数是从 0 还是 1 开始。为与其他日期时间函数保持一致,mode 参数被插入到 time 和 time zone 参数之间。这会破坏现有的 (此前未文档说明的) 双参数语法 “toDayOfWeek(time, time_zone)” 的用法。修复方法是将该函数改写为 “toDayOfWeek(time, 0, time_zone)”。#45233 (Robert Schulze).
- 将设置
max_query_cache_size重命名为filesystem_cache_max_download_size。#45614 (Kseniia Sumarokova). default用户默认将不再拥有访问类型SHOW NAMED COLLECTION的权限 (例如,default用户将无法再像以前那样向其他用户授予 ALL,因此此 PR 属于向后不兼容变更) 。#46010 (Kseniia Sumarokova).- 如果在 FORMAT clause 之前指定 SETTINGS clause,这些设置也会应用到 formatting。#46003 (Azat Khuzhin).
- 移除对设置
materialized_postgresql_allow_automatic_update的支持 (该设置默认是关闭的) 。#46106 (Kseniia Sumarokova). - 略微提升了
countDigits在真实数据集上的性能。此更改关闭了 #44518。在此前版本中,countDigits(0)返回0;现在返回1,这更准确,也符合现有文档。#46187 (Alexey Milovidov). - 禁止创建使用 “Delta” 或 “DoubleDelta” 编解码器后再接 “Gorilla” 或 “FPC” 编解码器组合进行压缩的新列。可通过设置 “allow_suspicious_codecs = true” 绕过此限制。#45652 (Robert Schulze).
新功能
- 新增
StorageIceberg和表函数iceberg,以访问 S3 上的 Iceberg 表存储。#45384 (flynn) 。 - 允许将存储配置为
SETTINGS disk = '<disk_name>'(而非storage_policy) ,也支持通过显式创建磁盘进行配置:SETTINGS disk = disk(type=s3, ...)。#41976 (Kseniia Sumarokova) 。 - 在
system.part_log中暴露ProfileEvents计数器。#38614 (Bharat Nallan). - 对现有
ReplacingMergeTree引擎的增强,使其允许重复插入。它在一个 MergeTree 引擎中结合了ReplacingMergeTree和CollapsingMergeTree的能力。已删除的数据在查询时不会返回,但也不会从磁盘中移除。#41005 (youennL-cs). - 新增
generateULID函数。修复 #36536。#44662 (Nikolay Degterinsky) 。 - 新增
corrMatrix聚合函数,用于计算任意两列之间的相关性。此外,由于聚合函数covarSamp和covarPop与corr类似,也一并添加了covarSampMatrix和covarPopMatrix。@alexey-milovidov 关闭了 #44587。#44680 (FFFFFFFHHHHHHH). - 引入
arrayShuffle函数,用于随机打乱数组顺序。#45271 (Joanna Hulboj) 。 - 支持 Arrow 中的
FIXED_SIZE_BINARY类型和Parquet中的FIXED_LENGTH_BYTE_ARRAY类型,并将其对应到FixedString。新增设置output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array,用于控制FixedString的默认输出类型。关闭 #45326。#45340 (Kruglov Pavel). - 在 system.replication_queue 中新增列
last_exception_time。#45457 (Frank Chen) 。 - 新增两个函数,允许为 SipHash 自定义 key/seed。#45513 (Salvatore Mesoraca) 。
- 支持表函数
format的三参数版本。关闭 #45808。#45873 (FFFFFFFHHHHHHH) 。 - 为
JodaTime添加对 ‘x’、‘w’、‘S’ 格式的支持。参见 https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html。[#46073](https://github.com/ClickHouse/ClickHouse/pull/46073) (zk_kiger) 。 - 支持窗口函数
ntile。 (lgbo) 。 - 新增设置
final,可将FINAL修饰符隐式应用于每个表。 #40945 (Arthur Passos) 。 - 新增了
arrayPartialSort和arrayPartialReverseSort函数。#46296 (Joanna Hulboj) 。 - 新的 HTTP 参数
client_protocol_version允许为使用 Native format 的 HTTP 响应设置客户端协议版本。#40397。#46360 (Geoff Genz) 。 - 新增函数
regexpExtract,与 Spark 函数REGEXP_EXTRACT保持兼容。它与现有函数extract类似。#46469 (李扬) 。 - 新增函数
JSONArrayLength,用于返回最外层 JSON 数组中的元素个数。如果输入的 JSON 字符串无效,该函数将返回 NULL。#46631 (李扬) 。
性能改进
- 引入的这套逻辑会在 PREWHERE 条件为多个条件的合取 (cond1 AND cond2 AND …) 时生效。它会将需要读取相同列的条件按步骤分组。每个步骤之后,都会计算完整条件中对应的那一部分,并且可能会对结果行进行过滤。这样一来,后续步骤中需要读取的行数会更少,从而节省 IO 带宽并减少计算量。目前,这套逻辑默认处于禁用状态。待确认不会引入任何回归问题后,它将在未来的某个版本中默认启用,因此强烈建议用于测试。它可通过 2 个设置进行控制:“enable_multiple_prewhere_read_steps” 和 “move_all_conditions_to_prewhere”。#46140 (Alexander Gololobov).
- 新增了一个选项:如果表分区键与 group by 键兼容,则可按分区独立聚合。由设置
allow_aggregate_partitions_independently控制。由于适用场景有限,默认禁用 (请参阅文档) 。#45364 (Nikita Taranov) 。 - 允许对 Compact 格式的 parts 使用 Vertical merge algorithm。这将使 ClickHouse server 在后台操作中占用更少的内存。此更改修复了 #46084。#45681 #46282 (Anton Popov) 。
- 使用批次读取器优化
Parquet读取器。#45878 (LiuNeng). - 新增了基于异步 Linux io_uring 子系统的
local_filesystem_read_method方法io_uring;与默认的pread方法相比,它几乎在所有情况下都能提升读取性能。#38456 (Saulius Valatka) 。 - 在逻辑等价的情况下,将参数为
ifexpression 的 aggregate functions 改写为等价形式。例如,avg(if(cond, col, null))可以改写为 avgIf(cond, col)。这有助于提升性能。#44730 (李扬). - 利用 AVX512 指令提升 lower/upper 函数性能。#37894 (yaqi-zhao) 。
- 取消以下限制:在拥有 >=32 个核心且禁用 SMT 的系统上,ClickHouse 只会使用一半的核心 (即在 BIOS 中禁用 Hyper Threading 的情况) 。#44973 (Robert Schulze) 。
- 通过列式执行优化函数
multiIf的性能,提速 2.3 倍。#45296 (李扬) 。 - 为函数
position增加 needle 为空时的快速路径。#45382 (李扬). - 默认启用
query_plan_remove_redundant_sorting优化。该优化在 #45420 中实现。#45567 (Igor Nikonov) 。 - 增大了 HTTP 传输编码的分块大小,以提升通过 HTTP 接口执行大型查询的性能。#45593 (Geoff Genz) 。
- 优化了从包含大量
Array/Map/Nested列的表中读取数据的短SELECT查询的性能。#45630 (Anton Popov) 。 - 优化对大整数和十进制类型进行过滤时的性能。 #45949 (李扬).
- 这一变更可有效降低从 ColumnNullable(UInt8) 获取过滤器的开销,并提升整体查询性能。为了评估这一变更的影响,我们采用了 TPC-H benchmark,但将列类型由非 Nullable 改为 Nullable,并以查询的 QPS 作为性能指标进行测量。#45962 (Zhiguo Zhou).
- 将虚拟列
_part和_partition_id的类型设为LowCardinality(String)。修复了 #45964。#45975 (flynn). - 在标度不变的情况下提升 Decimal 转换性能。#46095 (Alexey Milovidov) 。
- 支持增加读取数据时的预取。#46168 (Kseniia Sumarokova) 。
- 将
arrayExists(x -> x = 1, arr)重写为has(arr, 1),性能提升 1.34 倍。#46188 (李扬) 。 - 修复非远程磁盘上垂直 merge 的 memory usage 过高问题。对远程磁盘遵循
max_insert_delayed_streams_for_parallel_write。#46275 (Nikolai Kochetov) 。 - 将 zstd 更新至 v1.5.4。该版本在性能和压缩率方面有一些小幅改进。如果你运行的是不同版本的 ClickHouse 副本,可能会看到带说明的正常错误消息
Data after merge/mutation is not byte-identical to data on another replicas.。这些消息是正常的,无需担心。#46280 (Raúl Marín). - 修复了由 #39737 引起的性能下降。#46309 (Alexey Milovidov) 。
- 即使复制队列很大,
replicas_status句柄也能快速响应。 #46310 (Alexey Milovidov). - 为聚合函数
sum、一元算术函数和比较函数增加 avx512 支持。#37870 (zhao zhou) 。 - 重写了与标记分布及读取过程整体协调相关的代码,以尽可能提升性能。该更改关闭了 #34527。#43772 (Nikita Mikhaylov) 。
- 移除查询 (子查询) 中冗余的 DISTINCT 子句。该功能基于查询计划实现。对于 DISTINCT 子句,它执行与
optimize_duplicate_order_by_and_distinct类似的优化。可通过query_plan_remove_redundant_distinct设置启用。相关内容见 #42648。#44176 (Igor Nikonov) 。 - 几项查询重写优化:
sumIf(123, cond) -> 123 * countIf(1, cond),sum(if(cond, 123, 0)) -> 123 * countIf(cond),sum(if(cond, 0, 123)) -> 123 * countIf(not(cond))#44728 (李扬) 。 - 改进了受内存限制的合并、按顺序聚合与顶层查询计划之间的交互。此前,在某些实际上并不需要的情况下,我们会回退为对 AIO 进行显式排序。#45892 (Nikita Taranov) 。
- 默认情况下,并发合并采用轮询调度,以确保调度公平且不会发生饥饿。此前,在负载严重过高的分片中,由于使用严格的优先级调度,大型合并可能会因较小的合并而长期得不到执行。新增了
background_merges_mutations_scheduling_policyserver 配置选项,用于选择调度算法 (round_robin或shortest_task_first) 。#46247 (Sergei Trifonov).
改进
- 在 ZooKeeper session 丢失时,默认启用 INSERT 重试。我们已经在生产环境中使用了这一功能。#46308 (Alexey Milovidov).
- 新增了在命名元组的 JSON 对象中忽略未知键的功能 (
input_format_json_ignore_unknown_keys_in_named_tuple) 。#45678 (Azat Khuzhin) 。 - 支持针对带有
final的查询进行优化,将where子句中的排序键表达式下推到prewhere。#38893。#38950 (hexiaoting) 。 - 为备份新增了指标:num_processed_files 和 processed_files_size,用于反映实际已处理的文件数量。#42244 (Aleksandr).
- 新增了对服务器间 DNS 错误的重试机制。#43179 (Anton Kozlov).
- Keeper 改进:尝试在磁盘上预分配空间,以避免出现未定义的磁盘空间耗尽问题。引入设置
max_log_file_size,用于限制 Keeper 的 Raft 日志文件最大大小。#44370 (Antonio Andelic). - 在副本处于只读状态时,优化副本延迟 API 逻辑的行为。#45148 (mateng915) 。
- 当空密码无效时,在 clickhouse-client 中以交互方式提示输入密码。关闭 #46702。#46730 (Nikolay Degterinsky) 。
- 将非 Float* 类型列上的
Gorilla压缩标记为可疑项。#45376 (Robert Schulze) 。 - 在
postpone_reason列中显示执行合并操作的副本名称。#45458 (Frank Chen) 。 - 在 part_log 中保存异常堆栈信息。#45459 (Frank Chen) 。
regexp_tree字典已经过完善,现已兼容 https://github.com/ua-parser/uap-core。[#45631](https://github.com/ClickHouse/ClickHouse/pull/45631) (Han Fei) 。- 改进了对
SYSTEM SYNC REPLICA的检查,解决了 #45508 #45648 (SmitaRKulkarni) 。 - 将设置
replication_alter_partitions_sync更名为alter_sync。#45659 (Antonio Andelic) 。 generateRandom表函数和该引擎现已支持LowCardinality数据类型。这对测试很有帮助,例如你可以写INSERT INTO table SELECT * FROM generateRandom() LIMIT 1000。这是调试 #45590 所必需的。#45661 (Alexey Milovidov) 。- Experimental 查询结果缓存现已提供更模块化的配置选项。#45679 (Robert Schulze) 。
- 将 “query result cache” 更名为 “query cache”。#45682 (Robert Schulze) 。
- 新增
SYSTEM SYNC FILE CACHE命令。该命令会执行sync系统调用。#8921。#45685 (DR) 。 - 新增一个 S3 设置
allow_head_object_request。此 PR 让在 https://github.com/ClickHouse/ClickHouse/pull/45288 中引入的“使用GetObjectAttributes请求代替HeadObject”变为可选 (默认禁用) 。#45701 (Vitaly Baranov) 。 - 新增了可按连接名称覆盖连接设置的功能 (也就是说,现在你不必再为每个连接单独存储密码,只需将所有内容放到
~/.clickhouse-client/config.xml中,甚至还可以为它们使用不同的历史记录文件,这也很有用) 。#45715 (Azat Khuzhin). - Arrow 格式:支持 Duration 类型。修复了 #45669。#45750 (flynn) 。
- 增强 Query Cache 中的日志记录,以改进对缓存行为的调查。#45751 (Robert Schulze) 。
- 查询缓存的服务器级设置现已支持在运行时重新配置。#45758 (Robert Schulze) 。
- 当使用命名集合指定表函数参数时,在日志中隐藏密码。#45774 (Vitaly Baranov) 。
- 改进内部 S3 客户端,使其能够针对不同类型的 URL 正确识别区域和重定向。#45783 (Antonio Andelic) 。
- 为 generateRandom 添加对 Map、IPv4 和 IPv6 类型的支持。主要用于测试。#45785 (Raúl Marín) 。
- 支持在 IP 类型上使用 empty/notEmpty。#45799 (Yakov Olkhovskiy) 。
- 列
num_processed_files已拆分为两列:num_files(用于 BACKUP) 和files_read(用于 RESTORE) 。列processed_files_size已拆分为两列:total_size(用于 BACKUP) 和bytes_read(用于 RESTORE) 。#45800 (Vitaly Baranov) 。 - 为兼容 MySQL,新增了对
SHOW ENGINES查询的支持。#45859 (Filatenkov Artur) 。 - 改进了混淆器对查询的处理方式。#45867 (Raúl Marín) 。
- 改进转换为 Date 时对边界值 65535 (2149-06-06) 的处理。#46042 #45914 (Joanna Hulboj) 。
- 新增设置
check_referential_table_dependencies,用于在DROP TABLE时检查引用依赖关系。此 PR 解决了 #38326。#45936 (Vitaly Baranov) 。 - 修复
tupleElement,使其在参数为Null时返回Null。关闭 #45894。#45952 (flynn) 。 - 如果没有文件匹配 S3 通配符,则报错。关闭了 #45587。#45957 (chen) 。
- 使用集群状态数据检查并发备份/恢复情况。#45982 (SmitaRKulkarni).
- ClickHouse Client:模糊搜索使用 “exact” 匹配,可正确忽略大小写,并采用更适合 SQL 查询匹配的算法。#46000 (Azat Khuzhin) 。
- 禁止使用错误的 create View 语法
CREATE View X TO Y AS SELECT。关闭了 #4331。#46043 (flynn). Log存储家族现已支持设置storage_policy。关闭了 #43421。#46044 (flynn).- 当结果为空时,改进
JSONColumns格式。修复了 #46024。#46053 (flynn) 。 - 新增 SipHash128 的参考实现。#46065 (Salvatore Mesoraca) 。
- 新增一个指标,用于记录使用 mmap 时的分配次数和分配字节数。#46068 (李扬).
- 目前,对于
leftPad、rightPad、leftPadUTF8、rightPadUTF8等函数,第二个参数length必须为 UInt8|16|32|64|128|256。这一限制对 ClickHouse 用户来说过于严格,而且也与arrayResize、substring等其他类似函数不一致。#46103 (李扬) 。 - 修复了调试构建中
welchTTest函数在结果统计量为 NaN 时触发的断言,并将其行为与其他类似函数保持一致。将studentTTest的行为改为返回 NaN,而不是抛出异常,因为之前的行为不够方便。此更改关闭了 #41176 和 #42162。#46141 (Alexey Milovidov). - 更便捷地使用大整数和 ORDER BY WITH FILL。在对大整数 (128 位和 256 位) 执行 ORDER BY 时,允许在 WITH FILL 中将普通整数用作起点和终点。修复了大整数在起点或终点为负数时结果错误的问题。此更改关闭了 #16733。#46152 (Alexey Milovidov) 。
- 在 issue 中,向
system.tables添加parts、active_parts和total_marks列。#46161 (attack204) 。 - 函数 “multi[Fuzzy]Match(Any|AnyIndex|AllIndices}” 现在会拒绝那些在 vectorscan 中很可能导致求值速度非常慢的正则表达式。#46167 (Robert Schulze) 。
- 当启用
insert_null_as_default且列未定义默认值时,将使用该列类型的默认值。此外,此 PR 还修复了在 LowCardinality 列中遇到 null 时使用默认值的问题。#46171 (Kruglov Pavel) 。 - 优先为 S3 客户端使用显式指定的访问密钥。如果将
use_environment_credentials设为true,且用户已通过查询或配置提供访问密钥,则会优先使用这些密钥,而不是环境变量中的密钥。#46191 (Antonio Andelic) 。 - 为函数 “formatDateTime()” 新增别名 “DATE_FORMAT()“,以提高与 MySQL SQL dialect 的兼容性,并为函数
formatDateTime扩展替换:“a”、“b”、“c”、“h”、“i”、“k”、“l”、“r”、“s”、“W”。### 面向用户可见变更的文档条目 用户可读的简短说明:DATE_FORMAT是formatDateTime的别名。它会按照给定的 format string 对 Time 进行格式化。Format 是常量 expression,因此单个结果列不能使用多种格式。 (提供指向 formatDateTime 的链接。) #46302 (Jake Bamrah) 。 - 新增了与并行副本回调任务相关的
ProfileEvents和CurrentMetrics(用于s3Cluster和MergeTree表) 。#46313 (Alexey Milovidov) 。 - 为使用
KeeperMap存储引擎的表新增了对DELETE和UPDATE的支持。#46330 (Antonio Andelic). - 允许在 RENAME 查询中使用查询参数。修复了 #45778。#46407 (Nikolay Degterinsky) 。
- 修复了使用 REPLACE 转换器的参数化 SELECT 查询。解决了 #33002。#46420 (Nikolay Degterinsky) 。
- 在异步指标 “NumberOfDatabases” 的计算中,排除用于临时/外部表的内部数据库。这使其行为与系统表 “system.databases” 保持一致。#46435 (Robert Schulze).
- 在 distribution_queue 表中新增了
last_exception_time列。#46564 (Aleksandr) 。 - 支持在参数化视图的 IN 子句中使用参数。#46583 (SmitaRKulkarni) 。
- 不要在服务器启动时加载命名集合 (改为在首次访问时加载) 。#46607 (Kseniia Sumarokova) 。
构建/测试/打包改进
- 引入由 LLVM 运行时实现的 GWP-ASan。此更改关闭了 #27039。#45226 (Han Fei).
- 我们希望让测试变得更不稳定、更容易随机失败:为测试中的 merge tree settings 增加随机化。#38983 (Anton Popov).
- 在 PowerPC 上启用 HDFS 支持,这有助于修复以下 Functional tests:02113_hdfs_assert.sh、02244_hdfs_cluster.sql 和 02368_cancel_write_into_hdfs.sh。#44949 (MeenaRenganathan22).
- 为 clickhouse-keeper 添加 systemd.service 文件。修复了 #44293。#45568 (Mikhail f. Shiryaev).
- ClickHouse 的 poco fork 已从 “contrib/” 移至 “base/poco/”。#46075 (Robert Schulze).
- 为
clickhouse-watchdog添加一个用于重启子进程的选项。这个选项其实没太大用处。#46312 (Alexey Milovidov). - 如果环境变量
CLICKHOUSE_DOCKER_RESTART_ON_EXIT被设置为 1,Docker 容器将以子进程而非首个进程的方式运行clickhouse-server,并在其退出后将其重启。#46391 (Alexey Milovidov). - 修复 systemd service 文件。#46461 (SuperDJY).
- 将构建 ClickHouse 所需的最低 Clang 版本从 12 提升到 15。#46710 (Robert Schulze).
- 将 Intel QPL 从 v0.3.0 升级到 v1.0.0 2。构建 libaccel-config,并将其静态链接到 QPL 库,而不是动态链接。#45809 (jasperzhu).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 在
StorageRabbitMQ中,数据会严格按照rabbitmq_flush_interval_ms或rabbitmq_max_block_size进行刷新。关闭了 #42389。关闭了 #45160。#44404 (Kseniia Sumarokova). - 在 sparkBar 函数中使用 PODArray 进行渲染,以便控制内存占用。关闭 #44467。#44489 (Duc Canh Le)。
- 修复函数 (quantilesExactExclusive, quantilesExactInclusive) 返回未排序数组元素的问题。#45379 (wujunfu) 。
- 修复了在启用 OpenTelemetry 时,HTTPHandler 中未捕获异常的问题。#45456 (Frank Chen) 。
- 不要根据 8 位数字推断日期,这可能会导致读取到错误的数据。#45581 (Kruglov Pavel).
- 修复了
odbc_bridge_use_connection_pooling设置未被正确使用的问题。#45591 (Bharat Nallan) 。 - 调用缓存中的回调时,该缓存可能已经析构。为确保安全,我们按值捕获成员。对于任务调度来说,这样也是安全的,因为它会在存储销毁前停用。修复 #45548。#45601 (Han Fei) 。
- 修复 Delta 或 DoubleDelta 编解码器与 Gorilla 编解码器组合使用时导致的数据损坏问题。#45615 (Robert Schulze) 。
- 使用 N-gram bloom filter 索引时,正确检查类型以避免无效读取。#45617 (Antonio Andelic) 。
- 已报告了几个与
c-ares相关的段错误。这些问题是在我之前的拉取请求中引入的。我在 Alexander Tokmakov 的帮助下修复了它们。#45629 (Arthur Passos). - 修复遇到重复主键时键描述错误的问题。这种情况可能发生在投影中。详情参见 #45590。#45686 (Amos Bird).
- 为备份设置压缩方法和级别。修复 #45690。#45737 (Pradeep Chhetri) 。
- 应改用
select_query_typed.limitByOffset,而不是select_query_typed.limitOffset。#45817 (刘陶峰) 。 - 使用 Experimental analyzer 时,
SELECT number FROM numbers(100) LIMIT 10 OFFSET 10;这类查询会返回错误结果 (该 SQL 会返回空结果) 。这是由于 planner 额外添加了一个不必要的 offset step 所致。#45822 (刘陶峰). - 向后兼容——允许从 UInt64 到 IPv4 的隐式窄化转换——这是 “INSERT … VALUES …” 表达式所必需的。#45865 (Yakov Olkhovskiy) 。
- 修复 IPv6 解析器在处理首个八位组缺失的混合 IPv4 地址 (如
::.1.2.3) 时的问题。 #45871 (Yakov Olkhovskiy). - 将
query_kind列添加到system.processes表和SHOW PROCESSLIST查询中。移除重复代码。修复了一个 bug:全局配置参数max_concurrent_select_queries对包含INTERSECT或EXCEPT链的查询未正确生效。#45872 (Alexey Milovidov) 。 - 修复了函数
stochasticLinearRegression中的崩溃。该问题由 WingFuzz 发现。#45985 (Nikolai Kochetov) 。 - 修复带有
INTERSECT和EXCEPT修饰符、从启用稀疏列的表中读取数据的SELECT查询发生崩溃的问题 (由设置ratio_of_defaults_for_sparse_serialization控制) 。#45987 (Anton Popov) 。 - 修复了在使用 FINAL 进行 DESC 排序时按顺序读取优化失效的问题,关闭了 #45815。#46009 (Vladimir C).
- 修复了在 compact parts 中读取多级不存在的嵌套列时的问题。#46045 (Azat Khuzhin) 。
- 修复 system.processes 中 elapsed 列的 10 倍误差问题。#46047 (Azat Khuzhin) 。
- 将 domain IP 类型 (IPv4、IPv6) 替换为原生类型 (https://github.com/ClickHouse/ClickHouse/pull/43221) 的后续修复。 #46087 (Yakov Olkhovskiy).
- 修复了配置中环境变量替换的问题:当参数已有值时,也能正确处理。此修复关闭了 #46131。此修复关闭了 #9547。#46144 (pufit) 。
- 修复了 grouping sets 中错误的谓词下推。关闭 #45947。#46151 (flynn).
- 修复了在使用常量键时,
fulls_sorting_join可能引发管道卡住的问题。#46175 (Vladimir C) 。 - 为避免结果错误,在格式化期间切勿将 tuple 函数重写为字面量。#46232 (Salvatore Mesoraca).
- 修复以 Arrow 格式读取 LowCardinality(Nullable) 时可能出现的越界错误。#46270 (Kruglov Pavel).
- 修复
SYSTEM UNFREEZE查询因抛出CANNOT_PARSE_INPUT_ASSERTION_FAILED异常而失败的问题。#46325 (Aleksei Filatov) 。 - 修复了在反序列化存储 HashTable 的函数聚合状态时,可能因整数溢出导致的崩溃问题。#46349 (Nikolai Kochetov) 。
- 修复了在
VALUES格式中发送无效数据时,异步插入可能导致的LOGICAL_ERROR。#46350 (Anton Popov) 。 - 修复了尝试执行
ALTER ... MOVE PART ... TO TABLE时触发的 LOGICAL_ERROR。实际上,这类查询此前从未被支持过。#46359 (Alexander Tokmakov) 。 - 修复在启用
parallel_distributed_insert_select时,并行分布式 insert select 中 s3Cluster schema 推断的问题。#46381 (Kruglov Pavel) 。 - 修复了如下查询:
ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ...,其中arr1和arr2是同一Nested列中的字段。 #46387 (Anton Popov). - 调度器可能无法调度任务。如果出现这种情况,应中止整个 MulityPartUpload,并且
UploadHelper必须等待已调度的任务完成。#46451 (Dmitry Novik). - 修复默认类型不同的 Merge 中的 PREWHERE 问题 (修复了某些列默认类型不一致时出现的
NOT_FOUND_COLUMN_IN_BLOCK,同时允许在各表中该列类型一致时使用PREWHERE,并且仅在类型不一致时才禁止使用) 。#46454 (Azat Khuzhin) 。 - 修复了在
ORDER BY中使用常量值时可能出现的崩溃问题。修复了 #46466。#46493 (Nikolai Kochetov) 。 - 如果在查询级别指定了
disk设置,而在配置的 merge tree settings 部分指定了storage_policy,则不应抛出异常。disk会覆盖配置中的设置。#46533 (Kseniia Sumarokova). - 修复了函数
arrayMap中对常量LowCardinality参数处理不当的问题。该缺陷可能导致在 release 版本中发生段错误,并在 debug 构建中出现逻辑错误Bad cast。#46569 (Alexey Milovidov) 。 - 修复 #46557。#46611 (Alexander Gololobov) 。
- 修复:如果服务器无法在 1 分 30 秒内启动,clickhouse-server 的 systemd 单元会不断重启;现已禁用 systemd 服务启动 clickhouse-server 时的超时逻辑。#46613 (Azat Khuzhin) 。
- 在异步插入期间分配的内存缓冲区却在全局上下文中被释放,且对应用户和查询的 MemoryTracker 计数器未被正确更新,导致误报 OOM 异常。#46622 (Dmitry Novik) 。
- 现已更新为不再从 table_join 中清除 on_expression,因为后续的 analyze 运行还会用到它,解决了 #45185。#46487 (SmitaRKulkarni).
ClickHouse 23.1 发布,2023-01-26。 演示文稿, 视频
ClickHouse 23.1 发布
升级说明
SYSTEM RESTART DISK查询将变为一个空操作。#44647 (alesapin)。HASHED/SPARSE_HASHED字典的PREALLOCATE选项将变为空操作。#45388 (Azat Khuzhin)。它已不再带来明显优势。- 禁止在不是 Float32 或 Float64 类型的列上使用
Gorillacodec。#45252 (Robert Schulze)。这样做没有意义,而且会导致不一致。 - 对于使用已弃用语法创建的
*MergeTree表,并行 quorum insert 可能无法正确工作。因此,这类表的并行 quorum insert 支持已被完全禁用。这不会影响使用新语法创建的表。#45430 (Alexander Tokmakov)。 - 使用
GetObjectAttributes请求而不是HeadObject请求来获取 AWS S3 中对象的大小。比如,此更改修复了在更新 AWS SDK 后,对未显式指定区域的端点的处理问题。#45288 (Vitaly Baranov)。AWS S3 和 Minio 已经过测试,但请注意,各种兼容 S3 的服务 (GCS、R2、B2) 可能存在细微的不兼容情况。此更改还可能要求你调整 ACL,以允许GetObjectAttributes请求。 - 禁止在时区名称中包含路径。例如,不允许使用
/usr/share/zoneinfo/Asia/Aden这样的时区名称;应使用Asia/Aden这样的 IANA 时区数据库名称。#44225 (Kruglov Pavel)。 - 由于会产生错误结果,禁止将等值 join 与常量表达式组合的查询 (例如
JOIN ON t1.x = t2.x AND 1 = 1) 。#44016 (Vladimir C)。
新功能
- 一种通过遍历正则表达式树来提取键的字典源。可用于 User-Agent 解析。#40878 (Vage Ogannisian). #43858 (Han Fei).
- 新增了参数化视图功能,现已支持为 View 表引擎指定查询参数。已解决 #40907。#41687 (SmitaRKulkarni) 。
- 新增
quantileInterpolatedWeighted/quantilesInterpolatedWeighted函数。#38252 (Bharat Nallan) 。 - 支持
Map类型的 Array join,类似于 Spark 中的 “explode” 函数。#43239 (李扬) 。 - 支持符合 SQL 标准的二进制和十六进制字符串字面量。#43785 (Mo Xuan) 。
- 支持以 Joda-Time 风格格式化
DateTime。参见 Joda-Time 文档。#43818 (李扬) 。 - 为
formatDateTime新增了小数秒格式说明符 (%f) 。#44060 (ltrk2)。#44497 (Alexander Gololobov). - 新增
age函数,用于计算两个日期或两个包含时间值的日期之间相差的完整单位数。关闭 #41115。#44421 (Robert Schulze) 。 - 为字典新增
Null源。已关闭 #44240。#44502 (mayamika) 。 - 支持通过
s3_storage_class配置选项设置 S3 存储类,例如<s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>。解决了 #44443。#44707 (chen). - 在解析命名元组时,如果 JSON 对象中缺少元素,则使用默认值进行填充。新增设置
input_format_json_defaults_for_missing_elements_in_named_tuple,用于控制此行为。关闭 #45142#issuecomment-1380153217。#45231 (Kruglov Pavel) 。 - 在 ProfileEvents 中记录 server 启动耗时 (
ServerStartupMilliseconds) 。修复了 #43188。#45250 (SmitaRKulkarni) 。 - 重构并改进流式引擎 Kafka/RabbitMQ/NATS,增加对所有格式的支持,并对格式相关部分做了少量重构: - 修复了在带有后缀/前缀的基于行的格式中生成消息的问题。现在每条消息都会连同所有分隔符一起被完整格式化,并且可以使用输入格式重新解析。 - 支持 Native、Parquet、ORC 等基于块的格式。每个块都会被格式化为一条独立消息。一条消息中的行数取决于块大小,因此可以通过设置
max_block_size进行控制。 - 新增引擎设置kafka_max_rows_per_message/rabbitmq_max_rows_per_message/nats_max_rows_per_message。它们用于控制在基于行的格式中,一条消息内格式化的行数。默认值:1。 - 修复了 NATS 表引擎内存占用过高的问题。 - NATS 生产端现已支持任意二进制数据 (此前仅支持末尾带有 \0 的字符串) - 在文档中补充了缺失的 Kafka/RabbitMQ/NATS 引擎设置。 - 重构了 Kafka/RabbitMQ/NATS 中的生产和消费逻辑,使其与 WriteBuffers/ReadBuffers 语义解耦。 - 重构输出格式:移除 Kafka/RabbitMQ/NATS 中原先对每一行使用的回调 (现在已不再使用这些回调) ,允许直接使用 IRowOutputFormat,明确行结束分隔符和行间分隔符,并支持重置输出格式以重新开始格式化 - 在 formatRow 函数中添加了正确实现 (这是格式重构带来的额外收益) 。#42777 (Kruglov Pavel). - 支持在
CapnProto格式中将Nested表读写为由Struct组成的List。支持将Decimal32/64读写为Int32/64。关闭 #43319。#43379 (Kruglov Pavel) 。 - 向
system.text_log新增了message_format_string列。该列包含用于格式化消息的模式。#44543 (Alexander Tokmakov) 。这使得可以对 ClickHouse 日志进行各种分析。 - 尝试为 CSV/TSV/CustomSeparated 输入格式自动检测包含列名 (以及可能还有类型) 的表头。 新增设置 input_format_tsv/csv/custom_detect_header,用于启用此行为 (默认启用) 。关闭 #44640。#44953 (Kruglov Pavel) 。
Experimental 功能
- 新增实验性的倒排索引,作为一种新的二级索引类型,用于实现高效的文本搜索。#38667 (larryluogit).
- 新增实验性的查询结果缓存。#43797 (Robert Schulze).
- 新增了可扩展且可配置的 IO 请求调度子系统 (尚未与 IO 代码本身集成) 。#41840 (Sergei Trifonov). 这个功能实际上完全没有任何作用,敬请享用。
- 新增了
SYSTEM DROP DATABASE REPLICA,用于删除Replicated数据库中失效副本的元数据。解决了 #41794。#42807 (Alexander Tokmakov).
性能改进
- 启动
MergeTree表时,不加载非活动的 parts。#42181 (Anton Popov) 。 - 改进了从存储
S3和表函数s3读取大量小文件时的延迟表现。现在,从存储S3读取时,设置remote_filesystem_read_method和remote_filesystem_read_prefetch将会生效。#43726 (Anton Popov) 。 - 优化了读取 Parquet/ORC 文件中结构体字段时的性能。现在仅加载所需字段。#44484 (lgbo).
- 两级聚合算法此前曾被误对通过 HTTP 接口执行的查询禁用。现已重新启用,并显著提升了性能。#45450 (Nikolai Kochetov) 。
- 为 StorageFile 增加了 mmap 支持,这将提升 clickhouse-local 的性能。#43927 (pufit) 。
- 在 HashedDictionary 中新增了分片支持,以支持并行加载 (性能几乎可随分片数量实现线性扩展) 。#40003 (Azat Khuzhin) 。
- 提升查询解析速度。#42284 (Raúl Marín) 。
- 当
expr是LowCardinality列时,始终将 OR 链expr = x1 OR ... OR expr = xN替换为expr IN (x1, ..., xN)。在这种情况下,设置optimize_min_equality_disjunction_chain_length会被忽略。#42889 (Guo Wangyang) 。 - 通过优化 ThreadStatus 周边代码,小幅提升性能。#43586 (Zhiguo Zhou) 。
- 通过实现自动向量化,优化按列执行的三元逻辑求值。在这项 microbenchmark 性能测试中,我们在 ICX 设备 (Intel Xeon Platinum 8380 CPU) 上观察到,性能提升峰值可达 21 倍。#43669 (Zhiguo Zhou) 。
- 尽可能避免在
system.tables表上获取读锁。#43840 (Raúl Marín) 。 - 优化 ThreadPool。SSB (Star Schema Benchmark) 在 ICX 设备 (Intel Xeon Platinum 8380 CPU,80 核,160 线程) 上的性能实验表明,此项变更可将
ThreadPoolImpl::mutex的锁竞争有效减少 75%,提高 CPU 利用率,并使整体性能提升 2.4%。#44308 (Zhiguo Zhou) 。 - 现在,只有在缓存的哈希表大小足够大时,才会应用哈希表大小预测优化 (阈值通过经验确定并硬编码) 。#44455 (Nikita Taranov) 。
- 小幅提升了从远程文件系统异步读取的性能。#44868 (Kseniia Sumarokova) 。
- 为以下情况添加快速处理路径:-
col like '%%'; -col like '%'; -col not like '%'; -col not like '%'; -match(col, '.*')。#45244 (李扬) 。 - 对过滤 (WHERE 子句) 中的常见路径优化做了小幅改进。#45289 (Nikita Taranov) 。
- 为
toUnixTimestamp64*提供单调性信息,以便在索引分析中进行更多代数优化。#44116 (Nikita Taranov) 。 - 支持将用于查询处理的临时数据 (落盘) 配置为与文件系统缓存协同工作 (占用缓存磁盘空间) #43972 (Vladimir C) 。这项改进主要适用于 ClickHouse Cloud,但如果你清楚如何操作,也可用于自管理部署。
- 使
system.replicas表能够并行拉取副本状态。关闭 #43918。#43998 (Nikolay Degterinsky). - 优化备份到 S3 时的内存占用:现在,写入 S3 的文件会直接复制,不再使用
WriteBufferFromS3(后者可能会占用大量内存) 。#45188 (Vitaly Baranov) 。 - 为异步块 ID 增加缓存。这样在启用异步插入去重时,可减少对 ZooKeeper 的请求次数。#45106 (Han Fei) 。
改进
- 在无参数的 GenerateRandom 中使用插入目标表的结构。#45239 (Kruglov Pavel) 。
- 允许在
JSONExtract函数中,将存储在 JSON 字符串字段中的浮点数隐式转换为整数。例如:JSONExtract('{"a": "1000.111"}', 'a', 'UInt64')->1000,此前返回的是 0。#45432 (Anton Popov) 。 - 向表
system.formats添加了字段supports_parallel_parsing和supports_parallel_formatting,以便更好地查看内部信息。#45499 (Anton Popov). - 改进了在 CustomSeparated/Template 格式中读取 CSV 字段的功能。关闭 #42352 和 #39620。#43332 (Kruglov Pavel) 。
- 统一查询耗时的测量方式。#43455 (Raúl Marín) 。
- 改进了在
select查询包含虚拟列时,表函数 file/hdfs/s3 自动使用插入目标表结构的能力,从而修复可能出现的错误Block structure mismatch或number of columns mismatch。#43695 (Kruglov Pavel) 。 - 在函数
range中新增了对有符号参数的支持。修复了 #43333。#43733 (sanyu) 。 - 移除冗余排序,例如子查询中与排序相关的 ORDER BY 子句。该功能基于查询计划实现。它在
ORDER BY子句方面执行的优化与optimize_duplicate_order_by_and_distinct类似,但更通用,因为它适用于任何冗余排序步骤 (而不仅限于由 ORDER BY 子句导致的情况) ,并且可应用于任意深度的子查询。相关内容见 #42648。#43905 (Igor Nikonov) 。 - 新增了在 BACKUP 中禁用文件去重的功能 (对于未去重的备份,可使用 ATTACH 而不是完整的 RESTORE) 。例如:
BACKUP foo TO S3(...) SETTINGS deduplicate_files=0(默认值为deduplicate_files=1) 。#43947 (Azat Khuzhin) 。 - 重构并优化文本 formats 的 schema inference。新增设置
schema_inference_make_columns_nullable,用于控制是否将结果类型设为Nullable(默认启用) 。#44019 (Kruglov Pavel) 。 - 进一步增强了对
PROXYv1协议的支持。#44135 (Yakov Olkhovskiy) 。 - 在
system.parts表中新增由清理线程执行的最近一次 part 检查信息。#44244 (Dmitry Novik) 。 - 在只读模式下禁用插入时使用的表函数。#44290 (SmitaRKulkarni) 。
- 新增设置
simultaneous_parts_removal_limit,用于限制 CleanupThread 单次迭代中处理的 parts 数量。#44461 (Dmitry Novik) 。 - 当查询只需要虚拟列时,不要初始化 ReadBufferFromS3。这可能对 #44246 有帮助。#44493 (chen).
- 防止出现重复列名的提示。关闭 #44130。#44519 (Joanna Hulboj) 。
- 允许在磁盘端点中进行 macro 替换。已解决 #40951。#44533 (SmitaRKulkarni) 。
- 在启用
input_format_json_read_object_as_string时,优化 schema inference。#44546 (Kruglov Pavel) 。 - 新增一个用户级设置
database_replicated_allow_replicated_engine_arguments,可用于禁止在DatabaseReplicated中创建带参数的ReplicatedMergeTree表。#44566 (alesapin) 。 - 防止用户误将零值 (无效值) 指定给
index_granularity。此更改关闭了 #44536。#44578 (Alexey Milovidov) 。 - 新增了在 config.xml 的
kerberos部分中通过keytab参数设置 service keytab 文件路径的功能。#44594 (Roman Vasin) 。 - 将查询中已输入的部分用于模糊搜索 (传给
skim库,该库使用 Rust 编写,并以静态链接方式集成到 ClickHouse 中) 。#44600 (Azat Khuzhin) 。 - 默认启用
input_format_json_read_objects_as_strings,以便在 JSON Object 类型仍处于 Experimental 阶段时也能读取嵌套 JSON 对象。#44657 (Kruglov Pavel) 。 - 异步插入去重改进:当用户发起重复的异步插入时,应在查询 Keeper 之前先在内存中完成去重。#44682 (Han Fei).
- 输入/输出
Avro格式将 bool 类型解析为 ClickHouse 的 bool 类型。#44684 (Kruglov Pavel) 。 - 支持 Arrow/Parquet/ORC 中的 Bool 类型。解决了 #43970。#44698 (Kruglov Pavel) 。
- 读取 UUID 时,不要越过引号贪婪解析,否则可能会把错误数据误判为解析成功。#44686 (Raúl Marín).
- 在 Int64 发生 overflow 时推断为 UInt64,并修复 schema inference 中的一些转换问题。 #44696 (Kruglov Pavel).
- 此前,
Replicateddatabase 内部的依赖解析是通过一种比较权宜的方式实现的,现在则改为使用显式图来正确处理。#44697 (Nikita Mikhaylov) 。 - 修复了
output_format_pretty_row_numbers在各个块之间无法保留计数器的问题。关闭 #44815。#44832 (flynn). - 不要将 parts 在与后台清理过程并发合并时产生的错误记录到
system.errors中。 #44874 (Raúl Marín). - 优化并修复 Distributed async INSERT 相关指标。#44922 (Azat Khuzhin) 。
- 新增了用于禁止并发备份和恢复的设置,解决了 #43891。实现:* 新增了服务器级设置,用于禁止并发备份和恢复;这些设置会在 Context 中创建 BackupWorker 时读取并设置。* 这些设置默认值为 true。* 在启动备份或恢复前,新增了检查,以确认是否有其他备份/恢复正在运行。对于内部请求,会通过 backup_uuid 检查请求是否来自当前节点。 #45072 (SmitaRKulkarni).
- 为系统日志新增
<storage_policy>配置参数。#45320 (Stig Bakken) 。
构建/测试/打包改进
- 将
skim库 (使用 Rust 编写) 静态链接进来,用于 clickhouse client/local 历史记录中的模糊搜索。#44239 (Azat Khuzhin). - 由于 Rust,我们移除了对共享链接方式的支持。实际上,Rust 只是移除它的一个借口;即便没有 Rust,我们本来也想把它去掉。#44828 (Alexey Milovidov).
- 从软件包中移除了对
adduser工具的依赖,因为我们并未使用它。这修复了 #44934。#45011 (Alexey Milovidov). SQLite库已更新到最新版本。它用于 SQLite 数据库和表集成引擎。同时还修复了一条 TSan 误报。此更改关闭了 #45027。#45031 (Alexey Milovidov).- 对 CRC-32 进行了修改,以解决 PowerPC 中的 WeakHash 冲突问题。#45144 (MeenaRenganathan22).
- 更新 aws-c* 子模块 #43020 (Vitaly Baranov).
- 自动合并状态为绿色的回移 PR,以及状态为绿色且已获批准的 PR #41110 (Mikhail f. Shiryaev).
- 新增了一个用于查看 ClickHouse CI 状态的网站。来源.
问题修复
- 将 domain IP 类型 (IPv4、IPv6) 替换为原生类型。#43221 (Yakov Olkhovskiy) 。这会自动补齐代码中一些缺失的实现。
- 修复了在备份过程中变更被终止时的备份流程问题。#45351 (Vitaly Baranov) 。
- 修复
Invalid number of rows in Chunk异常信息。#41404。#42126 (Alexander Gololobov) 。 - 修复了排序后执行表达式时可能会使用未初始化值的问题。关闭 #43386 #43635 (Kruglov Pavel) 。
- 改进了聚合组合器中对 NULL 的处理,修复了在使用较冷门的优化
optimize_rewrite_sum_if_to_count_if时可能出现的段错误或逻辑错误。关闭了 #43758。#43813 (Kruglov Pavel) 。 - 修复 CREATE USER/ROLE 查询设置约束相关问题。#43993 (Nikolay Degterinsky) 。
- 修复了表元数据中
EPHEMERAL列默认值无法被解析的问题。#44026 (Yakov Olkhovskiy) 。 - 修复 compatibility 设置中错误版本号的解析问题。#44224 (Kruglov Pavel) 。
- 使从 datetime 中减去时间间隔的行为与加法保持一致。#44241 (ltrk2).
- 取消对视图结果最大尺寸的限制。#44261 (lizhuoyu5).
- 修复了在
do_not_evict_index_and_mrk_files=1时缓存中可能存在的逻辑错误。关闭 #42142。#44268 (Kseniia Sumarokova) 。 - 修复直写缓存中缓存写入可能过早中断的问题 (此前可能会因误判而在本不该停止时停止缓存) 。 #44289 (Kseniia Sumarokova).
- 修复了这样一种可能导致崩溃的问题:在 case 函数中,将带有常量参数的
IN与LowCardinality一同用作常量参数时。修复 #44221。#44346 (Nikolai Kochetov). - 修复了参数化聚合函数对复杂参数 (如数组) 的支持问题。此修复关闭了 #30975。在此更改之前,聚合函数
sumMapFiltered在分布式查询中无法使用。#44358 (Alexey Milovidov) 。 - 修复了 BSON schema 推断中读取 ObjectId 时的问题。#44382 (Kruglov Pavel) 。
- 修复了 ReplicatedMergeTree 中可能导致 merge 完成前临时 parts 被提前删除的竞态问题。该问题可能会引发
No such file or directory: xxx之类的错误。修复 #43983。#44383 (alesapin). - 如果未指定 cluster 名称,一些无效的
SYSTEM ... ON CLUSTER查询会以意料之外的方式执行。该问题已修复,现在无效查询会如预期那样抛出SYNTAX_ERROR。修复了 #44264。#44387 (Alexander Tokmakov) 。 - 修复了 ORC 格式中读取 Map 类型的问题。#44400 (Kruglov Pavel) 。
- 修复了在 Parquet/ORC 格式中读取输入数据中不存在的列时的问题。此前这可能导致错误
INCORRECT_NUMBER_OF_COLUMNS。关闭了 #44333。#44405 (Kruglov Pavel) 。 - 此前,
bar函数一直使用同一个 ’▋’ (U+258B “左侧五分之八块”) 字符来显示 5/8 和 6/8 的条形。这次更改改为使用 ’▊’ (U+258A “左侧四分之三块”) 来显示 6/8 的条形,从而修正了这一问题。#44410 (Alexander Gololobov) 。 - 在配置文件中,如果将 profile settings 放在其约束之后,会导致这些约束失效。#44411 (Konstantin Bogdanov) 。
- 修复了运行带数据的
EXPLAIN AST INSERT查询时出现的SYNTAX_ERROR。关闭 #44207。#44413 (save-my-heart) 。 - 修复了在 CSV format 中读取带有 CRLF 的 Bool 值时的问题。关闭 #44401。#44442 (Kruglov Pavel) 。
- 不要对 LowCardinality 字典执行 and/or/if/multiIf,因此结果类型不能为 LowCardinality。否则在某些情况下可能会导致错误
Illegal column ColumnLowCardinality。修复了 #43603。#44469 (Kruglov Pavel) 。 - 修复了在设置
max_streams_for_merge_tree_reading时变更操作的问题。#44472 (Anton Popov). - 修复 ASTSelectQuery::formatImpl 中在使用 GROUPING SETS 时可能发生的空指针解引用问题 (#43049) 。#44479 (Robert Schulze) 。
- 根据设置,对表函数参数、CAST 函数参数以及 JSONAsObject schema 推断中的类型进行验证。#44501 (Kruglov Pavel).
- 修复 IN 函数在 LowCardinality 和 const 列上的问题,关闭 #44503。#44506 (Duc Canh Le).
- 修复了
CREATE TABLE语句中DEFAULTexpression 规范化时的一个问题。在执行 CREATE 查询期间,函数in的第二个参数 (或运算符IN的右侧参数) 可能会被替换为其求值结果。修复了 #44496。#44547 (Alexander Tokmakov) 。 - 在使用 WITH ROLLUP、WITH CUBE 和 WITH TOTALS 时,projections 不会生效。在之前的版本中,查询会抛出异常,而不是跳过使用 projections。此修复关闭了 #44614。此修复关闭了 #42772。#44615 (Alexey Milovidov) 。
- 由于函数
get all blocks sorted by time未获取异步块,因此这些异步块未被清理。#44651 (Han Fei) 。 - 修复了在 JOIN 与子查询、UNION 和 TOTALS 一起使用时出现的
LOGICAL_ERRORThe top step of the right pipeline should be ExpressionStep问题。修复 #43687。#44673 (Nikolai Kochetov). - 避免在 Executable 表引擎中出现
std::out_of_range异常。#44681 (Kruglov Pavel) 。 - 不要对 AST 中的分位数应用
optimize_syntax_fuse_functions,关闭 #44712。#44713 (Vladimir C). - 修复了 Merge 表和 PREWHERE 中类型错误的缺陷,关闭 #43324。#44716 (Vladimir C) 。
- 修复了关闭期间可能发生的崩溃问题 (在销毁 TraceCollector 时) 。修复 #44757。#44758 (Nikolai Kochetov) 。
- 修复了分布式查询处理中的一个潜在崩溃问题。如果带有 totals 或 extremes 的查询返回空结果,且 Distributed 表与本地表的类型不匹配,就可能发生该崩溃。修复 #44738。#44760 (Nikolai Kochetov) 。
- 修复了拉取 (
min_compressed_bytes_to_fsync_after_fetch) 以及变更中小文件 (ttl.txt、columns.txt,min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge) 的 fsync 问题。#44781 (Azat Khuzhin). - 在分片于磁盘之间移动时,查询
system.parts或system.parts_columns表可能会触发一种罕见的竞态条件。在 #41145 中引入。#44809 (Alexey Milovidov). - 修复了在启用 projection 优化时可能出现的
Context has expired错误。对于包含特定函数 (如在运行时使用 Context 的dictHas/dictGet) 的查询,可复现此问题。修复了 #44844。#44850 (Nikolai Kochetov) 。 - 修复了从远程文件系统读取
LowCardinality字典时可能出现的Cannot read all data错误。修复 #44709。#44875 (Nikolai Kochetov) 。 - 在无法读取硬件监控传感器时,忽略此类情况,而不是在日志中显示完整的异常信息。#44895 (Raúl Marín).
- 如果计算出的 INSERT 延迟时间超过设置值,则使用
max_delay_to_insert的值。相关问题见 #44902。#44916 (Igor Nikonov) 。 - 修复使用
UNION的查询中出现的错误Different order of columns in UNION subquery。修复 #44866。#44920 (Nikolai Kochetov) 。 INSERT的延迟计算可能不正确,从而导致始终将max_delay_to_insert设置用作延迟值,而不是使用正确的值。现在改为采用简单公式max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold),即延迟会随着超出阈值的 parts 数量按比例增加。关闭 #44902。#44954 (Igor Nikonov) 。- 修复了在 wide 分片带有轻量级删除掩码时出现的 alter table TTL 错误。#44959 (Mingliang Pan) 。
- 针对将 IP 域类型 (IPv4、IPv6) 替换为原生类型的后续修复 #43221。#45024 (Yakov Olkhovskiy).
- 针对将 domain IP 类型 (IPv4、IPv6) 替换为原生类型的后续修复,参见 https://github.com/ClickHouse/ClickHouse/pull/43221。 #45043 (Yakov Olkhovskiy).
- 解析器中可能存在缓冲区溢出漏洞。由 fuzzer 发现。#45047 (Alexey Milovidov) 。
- 修复 FileLog 存储中可能出现的 cannot-read-all-data 错误。关闭 #45051、#38257。#45057 (Kseniia Sumarokova) 。
- 当查询中存在 grouping sets 时,内存高效聚合 (设置
distributed_aggregation_memory_efficient) 会被禁用。#45058 (Nikita Taranov) 。 - 修复
RANGE_HASHED字典:指定update_field时,在更新过程中会将范围列计入主键。关闭 #44588。#45061 (Maksim Kita). - 修复嵌套 lambda 的
LowCardinality捕获参数出现Cannot capture column错误的问题。修复了 #45028。#45065 (Nikolai Kochetov). - 修复了在使用 minmax/count 投影时,
additional_table_filters会返回错误查询结果的问题 (未应用额外过滤器) 。#45133 (Nikolai Kochetov). - 修复了
histogram函数错误接受负值的问题。#45147 (simpleton). - 修复 StoreageJoin 中列可空性错误,关闭 #44940。#45184 (Vladimir C).
- 修复
background_fetches_pool_size设置重新加载的问题 (可在运行时增大) 。 #45189 (Raúl Marín). - 正确处理 KV 引擎 (如 KeeperMap、EmbeddedRocksDB) 上的
SELECT查询:当在键上使用IN,且子查询生成的类型不同时,也能正确处理。#45215 (Antonio Andelic) 。 - 修复某些情况下 SEMI JOIN 和 join_use_nulls 的逻辑错误,关闭 #45163 和 #45209。#45230 (Vladimir C).
- 修复从 S3 读取时的 heap-use-after-free 问题。#45253 (Kruglov Pavel) 。
- 修复了 Avro Union 类型为 [‘null’, Nested type] 时的 bug,关闭 #45275。修复了将
bytes类型错误推断为Float的 bug。#45276 (flynn) 。 - 当对使用
Merge存储引擎的表无法使用显式 PREWHERE 时,会抛出恰当的异常。#45319 (Antonio Andelic). - 在 WSL1 Ubuntu 下,由于存在不一致,ClickHouse 自解压程序无法完成解压:
/proc/self/maps报告的是 32 位文件的 inode,而 stat 报告的是 64 位 inode。#45339 (Yakov Olkhovskiy) 。 - 修复了 Distributed 表启动时的竞态问题 (可能导致 async INSERT 的文件被重复处理) 。#45360 (Azat Khuzhin) 。
- 修复了在
ListObject请求失败时,从S3存储和表函数s3读取数据时可能发生崩溃的问题。#45371 (Anton Popov). - 修复当存在结构有问题的字典 (例如 XML 配置中的类型不正确) 时,执行
SELECT ... FROM system.dictionaries会抛出异常的问题。#45399 (Aleksei Filatov). - 修复了在
INSERT INTO ... SELECT * FROM s3Cluster查询中使用插入表结构时的 s3Cluster schema 推断问题。#45422 (Kruglov Pavel) 。 - 修复了 HTTP 下 JSON/BSONEachRow 解析中的一个 bug;该问题可能导致某些列使用默认值,而不是数据中的值。 #45424 (Kruglov Pavel).
- 修复了从文本源对 IP 类型进行类型解析时的错误 (Code: 632. DB::Exception: Unexpected data … after parsed IPv6 value …) 。#45425 (Yakov Olkhovskiy) 。
- 关闭 #45297,增加对空正则表达式的检查。#45428 (Han Fei) 。
- 修复可能出现的 (很可能是分布式) 查询挂起问题。#45448 (Azat Khuzhin) 。
- 修复了在启用
allow_asynchronous_read_from_io_pool_for_merge_tree时,若ThreadPool::schedule抛出异常,可能导致死锁的问题。#45481 (Nikolai Kochetov) 。 - 修复执行 DETACH 后表可能仍被占用的问题。#45493 (Azat Khuzhin) 。
- 修复了一个罕见的中止问题:当查询被取消且其执行过程中使用了并行解析时,会触发该问题。#45498 (Anton Popov).
- 修复了分布式表创建与向其 INSERT 之间的竞态条件 (可能会在向该表执行 INSERT 时导致 CANNOT_LINK) 。#45502 (Azat Khuzhin).
- 为 cache 策略 getter 添加正确的默认值 (SLRU) 。关闭 #45514。#45524 (Kseniia Sumarokova) 。
- 在变更中禁用 array join,关闭了 #42637 #44447 (SmitaRKulkarni) 。
- 修复了限定星号与别名表名及列转换器配合使用时的问题。解决了 #44736。#44755 (SmitaRKulkarni).