2023 年变更日志
目录
ClickHouse 版本 v23.12,2023-12-28
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 设置
clean_deleted_rows已被弃用,不再产生任何效果。OPTIMIZE的CLEANUP关键字默认不被允许(可以通过allow_experimental_replacing_merge_with_cleanup设置解锁)。#58267(Alexander Tokmakov)。这修复了 #57930。这关闭了 #54988。这关闭了 #54570。这关闭了 #50346。这关闭了 #47579。该特性必须被移除,因为其设计并不好。我们必须尽快将其移除,因为别无选择。#57932(Alexey Milovidov)。
新功能
- 实现了可刷新materialized view 功能,需求来源于 #33919。#56946(Michael Kolupaev、Michael Guzov)。
- 引入
PASTE 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)。 - 新增了一个 SQL 函数
sqid,用于生成 Sqids(https://sqids.org/),示例:SELECT sqid(125, 126)。#57512(Robert Schulze)。 - 新增函数
seriesPeriodDetectFFT,用于通过 FFT 检测序列周期。#57574 (Bhavna Jindal)。 - 添加一个用于检查 Keeper 是否已就绪以接受流量的 HTTP 端点。#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)布局的字典支持SHARDS,其方式与HASHED类似。#57544 (vdimir)。 - 为内存中的主键总字节数和已分配主键总字节数添加异步指标。 #57551 (Bharat Nallan).
- 新增
SHA512_256FUNCTION。#57645 (Bharat Nallan)。 - 添加
FORMAT_BYTES作为formatReadableSize的别名。 #57592 (Bharat Nallan). - 允许向
s3表函数传递可选的会话令牌。#57850 (Shani Elharrar). - 引入了一个新的设置项
http_make_head_request。如果将其关闭,URL 表引擎将不会执行 HEAD 请求来确定文件大小。这是为了支持那些低效、配置不当或不具备该功能的 HTTP 服务器。#54602(Fionera)。 - 现在可以在索引(非主键索引)定义中引用 ALIAS 列(issue #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 bucket 只有只读访问权限时,这对于在s3_plain类型磁盘上创建表非常有用。#57977(Pengyuan Bian)。 - MergeTree 表中的主键分析现在也会应用于包含虚拟列
_part_offset(也可以同时包含_part)的谓词。该功能可以作为一种特殊的二级索引。 #58224 (Amos Bird)。
性能优化
- 在执行 FINAL 处理期间,从 MergeTree 表中提取互不相交的分区片段范围,这样我们就可以避免对这些互不相交的分区片段范围执行额外的 FINAL 逻辑。在具有相同主键的重复值数量较少的情况下,性能几乎与不使用 FINAL 时相同。在启用
do_not_merge_across_partitions_select_final设置时,提高 MergeTree 使用 FINAL 时的读取性能。#58120(Maksim Kita)。 - 在 S3 磁盘之间使用 S3 服务器端复制,而不是通过缓冲区中转复制。优化了
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引擎表的 trivial COUNT 优化。 #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). - 在逻辑表达式优化器中为 AND notEquals 条件链添加优化。该优化仅在启用实验性 Analyzer 时可用。 #58214 (Kevin Mingtarja)。
改进
- 在 Keeper 中支持内存软限制。当内存使用接近上限时,将拒绝新的请求。#57271(Han Fei)。#57699(Han Fei)。
- 使对分布式表的插入能够正确处理更新后的集群配置。当集群节点列表被动态更新时,分布式表的 Directory Monitor 会相应更新该列表。#42826 (zhongyuankai)。
- 禁止在合并参数不一致时创建副本表。 #56833 (Duc Canh Le).
- 在
system.tables中显示未压缩的数据大小。#56618。#57186(Chen Lixiang)。 - 为
Distributed表新增skip_unavailable_shards设置,其行为类似于对应的查询级设置。修复 #43666。#57218(Gagan Goel)。 - 函数
substring(别名:substr、mid)现在可以用于Enum类型。此前,第一个函数参数必须是String或FixedString类型的值。这提升了通过 MySQL 接口与 Tableau 等第三方工具的兼容性。#57277(Serge Klochkov)。 formatFUNCTION 现在支持任意类型的参数(而不仅仅是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 格式中,对未命名元组的类型推断进行了小幅改进。#57751 (Kruglov Pavel)。
- 在连接 Keeper 时添加对只读标志的支持(修复 #53749)。#57479(Mikhail Koviazin)。
- 修复在从磁盘恢复批次期间因 “No such file or directory” 导致的分布式发送可能卡住的问题。修复当
distributed_directory_monitor_max_sleep_time_ms> 5 分钟时system.distribution_queue中的error_count可能出现的问题。引入用于跟踪异步 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). - 现在可以使用
KILL QUERY取消sleep()函数。#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)。 - 在仲裁插入检查过程中容忍 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)。
- 并行副本(实验性功能):更友好的配置 #57542 (Igor Nikonov)。
- Parallel replicas(实验性功能):改进 announcement 响应的处理 #57749 (Igor Nikonov)。
- 并行副本(实验性功能):使
ParallelReplicasReadingCoordinator更加尊重min_number_of_marks#57763 (Nikita Taranov)。 - 并行副本(实验性功能):针对 IN (subquery) 禁用并行副本 #58133 (Igor Nikonov)。
- 并行副本(实验性功能):添加 profile 事件 'ParallelReplicasUsedCount' #58173 (Igor Nikonov)。
- 非 POST 请求(例如 HEAD)将与 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 Fast Test 现在使用 Musl 而不是 GLibc。#57711 (Alexey Milovidov). 可从 CI 下载完全静态的 Musl 构建产物。
- 对每个提交运行 ClickBench 基准测试。这解决了 #57708。#57712 (Alexey Milovidov).
- 从外部库中移除有害的 C/POSIX
select函数的使用。#57467 (Igor Nikonov). - 为了方便,在 ClickHouse Cloud 中才可用的设置也会在开源版 ClickHouse 的构建中提供。#57638 (Nikita Mikhaylov).
Bug 修复(官方稳定版本中用户可见的异常行为)
- 修复了在生存时间 (TTL) GROUP BY 中可能导致排序顺序被打乱的问题 #49103(Nikita Mikhaylov)。
- 修复:调整
lttb分桶策略,使第一个和最后一个 bucket 仅包含单个点 #57003 (FFish)。 - 修复在错误后的同步过程中,
Template格式中可能发生的死锁问题 #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(实验性特性):修复问题 #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)。
- 修复实验性的表引擎
MaterializedPostgreSQL的依赖加载问题。 #57754 (Kseniia Sumarokova). - 修复在执行 BACKUP/RESTORE ON CLUSTER 时针对断开连接节点的重试机制 #57764(Vitaly Baranov)。
- 修正在部分物化 PROJECTION 情况下的外部聚合结果 #57790 (Anton Popov)。
- 修复聚合函数中
*Map组合器的合并问题 #57795(Anton Popov)。 - 禁用
system.kafka_consumers,因为其中存在一个缺陷。 #57822 (Azat Khuzhin)。 - 修复 Merge JOIN 对 LowCardinality 键的支持。#57827 (vdimir)。
- 修复
InterpreterCreateQuery与示例数据块相关的问题。#57855 (Maksim Kita). - 来自 PostgreSQL 的命名集合中的
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)。 - 修复在存在包含大整型值的标量子查询时,并行副本(实验性功能)的问题 #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 服务器配置文件现在为
default用户启用了access_management(通过 SQL 查询进行用户管理)和named_collection_control(通过 SQL 查询操作命名集合)。这解决了 #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 或 PROJECTION 中使用了带Decimal参数的该函数,请联系 [email protected]。修复了聚合函数sumMap中的错误,但使其变慢了约 1.5–2 倍。影响不大,因为这个函数本身就基本不可用。这解决了 #54955、#53134 和 #55148。修复了函数groupArraySample中的一个问题——当在一个查询中生成多个聚合状态时,它使用了相同的随机种子。#56350(Alexey Milovidov)。
新功能
- 新增服务器端设置
async_load_databases,用于异步加载数据库和表,从而加快服务器启动时间。适用于使用Ordinary、Atomic和Replicated引擎的数据库,这些数据库中的表会异步加载其元数据。对某个表发起查询时,会提高该表加载任务的优先级,并等待其完成。新增用于自省的表system.asynchronous_loader。 #49351 (Sergei Trifonov). - 新增 system 表
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 会在元数据文件中存储完整的远程对象键,从而提供更高的灵活性并便于优化。 #55566 (Sema Checherinda). - 添加了新的
settings和语法,用于保护命名集合中的字段不被覆盖。其目的是防止恶意用户未经授权获取机密信息。 #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操作改为非实验功能,并废弃allow_experimental_alter_materialized_view_structure设置。修复 #15206。#57311(alesapin)。 join_algorithm设置项现在会遵循指定的顺序 #51745 (vdimir)。- 为 Protobuf 格式增加对 well-known Protobuf 类型 的支持。#56741(János Benjamin Antal)。
性能优化
- 与 S3 交互时采用自适应超时机制。第一次尝试时使用较短的发送和接收超时时间。#56314 (Sema Checherinda).
- 将
max_concurrent_queries的默认值从 100 提高到 1000。在存在大量客户端连接、且它们缓慢发送或接收数据从而使服务器并非受 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)。 - 现在,当数据在页面缓存中时,我们会以同步方式从远程表读取数据(就像对本地表所做的一样)。这样速度更快,不需要在线程池内部进行同步,也可以放心地在本地文件系统上执行
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).
- 减少窗口函数中的虚函数调用次数。#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存储的 glob 通配符匹配性能。 #56141 (Andrey Zvonov). - 实验性全文索引中的 posting list 现已被压缩,可将其大小减少 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 格式文件中读取数据时,如果行尾是
\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 条目的 hosts 列表中查找本地 IP 地址时省去获取所有网络接口的高开销系统调用,提升
ON CLUSTER查询的性能。#54909(Duc Canh Le)。 - 修正了在线程关联到查询或USER之前分配的内存记账方式。 #56089 (Nikita Taranov).
- 在 Apache Arrow 格式中新增对
LARGE_LIST的支持。#56118 (edef)。 - 允许通过
OPTIMIZE查询对EmbeddedRocksDB手动执行 compaction 操作。#56225 (Azat Khuzhin). - 新增支持为
EmbeddedRocksDB表指定 BlockBasedTableOptions。#56264(Azat Khuzhin)。 SHOW COLUMNS现在在通过 MySQL 协议建立连接时,会显示对应的 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)。
- 新增对使用
KeeperMap引擎的表进行备份和恢复的支持。#56460 (Antonio Andelic)。 - 需要重新处理 CompleteMultipartUpload 返回的 404 响应。即使客户端遇到超时或其他网络错误,该操作也可能已经在服务器端完成。下一次重试 CompleteMultipartUpload 时可能会收到 404 响应。如果对象键存在,则该操作被视为已成功完成。#56475 (Sema Checherinda).
- 默认启用 HTTP OPTIONS 方法——这简化了从 Web 浏览器向 ClickHouse 发起请求。#56483 (Alexey Milovidov)。
- 在 #46550 中,
dns_max_consecutive_failures的值被误改——现已回滚并调整为更合适的值。同时,将 HTTP keep-alive 超时时间调高为在生产环境中验证为合理的数值。#56485 (Alexey Milovidov)。 - 延迟加载基础备份(仅在需要时才加载基础备份)。同时为备份增加一些日志消息和 ProfileEvents 事件。#56516 (Vitaly Baranov).
query_cache_store_results_of_queries_with_nondeterministic_functions这个SETTING(取值为false或true)已被标记为弃用。它被新的SETTINGquery_cache_nondeterministic_function_handling所取代,这是一个三值枚举,用于控制查询缓存如何处理包含非确定性函数的查询:a) 抛出异常(默认行为),b) 仍然保存该非确定性查询的结果,或 c) 忽略,即既不抛出异常也不缓存结果。 #56519 (Robert Schulze)。- 在 JOIN ON 子句中,将相等判断重写为
is null检查。实验性功能,仅适用于 Analyzer。#56538 (vdimir)。 concatFUNCTION 现在支持任意参数类型(而不仅仅是 String 和 FixedString 参数)。这使得其行为更加接近 MySQL 的concat实现。例如,SELECT concat('ab', 42)现在返回ab42。#56540(Serge Klochkov)。- 允许从配置文件中的 'named_collection' 部分,或从通过 SQL 创建的 named collection 中获取缓存配置。#56541 (Kseniia Sumarokova)。
- PostgreSQL 数据库引擎:在未能成功连接 PostgreSQL 时,降低删除过期表的激进程度。 #56609 (jsc0218).
- 当连接 URL 不正确时,连接 PG 会耗费过多时间,导致相关查询一直挂起并最终被取消。#56648 (jsc0218).
- Keeper 改进:在 Keeper 中默认禁用压缩日志。 #56763 (Antonio Andelic).
- 新增配置项
wait_dictionaries_load_at_startup。 #56782 (Vitaly Baranov)。 - 在此前的 ClickHouse 版本中存在一个潜在安全漏洞:如果某个用户已建立连接,并尝试使用 “interserver secret” 方法进行身份验证但失败,服务器不会立刻终止连接,而是继续接收并忽略来自客户端的剩余数据包。虽然这些数据包会被忽略,但仍会被解析,如果它们使用了带有另一个已知漏洞的压缩方法,就可能在未通过身份验证的情况下被利用,从而触发该漏洞。此问题由 ClickHouse Bug Bounty Program 发现,报告者为 https://twitter.com/malacupa。#56794(Alexey Milovidov)。
- 获取分片时会等待,直到该分片在远程副本上完全提交。不应发送处于 PreActive 状态的分片。在零拷贝的情况下,这是一项强制性限制。#56808 (Sema Checherinda).
- 修复在使用实验性
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 存储在 system 表中显示
total_bytes和total_rows。#56816 (Aleksandr Musorin)。 - 允许在 TEMPORARY 表上执行 ALTER 的基本命令。 #56892 (Sergey).
- LZ4 压缩。在极少数情况下,当输出缓冲区容量不足以直接写入压缩块时,对压缩块进行缓冲处理。 #56938 (Sema Checherinda).
- 添加用于监控队列中任务数量的指标,对 IO 线程池很有帮助。 #56958 (Alexey Milovidov)。
- 在配置文件中为 PostgreSQL 表引擎新增了一个设置项,添加了对该设置项的检查,并补充了相关文档说明。#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)。 - 服务器的退出码将对应于异常代码。例如,如果服务器因内存限制无法启动,将以代码 241 = MEMORY_LIMIT_EXCEEDED 退出。在此前的版本中,异常的退出码始终是 70 = Poco::Util::ExitCode::EXIT_SOFTWARE。 #57153 (Alexey Milovidov)。
- 不要对来自
functionalC++ 头文件的栈帧执行 demangle 和符号化处理。#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 情况下的一个 bug,改为通过回退到 SW 路径来处理页错误。#57291 (jasperzhu)。 - 将 MergeTree 设置中的
replicated_deduplication_window默认值从 100 提高到 1000。 #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 格式等非关键用途)会在每次构建时都被重新构建,而不受构建缓存影响。该问题已修复。 #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 —— 对于使用
INSERT ... SELECT且其子查询引用插入目标表的情况,应只处理当前插入块。 #50857 (Yakov Olkhovskiy)。 - 修复
str_to_map函数中的一个错误。 #56423 (Arthur Passos)。 - Keeper
reconfig:在让出/获取领导者角色之前添加超时时间 #53481 (Mike Kot)。 - 修复 Grace Hash Join 和 filter pushdown 中错误的 header #53922(vdimir)。
- 现在在表基于表函数时也可以从 system 系统表中查询。 #55540 (MikhailBurdukov).
- RFC:修复在带有 LIMIT BY 的 Distributed 查询中出现的 "Cannot find column X in source stream" 错误 #55836(Azat Khuzhin)。
- 修复在后台运行客户端时出现的“Cannot read from file:”错误 #55976(Kruglov Pavel)。
- 修复在错误的 send_logs_level 设置下 clickhouse-local 异常退出的问题 #55994 (Kruglov Pavel).
- 修复在参数化 VIEW 上执行 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 初始化时出现的段错误(segfault)#56401(Nikolay Degterinsky)。
- 修复 T64 中的缓冲区溢出 #56434(Alexey Milovidov)。
- 修复 FINAL 中 Nullable 主键的问题 (2) #56452 (Amos Bird).
- 修复在初始节点上执行时未指定数据库的 ON CLUSTER 查询 #56484(Nikolay Degterinsky)。
- 修复由于生存时间 (TTL) 依赖关系导致的启动失败问题 #56489(Nikolay Degterinsky)。
- 修复带有
ON CLUSTER的ALTER COMMENT查询的问题 #56491(Nikolay Degterinsky)。 - 修复 ALTER COLUMN 搭配 ALIAS 时的问题 #56493 (Nikolay Degterinsky)。
- 修复空的 NAMED COLLECTIONs #56494(Nikolay Degterinsky)。
- 修复了 PROJECTION 分析中的两个问题。#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中执行INSERT INTO FUNCTION时出现的 'mutex lock failed: Invalid argument' 错误 #56710(Kruglov Pavel)。 - 修复乐观路径下的 Date 文本解析问题 #56765(Kruglov Pavel)。
- 修复 FPC 编解码器中的崩溃 #56795(Alexey Milovidov)。
- DatabaseReplicated:修复在恢复副本后出现的 DDL 查询超时问题 #56796 (Alexander Tokmakov)。
- 修复 MySQL 二进制协议中 Nullable 列错误上报的问题 #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 允许在行尾使用回车符的问题 #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)。
- 修复使用
ARRAY JOIN时的fuzzBits问题 #57033(Antonio Andelic)。 - 修复在使用 joined_subquery_re... 的部分合并 JOIN 中出现的 nullptr 解引用问题。#57048 (vdimir).
- 修复 RemoteSource 中的竞态条件 #57052(Raúl Marín)。
- 为大整数实现
bitHammingDistance#57073 (Alexey Milovidov)。 - 修复 S3 风格链接错误 #57075(Yarik Briukhovetskyi)。
- 修复
JSON_QUERYFUNCTION 在处理多个数值路径时的问题 #57096(KevinyhZou)。 - 修复 Gorilla 编解码器中的缓冲区溢出 #57107(Nikolay Degterinsky)。
- 在认证之前,一旦发生任何异常就关闭服务器间连接 #57142 (Antonio Andelic)。
- 修复在执行针对带有 Nullable MATERIALIZED 列的表的 ALTER UPDATE 后出现的段错误 #57147 (Nikolay Degterinsky)。
- 修复在部分物化的普通 PROJECTION 上进行 JOIN 计划优化时出现的错误 #57196 (Amos Bird)。
- 在比较列描述时忽略注释内容 #57259 (Antonio Andelic).
- 修复在所有场景下的
ReadonlyReplica指标 #57267(Antonio Andelic)。 - 后台合并操作在缓存中正确使用临时数据存储区 #57275 (vdimir)。
- Keeper 针对变更日志和快照的修复 #57299 (Antonio Andelic).
- 当主机名发生变更时,忽略已完成的 ON CLUSTER 任务 #57339 (Alexander Tokmakov)。
- MergeTree mutation 操作复用源数据 part 的索引粒度 #57352 (Maksim Kita).
- FS 缓存:为后台下载添加上限 #57424(Kseniia Sumarokova)。
ClickHouse 23.10 发布版本,2023-11-02
向后不兼容的变更
- 不再提供自动移除损坏数据分区片段的选项。此变更关闭了 #55174。#55184(Alexey Milovidov)。#55557(Jihyuk Bok)。
- 过时的内存数据分区片段将不再能从预写日志(write-ahead log)中读取。如果您之前配置过内存分区片段,在升级前必须将其删除。#55186(Alexey Milovidov)。
- 移除与 Meilisearch 的集成。原因:它只兼容旧的 0.18 版本。Meilisearch 的最新版本修改了协议,已无法继续工作。注意:如果您能帮助我们将该集成恢复,我们将不胜感激。#55189(Alexey Milovidov)。
- 将 directory monitor 概念重命名为 background INSERT。所有
*directory_monitor*相关的设置已被重命名为distributed_background_insert*。向后兼容性应当得到保留(因为已将旧设置名添加为别名)。#55978(Azat Khuzhin)。 - 不再将客户端设置的
send_timeout解释为服务端的receive_timeout,反之亦然。#56035(Azat Khuzhin)。 - 对具有不同单位的时间间隔进行比较时现在会抛出异常。此变更关闭了 #55942。您可能曾不经意地依赖之前的行为:无视时间单位而仅比较底层数值。#56090(Alexey Milovidov)。
- 完全重写了实验性的
S3Queue表引擎:更改了在 ZooKeeper 中保存信息的方式,从而减少对 ZooKeeper 的请求;在我们知道状态不会改变的情况下增加了 ZooKeeper 状态缓存;改进了从 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 函数应用于多个长度相同的数组,并将结果累积到累加器中。 #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'检查特定的 part。#53404 (vdimir).- 新增了函数
jsonMergePatch。在以字符串形式处理 JSON 数据时,它提供了一种方式,将这些 JSON 对象的字符串合并在一起,生成一个仅包含单个 JSON 对象的字符串。#54364 (Memo)。 - Kusto 查询语言方言支持的第二部分。第 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 格式的缓存。#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 引擎中保存未解析的记录和错误。为 NATS 和 RabbitMQ 添加虚拟列
_error和_raw_message,为 FileLog 添加虚拟列_raw_record,这些列会在 ClickHouse 无法解析新记录时被填充。该行为通过存储设置nats_handle_error_mode(用于 NATS)、rabbitmq_handle_error_mode(用于 RabbitMQ)、handle_error_mode(用于 FileLog,类似于kafka_handle_error_mode)进行控制。当设置为default时,ClickHouse 在无法解析记录时会抛出异常;当设置为stream时,错误和原始记录会被保存到虚拟列中。修复了 #36035。#55477(Kruglov Pavel)。 - Keeper 客户端改进:新增
get_all_children_number命令,用于返回指定路径下所有子节点的数量。 #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)。
- 倒排索引中的 posting list 现已优化,可为内部位图使用尽可能紧凑的表示形式。根据数据的重复程度,这可以显著减少倒排索引的空间占用。#55069(Harry Lee)。
- 修复了
Context锁上的争用问题,显著提升了大量短时间运行并发查询的性能。 #55121 (Maksim Kita). - 将倒排索引构建性能提升了 30%。这是通过将
std::unordered_map替换为absl::flat_hash_map实现的。#55210 (Harry Lee)。 - 支持 ORC 过滤下推至行组(rowgroup)级别。 #55330 (李扬).
- 在存在大量临时文件的情况下改进外部聚合性能。 #55489 (Maksim Kita)。
- 默认为二级索引的 marks 缓存设置一个合理的大小,以避免反复加载 marks。 #55654 (Alexey Milovidov)。
- 在读取 skip 索引时,避免不必要的索引粒度重建。解决了 #55653。#55683(Amos Bird)。
- 在执行期间对 Set 中的 CAST 操作进行缓存,以提升在 Set 元素类型与列类型不完全匹配时
IN函数的性能。 #55712 (Duc Canh Le). - 提升了
ColumnVector::insertMany和ColumnVector::insertManyFrom的性能。 #55714 (frinkr). - 通过预测下一行中键的位置来优化 Map 下标访问操作,从而减少比较次数。 #55929 (lgbo).
- 在 Parquet 中支持结构体字段裁剪(在之前的版本中,在某些情况下无法使用)。 #56117 (lgbo).
- 支持根据预估的待读取行数调整查询执行时使用的并行副本数量。 #51692 (Raúl Marín).
- 优化了外部聚合在生成大量临时文件时的内存使用。#54798(Nikita Taranov)。
- 以
async_socket_for_remote模式(默认)执行的分布式查询现在会遵守max_threads限制。此前,某些查询可能会创建过多的线程(最高可达max_distributed_connections),从而导致服务器性能问题。#53504(filimonov)。 - 在从 ZooKeeper 的分布式 DDL 队列执行 DDL 时,对可跳过的条目进行缓存。#54828 (Duc Canh Le)。
- 实验性倒排索引不会存储匹配过多的 token(即倒排列表中的 row id)。这可以节省空间,并避免在顺序扫描同样快甚至更快时仍进行低效的索引查找。之前用于控制何时不存储 token 的启发式规则(传递给索引定义的
density参数)对用户来说过于复杂。现引入一个更为简单、基于参数max_rows_per_postings_list(默认值:64k)的启发式规则,它可直接控制每个倒排列表中允许的最大 row id 数量。#55616(Harry Lee)。 - 提升对
EmbeddedRocksDB表的写入性能。 #55732 (Duc Canh Le). - 在单个分区中存在大量分区片段(超过 1000 个)时,提高了 ClickHouse 的整体健壮性。这可能会减少
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 启用简单计数优化。 #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).
- 在创建 direct 字典时,如果指定了 lifetime 字段,将会被拒绝(因为 lifetime 对于 direct 字典没有意义)。修复:#27861。#49043(Rory Crispin)。
- 允许在带有 PARTITION 子句的查询中使用参数,例如
ALTER TABLE t DROP PARTITION。修复了 #49449。#49516(Nikolay Degterinsky)。 - 为
system.zookeeper_connection添加新列xid。 #50702 (helifu)。 - 在重新加载配置后,在
system.server_settings中显示正确的服务器设置。#53774 (helifu). - 在查询中新增对数学减号字符
−的支持,使其行为类似于-。 #54100 (Alexey Milovidov)。 - 为实验性的
Replicated数据库引擎添加副本组。修复了 #53620 中的问题。#54421(Nikolay Degterinsky)。 - 对于可重试的 S3 错误,与其让查询完全失败,不如进行重试。默认情况下将
s3_retry_attempts的默认值增大。#54770 (Sema Checherinda)。 - 新增负载均衡模式
hostname_levenshtein_distance。 #54826 (JackyWoo)。 - 改进在日志中隐藏敏感信息的机制。 #55089 (Vitaly Baranov).
- 目前 PROJECTION 分析仅在查询计划层面执行。
query_plan_optimize_projection设置已废弃(很久以前就默认启用)。#55112 (Nikita Mikhaylov). - 当在具有命名元素的 tuple 上调用
untuple函数且该函数本身带有别名时(例如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失败,而其真正原因是不同的分区片段中包含了不同的投影。此问题已修复。 #55130 (Nikita Mikhaylov)。 - 允许为同一个 Postgres 表创建多个
MaterializedPostgreSQL表。默认情况下不会启用此行为(出于兼容性考虑,因为这是一个向后不兼容的变更),但可以通过设置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 服务器会检查分区片段集合中是否存在异常分区片段(本地存在但不在 ZooKeeper 中)。所有异常分区片段都会被移动到 detached 目录,服务器则会尝试通过其某个上层(覆盖它们的)分区片段来进行恢复。现在服务器会优先尝试恢复最近的上层分区片段,而不是随机选择任意覆盖分区片段。#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设置为禁用时,可以读取由轻量级删除(lightweight 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)。 - 在关闭服务器之前会打印磁盘上损坏分区片段的路径。在此变更之前,如果某个分区片段在磁盘上损坏且服务器无法启动,几乎无法确定是哪个分区片段损坏。现在这一问题已修复。#56181 (Duc Canh Le)。
构建/测试/打包改进
- 如果 Docker 中的数据库已经完成初始化,则在后续启动时不需要再次初始化。这可以修复在数据库在 1000 次尝试内无法加载时导致容器无限重启的问题(与非常大的数据库和多节点部署相关)。#50724 (Alexander Nikolaev).
- 在 Darwin 的特殊构建任务中,会构建包含子模块的源代码资源。它可用于在不单独检出子模块的情况下构建 ClickHouse。#51435 (Ilya Yatsishin).
- 当在全局启用 AVX 指令集系列(不推荐这样做)时构建 ClickHouse 会出现错误。原因是 snappy 未启用
SNAPPY_HAVE_X86_CRC32。#55049 (monchickey). - 解决了从
clickhouse-server包中启动独立clickhouse-keeper的问题。#55226 (Mikhail f. Shiryaev). - 在测试中,将 RabbitMQ 版本更新为 3.12.6,并改进了 RabbitMQ 测试的日志采集。#55424 (Ilya Yatsishin).
- 调整了 openssl 和 boringssl 之间错误信息的差异,以修复功能测试。#55975 (MeenaRenganathan22).
- 对 apache datasketches 使用上游仓库。#55787 (Nikita Taranov).
Bug 修复(官方稳定版中用户可见的异常行为)
- 在 mutation 中跳过为倒排索引文件创建硬链接 #47663 (cangyin)。
- 修复了
match函数(正则表达式)在模式包含交替(|)时生成错误键条件的 bug,解决了 #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 构造函数发生异常时进行正确清理 #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 缓存中的后台下载问题 #55252(Kseniia Sumarokova)。
- 在缓冲区未完成终结处理时,避免压缩器中可能出现的内存泄漏 #55262 (Azat Khuzhin)。
- 修复在稀疏列上执行函数时的问题 #55275 (Azat Khuzhin)。
- 修复在 SummingMergeTree 上执行 SELECT FINAL 时 Nested 列的错误合并 #55276 (Azat Khuzhin)。
- 修复了在基于 S3 且未启用零拷贝的 ReplicatedMergeTree 表中无法删除已分离分区的问题 #55309 (alesapin)。
- 修复 MergeSortingPartialResultTransform 中的崩溃问题(由于在
remerge之后没有任何数据块)#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). - 修复 stack symbolizer 误解析
DW_FORM_ref_addr并偶尔导致崩溃的问题 #55483 (Michael Kolupaev)。 - 在
AsyncTaskExecutor的cancelBefore中发生异常时销毁 fiber #55516 (Kruglov Pavel)。 - 修复在自定义 HTTP 处理程序中 Query 参数不生效的问题 #55521 (Konstantin Bogdanov)。
- 修复对 Values 格式中未处理数据的检查 #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)。
- 修复在 URL 不包含通配符时 S3 和 Azure 集群函数的进度条问题 #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)。 - 尝试修复 Native 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 模式中带下划线的字段 #55974 (Kruglov Pavel)。
- 修复在使用非默认 scale 时的 dateTime64ToSnowflake64() #55983(Robert Schulze)。
- 修复 Arrow 字典列的输入/输出问题 #55989(Kruglov Pavel)。
- 修复在 AvroConfluent 中从 schema registry 获取 schema 的问题 #55991 (Kruglov Pavel)。
- 修复 Buffer 表中并发执行 ALTER 和 INSERT 时出现的“Block structure mismatch”错误 #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 处理器中移除
status_info配置选项以及字典的状态信息。 #54090 (Alexey Milovidov). - 从代码库中移除实验性的分区片段元数据缓存。 #54215 (Alexey Milovidov).
- 默认禁用
input_format_json_try_infer_numbers_from_strings设置,因此在 JSON 格式中默认不再尝试从字符串推断数字,以避免当样例数据包含看起来像数字的字符串时可能出现的解析错误。 #55099 (Kruglov Pavel).
新功能
- 改进从 JSON 格式推断 schema 的能力:1)现在在 JSON 格式下,通过设置
input_format_json_try_infer_named_tuples_from_objects,可以在不启用实验性 JSON 类型的情况下,从 JSON 对象推断出具名 Tuple。之前在未启用实验性 JSON 类型时,我们只能将 JSON 对象推断为 String 或 Map,现在可以推断为具名 Tuple。最终得到的 Tuple 类型将包含在 schema 推断期间数据样本中读取到的所有对象键。这对于在没有稀疏对象的情况下读取结构化 JSON 数据非常有用。该设置默认启用。2)在设置input_format_json_read_arrays_as_strings下,允许将 JSON 数组解析到类型为 String 的列中。这有助于读取包含不同类型值的数组。3)在设置input_format_json_infer_incomplete_types_as_strings下,允许对样本数据中类型未知(null/[]/{})的 JSON 键使用 String 类型。现在在 JSON 格式中,我们可以将任意值读取到 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_limit" IO 调度节点类型。它允许为通过此节点的流量指定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)现在支持将非常量作为时区参数。#53680(Yarik Briukhovetskyi)。 - 为
ALTER TABLE MODIFY COMMENT添加支持。注意:很久以前有一位外部贡献者添加了类似的功能,但该功能实际上完全不起作用,只会让用户感到困惑。此更改关闭了 #36377。#51304(Alexey Milovidov)。注意:该命令不会在副本之间传播,因此同一张表的副本可能会包含不同的注释。 - 添加了
GCD(“greatest common denominator”,即最大公约数)作为新的数据压缩编解码器。该编解码器会计算所有列值的 GCD,然后将每个值除以该 GCD。GCD 编解码器是数据预处理编解码器(类似 Delta 和 DoubleDelta),不能单独使用。它适用于整数型、十进制数以及日期/时间类型的数据。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,用于以更易读的方式打印 Tuple/Map/Array 等深度嵌套类型的名称。 #55095 (Kruglov Pavel).
性能优化
- 通过默认启用预取功能来加速从 S3 读取数据。#53709(Alexey Milovidov)。
- 对于带有 FINAL 的查询,如非必要,不要在单独的分区片段中隐式读取主键和版本列。 #53919 (Duc Canh Le).
- 优化对常量键的 GROUP BY。将在 https://github.com/ClickHouse/ClickHouse/pull/53529 之后优化按
_file/_path分组的查询。 #53549(Kruglov Pavel)。 - 提升
Decimal列的排序性能。当 ORDER BY 子句包含Decimal列时,提升插入到MergeTree的性能。提升在数据已经排序或几乎已排序情况下的排序性能。#35961(Maksim Kita)。 - 改进大规模查询分析的性能。修复 #51224。#51469(frinkr)。
- 对
COUNT(DISTINCT ...)以及多种uniq变体进行优化:当它们从带有 GROUP BY 的子查询中选取时,将其重写为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). - 当 MergeTree 表位于 VIEW 后面(通过视图访问该表)时,启用 ORDER BY 优化,以按相应顺序从该表中读取数据。#54628(Vitaly Baranov)。
- 通过复用
GeneratorJSONPath并移除若干 shared_ptr 改进 JSON SQL 函数。#54735 (lgbo). - Keeper 会尝试对刷新请求进行批处理以提升性能。 #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).
实验特性
- 现在可以通过设置
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.tablesVIEW 现在新增了字段data_length,用于显示磁盘上数据的大致大小。该字段是运行由 Amazon QuickSight 生成的查询所必需的。 #55037 (Robert Schulze).- MySQL 接口增加了对预处理语句的简易实现,恰好足以通过 MySQL 连接器让 Tableau Online 能够连接到 ClickHouse。#54115(Serge Klochkov)。请注意:当前预处理语句的实现非常精简,我们尚未支持参数绑定;在这个特定的 Tableau Online 使用场景中并不需要该功能。如果在对 Tableau Online 进行广泛测试的过程中发现问题,我们会在后续视需要补充实现该功能。
- 在
regexp_tree字典中支持大小写不敏感和 dot-all 匹配模式。#50906 (Johann Gan)。 - Keeper 改进:为 Keeper 添加
createIfNotExists命令。 #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 过程在恢复时不会因为损坏的分区片段而中止,而是将所有损坏的分区片段复制到带有前缀broken-from-backup的detached目录中。如果为 false,RESTORE 过程会在遇到第一个损坏的分区片段时中止(如果存在)。默认值为 false。#53877(Vitaly Baranov)。 - 将
elapsed_ns字段添加到 HTTP 头部 X-ClickHouse-Progress 和 X-ClickHouse-Summary 中。 #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)。 - 修复使用缓存中的 count 统计时的问题,并改进从归档读取时的进度条。 #54271 (Kruglov Pavel).
- 为通过 SSO 使用的 S3 凭证添加支持。要定义用于 SSO 的配置文件,请设置
AWS_PROFILE环境变量。#54347 (Antonio Andelic)。 - 为输入格式中的嵌套类型 Array/Tuple/Map 增加对将 NULL 作为默认值的支持。解决了 #51100。 #54351(Kruglov Pavel)。
- 允许从 Arrow/Parquet 格式读取某些非常规的分块配置。#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,用于控制当函数 "splitBy*()" 的参数 "max_substring" > 0 时,结果数组中是否包含剩余字符串(如果有)(Python/Spark 语义),或不包含。默认行为不变。 #54518 (Robert Schulze). - 改进了对
Int64/UInt64字段的整数类型推断,是对 #53003 的延续。现在它也适用于诸如数组的数组等嵌套类型,以及map/tuple等函数。Issue:#51236。#54553(Kruglov Pavel)。 - 为标量与数组的乘法、除法和取模添加了运算支持。运算支持任意一侧为标量,例如
5 * [5, 5]和[5, 5] * 5均可使用。 #54608 (Yarik Briukhovetskyi). - 为
keeper-client中的rm命令添加可选的version参数,以支持更安全的删除。#54708 (János Benjamin Antal)。 - 禁止 systemd 强行终止服务器(在使用 Buffer 表时可能导致数据丢失)。 #54744 (Azat Khuzhin).
- 在系统表
system.functions中新增了字段is_deterministic,用于指示某个函数在给定完全相同的输入时,两次调用之间的结果是否保持不变。 #54766 #55035 (Robert Schulze)。 - 使
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)的查询结果时,查询缓存会返回错误。与之前的行为(在不提示的情况下不缓存结果)相比,这减少了困惑和意外。#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 字面量时支持复数形式。
INTERVAL 2 HOURS应当等同于INTERVAL 2 HOUR。 #54860 (Jordi Villar). - 始终允许创建带
Nullable主键的 PROJECTION。修复了 #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).
- 新增
timestampFUNCTION,以实现与 MySQL 的兼容性。关闭了 #54275。#54639(Nikolay Degterinsky)。
构建/测试/打包改进
- 将 ClickHouse 官方发布版和持续集成构建所使用的编译器从 Clang 16 升级到 17。#53831(Robert Schulze)。
- 为查找功能重新生成 tld 数据(
tldLookup.generated.cpp)。#54269(Bharat Nallan)。 - 移除冗余的
clickhouse-keeper-client符号链接。#54587(Tomas Barton)。 - 使用
/usr/bin/env来定位 bash,现在也支持 Nix OS。#54603(Fionera)。 - 在 CMake 中添加了
PROFILE_CPU选项,以便在不使用 DWARF 调用图的情况下执行perf record。#54917(Maksim Kita)。 - 如果链接器不是 LLD,则以致命错误终止构建。#55036(Alexey Milovidov)。
- 将处理(编码/解码)Base64 值的库从 Turbo-Base64 替换为 aklomp-base64。二者在 x86 和 ARM 上都使用 SIMD 加速,但:1. 后者的许可证(BSD-2)对 ClickHouse 更有利,而 Turbo-Base64 已经改为 GPL-3;2. aklomp-base64 在 GitHub 上的 star 更多,看起来更具前景;3. aklomp-base64 拥有略好一些的 API(虽然这在一定程度上是主观的);4. aklomp-base64 不需要我们通过 hack 方式绕过 bug(例如非线程安全的初始化)。注意:aklomp-base64 会拒绝未填充(unpadded)的 Base64 值,而 Turbo-Base64 会尽力对其进行解码。RFC-4648 并未规定是否必须使用 padding,但在具体场景中,这可能会成为需要注意的行为变更。#54119(Mikhail Koviazin)。
缺陷修复(官方稳定版本中用户可见的异常行为)
- 修复在使用 REPLACE/MOVE PARTITION 时 zero-copy replication 的问题(注意:zero-copy replication 是一项实验性功能) #54193 (Alexander Tokmakov).
- 修复使用硬链接的零拷贝锁(注意:“zero-copy replication” 是一项实验性功能)#54859(Alexander Tokmakov)。
- 修复零拷贝产生的垃圾(注意:“zero-copy replication” 是一项实验性功能)#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).
- 修复了在使用字节级相等的分区片段进行替换时出现的内部错误 #53735(Pedro Riera)。
- 修复:在 interpolate 表达式中强制要求指定参与的列 #53754 (Yakov Olkhovskiy)。
- 修复集群发现初始化以及在配置中设置故障注入点 #54113 (vdimir)。
- 修复
accurateCastOrNull的问题 #54136(Salvatore Mesoraca)。 - 修复使用 FINAL 修饰符时 Nullable 主键的问题 #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)。 - 修复:在 Distributed 表上结合并行副本使用且
prefer_localhost_replica= 1 时的行为 #54334 (Igor Nikonov)。 - 修复在垂直合并 + ReplacingMergeTree + OPTIMIZE CLEANUP 过程中的逻辑错误 #54368 (alesapin)。
- 修复
s3表函数中可能出现的URI contains invalid characters错误 #54373(Kruglov Pavel)。 - 修复在对
arrayExistsFUNCTION 进行 AST 优化时发生的段错误 #54379(Nikolay Degterinsky)。 - 在
analysisOfVariance函数中在执行加法前检查是否溢出 #54385 (Antonio Andelic). - 复现并修复
removeSharedRecursive函数中的 bug #54430(Sema Checherinda)。 - 修复在 PREWHERE 和 FINAL 中使用 SimpleAggregateFunction 时可能导致结果不正确的问题 #54436 (Azat Khuzhin)。
- 修复在非 analyzer 模式下使用 indexHint 过滤分区片段的问题 #54449 (Azat Khuzhin)。
- 修复带标准化状态的聚合投影的问题 #54480 (Amos Bird)。
clickhouse-local: 修复 multiquery 参数相关问题 #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 函数在处理包含空格的列名时的模式推断问题 #54635 (Kruglov Pavel)。
- 修复在存在默认值并显式指定插入列时使用插入表结构的错误 #54655 (Kruglov Pavel).
- 修复:避免将可能包含“|”的正则表达式匹配用作键条件。 #54696 (Yakov Olkhovskiy).
- 修复 ReplacingMergeTree 在垂直合并和清理时的问题 #54706 (SmitaRKulkarni).
- 修复在使用 ORDER BY 时虚拟列值不正确的问题 #54811(Michael Kolupaev)。
- 修复在非 analyzer 模式下使用 indexHint 过滤分区片段的问题 #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)。 - 防止附加来自具有不同 PROJECTION 或索引的表的分区片段 #55062(János Benjamin Antal)。
- 在标量结果映射中,为空子查询的结果存储 NULL #52240 (vdimir)。
- 修复
FINAL在极少数情况下会生成无效读取范围的问题 #54934 (Nikita Taranov)。 - 修复:在不进行 Keeper 重试的情况下执行 INSERT QUORUM #55026 (Igor Nikonov).
- 修复在 simple state 中使用 Nullable 的问题 #55030 (Pedro Riera).
ClickHouse 23.8 LTS 版本发布,2023-08-31
向后不兼容变更
- 如果动态磁盘带有名称,则应在 disk 函数参数中写为
disk = disk(name = 'disk_name', ...)。在之前的版本中,可以写为disk = disk_<disk_name>(...),这种方式现已不再支持。#52820 (Kseniia Sumarokova)。 - 当使用
--concurrency大于 1 调用时,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)。 - 弃用元数据缓存功能。该功能是实验性的,我们从未真正使用过。该功能存在风险:#51182。移除
system.merge_tree_metadata_cache系统表。元数据缓存在本版本中仍然可用,但将很快被移除。此变更关闭了 #39197。#51303 (Alexey Milovidov)。 - 在 TLS 连接中禁用 3DES 支持。#52893 (Kenji Noguchi)。
新特性
- 支持直接从 zip/7z/tar 压缩包中导入。例如:
file('*.zip :: *.csv')。 #50321(nikitakeba)。 - 为
trace_type = 'MemorySample'的system.trace_log新增列ptr。该列包含一次内存分配的地址。新增函数flameGraph,可用于构建包含已分配但尚未释放内存的 flamegraph。对 #38391 的重新实现。#45322 (Nikolai Kochetov)。 - 新增表函数
azureBlobStorageCluster。其支持的功能集与表函数s3Cluster非常相似。#50795 (SmitaRKulkarni)。 - 允许在不指定表名的情况下使用
cluster、clusterAllReplicas、remote和remoteSecure,参见 issue #50808。#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(由设置format_capn_proto_use_autogenerated_schema/format_protobuf_use_autogenerated_schema控制)以 CapnProto/Protobuf 格式读写数据。并可在读写时通过设置output_format_schema导出自动生成的 schema。 #52278 (Kruglov Pavel). system.query_log中新增字段query_cache_usage,用于指示是否使用了查询缓存以及具体的使用方式。#52384 (Robert Schulze).- 新增函数
startsWithUTF8和endsWithUTF8。 #52555 (李扬). - 允许在 TSV/CustomSeparated/JSONCompactEachRow 中使用可变数量的列,并使模式推断能够支持列数可变的情况。新增设置
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)。 - 允许在发起端的 mutation 中执行常量非确定性函数。#53129 (Anton Popov)。
- 添加输入格式
One,它不会读取任何数据,而始终返回一行,包含名为dummy、类型为UInt8、值为0的列,类似于system.one。它可以与_file/_path虚拟列一起使用,在不读取任何数据的情况下,列出 file/s3/url/hdfs 等表函数中的文件。 #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)。
实验性特性
- 新增表引擎
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 字符串键的聚合性能。#51399 (LiuNeng)。
- 在 Analyzer 中新增一条针对带 preimage 的时间过滤优化 pass。SSB 在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核、160 线程)上的性能实验表明,在启用实验性 Analyzer 时,此更改可以使几何平均 QPS 提升 8.5%。#52091 (Zhiguo Zhou)。
- 当
uniqExact(COUNT DISTINCT) 函数中的所有哈希集合都是单层结构时,优化合并过程。 #52973 (Jiebin Sun). Join表引擎:不再为所有列克隆哈希 Join 数据结构。#53046 (Duc Canh Le)。- 在不依赖
Apache Arrow库的情况下实现原生ORC输入格式,从而提升性能。#53324 (李扬). - 仪表盘会让服务器对数据进行压缩,这在通过慢速互联网连接查看较长时间范围内的数据时非常有用。例如,一个包含 86400 个点的图表,在未压缩时可能为 1.5 MB,而使用
br压缩后仅为 60 KB。#53569 (Alexey Milovidov)。 - 提升 BACKUP 和 RESTORE 操作对线程池的利用效率。#53649 (Nikita Mikhaylov).
- 在启动时并行加载文件系统缓存元数据。通过缓存配置项
load_metadata_threads(默认值:1)进行配置。相关 issue:#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和合并表中新增partition列。#48990 (Jianfei Hu)。 - 现在可以在运行时(无需重启服务器)动态配置(索引)uncompressed/mark、mmap 和 query 缓存的大小。#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表函数中对连接字符串的检查,因为带有sas的连接字符串并不总是以默认 endpoint 开头;同时在将 Azure 容器添加到 URL 后,更新了连接 URL,使其包含sastoken。#51141 (SmitaRKulkarni)。 - 修正
full_sorting_mergeJOIN 算法中关于过滤 Set 的说明。#51329 (Tanay Tummalapalli)。 - 修复了当
max_block_size非常大时Aggregator的内存占用问题。#51566(Nikita Taranov)。 - 添加了
SYSTEM SYNC FILESYSTEM CACHE命令。它会将内存中的文件系统缓存状态与磁盘上的状态进行比较,并在需要时修复内存状态。只有在你手动修改磁盘上的数据时才需要这样做,而这是一种强烈不建议的做法。#51622(Kseniia Sumarokova)。 - 尝试为 ClickHouse 创建通用代理解析器,同时保持对现有 S3 存储配置代理解析器的向后兼容性。 #51749 (Arthur Passos)。
- 支持从 file/s3/hdfs/url/azureBlobStorage 表函数中读取元组子列。 #51806 (Kruglov Pavel).
- 函数
arrayIntersect现在按照第一个参数中值的顺序返回结果。修复了 #27622。#51850(Yarik Briukhovetskyi)。 - 添加了新的查询语句,可在指定的访问存储中创建/删除访问实体,或在不同访问存储之间迁移访问实体。 #51912 (pufit).
- 使
ALTER TABLE FREEZE查询在 Replicated 数据库引擎中不再在副本之间进行复制。#52064 (Mike Kot). - 新增了在异常关闭时刷新 system 表的功能。#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 可在查询中忽略UNIQUE关键字。 #52320 (Ilya Yatsishin). - 在 Kafka 引擎的某些设置(如 topic、consumer、client_id 等)中新增对预定义宏(
{database}和{table})的支持。#52386(Yury Bogomolov)。 - 在备份/恢复期间禁用更新文件系统缓存。备份/恢复过程中不应更新文件系统缓存,因为看起来这只会拖慢过程而没有任何收益(因为 BACKUP 命令可能会读取大量数据,把所有数据放入文件系统缓存然后立刻将其逐出并没有意义)。 #52402 (Vitaly Baranov)。
- S3 endpoint 的配置允许从根路径开始使用它,并在需要时自动追加 '/'。 #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。目前,我们的数据库名和表名是区分大小写的,但 BI 工具在查询
information_schema时,有时使用小写,有时使用大写。基于这个原因,我们提供了information_schema数据库,其中包含小写表,例如information_schema.tables,以及INFORMATION_SCHEMA数据库,其中包含大写表,例如INFORMATION_SCHEMA.TABLES。但是,有些工具会查询INFORMATION_SCHEMA.tables和information_schema.TABLES。为了解决这个问题,提出的方案是在小写和大写的information_schema数据库中,同时提供一份小写和大写版本的表。#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(可执行文件)相同的默认路径。 #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). - 允许限定文件系统缓存可使用的路径,主要用于动态磁盘。如果在服务器配置中指定了
filesystem_caches_path,则所有文件系统缓存的路径都将被限制在该目录内。例如,如果缓存配置中的path是相对路径,则会被放入filesystem_caches_path中;如果缓存配置中的path是绝对路径,则要求其位于filesystem_caches_path之内。如果在配置中未指定filesystem_caches_path,则行为将与早期版本保持一致。 #53124 (Kseniia Sumarokova). - 添加了一批自定义命令(主要用于简化 ClickHouse 调试)。 #53127 (pufit)。
- 在进行 schema 推断时,添加包含文件名的诊断信息——在使用通配符(globs)处理多个文件时会有所帮助。#53135(Alexey Milovidov)。
- 如果不允许第二个连接创建会话,客户端将使用主连接加载补全建议(suggestions)。 #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 服务器在并发查询少于 100 的情况下,就可以达到每秒数万次查询(QPS)。#53285 (Alexey Milovidov)。 - 限制后台分区优化合并任务的并发数量。#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)。- 为用于备份的 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)。 - 为 system 数据库中的表添加了异步指标,例如
TotalBytesOfMergeTreeTablesSystem。修复了 #53603。#53604(Alexey Milovidov)。 - Play UI 和 Dashboard 中的 SQL 编辑器将不会使用 Grammarly。 #53614 (Alexey Milovidov).
- 作为高级配置项,现在可以 (1) 配置 [index] 标记/未压缩缓存的 size_ratio(即受保护队列的相对大小),(2) 配置索引标记缓存和索引未压缩缓存的缓存策略。#53657(Robert Schulze)。
- 在 TCPHandler 中为查询数据包增加客户端信息校验。 #53673 (Alexey Gerasimchuck).
- 在与 Microsoft Azure 交互时,如遇网络错误,将重试加载分区片段。#53750 (SmitaRKulkarni)。
- 为异常提供堆栈追踪,并且物化视图(Materialized View)的异常会被向上传播。 #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). - 在 CI 中添加 https://github.com/elliotchance/sqltest,用于报告 SQL 2016 标准符合性。#52293(Alexey Milovidov)。
- 将 PRQL 升级至 0.9.3。 #53060 (Maximilian Roos).
- CI 检查产生的系统表已导出到 ClickHouse Cloud。 #53086 (Alexey Milovidov).
- 编译器的性能分析数据(
-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).
- 从模糊测试的 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)。
Bug Fix(官方稳定版本中用户可见的异常行为)
- 在构建包含多个 mark 的索引时,不再重置(实验性)Annoy 索引 #51325 (Tian Xinhui)。
- 修复 RESTORE 期间临时目录的使用方式 #51493 (Azat Khuzhin).
- 修复 Nullable(IPv4) 的二元算术运算 #51642 (Yakov Olkhovskiy).
- 支持将 IPv4 和 IPv6 数据类型用作字典属性 #51756 (Yakov Olkhovskiy).
- 修复了压缩标记校验和的错误 #51777 (SmitaRKulkarni)。
- 修复在 CSV 最佳努力解析模式中错误地将逗号解析为 datetime 值一部分的问题 #51950(Kruglov Pavel)。
- 当可执行 UDF 带有参数时不再抛出异常 #51961 (Nikita Taranov).
- 修复 skip 索引和投影在
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). - 修复在多列排序且使用 nulls first 顺序时出现的意外排序结果 #52761 (copperybean).
- 修复 Keeper 重新配置过程中出现的数据竞争问题 #52804(Antonio Andelic)。
- 修复在 limit 较大时对稀疏列进行排序的错误 #52827 (Anton Popov).
- clickhouse-keeper:修复基于 poll 的服务器实现。 #52833 (Andy Fiddaman).
- 使 regexp 分析器支持识别命名捕获组 #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 缓存中删除键前缀为空的目录时出现的罕见竞态条件 #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)。
- 实验性 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)。
- 修复在路径为纯数字时
JSON_QUERY函数解析错误的问题 #53470(KevinyhZou)。 - 修复在使用并行 FINAL 时查询中的列顺序错误。#53489 (Nikolai Kochetov).
- 修复了在启用 do_not_merge_across_partitions_select_final 时对 ReplacingMergeTree 表执行 SELECT 的问题 #53511 (Vasily Nemkov).
- 在关闭时先刷新异步插入队列 #53547 (joelynch)。
- 修复在对稀疏列执行 join 时出现的崩溃 #53548 (vdimir).
- 修复了在参数错误的函数中使用 Set 跳过索引时可能出现的未定义行为 #53559 (Azat Khuzhin)。
- 修复倒排索引(实验性功能)中可能出现的未定义行为(UB) #53560(Azat Khuzhin)。
- 修复:
interpolate表达式现在使用源列,而不是使用在SELECT表达式中具有相同名称的别名列。#53572(Yakov Olkhovskiy)。 - 修正 EXPLAIN PLAN 中 index=1 时被丢弃的 granule 数量 #53616 (wangxiaobo)。
- 在使用
DelayedSource时正确处理 totals 和 extremes #53644(Antonio Andelic)。 - 修复变更流水线中的 prepared Set 缓存可能卡住的问题 #53645 (Nikolai Kochetov).
- 修复在
UPDATE和DELETE查询谓词中使用 JSON 类型子列时的 mutation 错误。 #53677 (VanDarkholme7). - 修复
full_sorting_mergeJOIN 的过滤下推 #53699 (vdimir)。 - 尝试修复
NULL::LowCardinality(Nullable(...)) NOT IN的 bug #53706(Andrey Zvonov)。 - Fix: 修复对包含稀疏列的有序 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 透传)。这将导致在降级后无法处理现有的分布式 DDL 条目(但请注意,通常不应存在此类未处理条目)。#52128(Azat Khuzhin)。
- 以与普通元数据相同的方式检查 PROJECTION 元数据。若存在包含无效 PROJECTION 的表,此更改可能会阻止服务器启动。例如,一个在主键中创建按位置引用列的 PROJECTION(如
projection p (select * order by 1, 4)),在表主键中是不允许的,并且可能在插入/合并期间导致崩溃。请在升级前删除此类 PROJECTION。修复 #52353。#52361(Nikolai Kochetov)。 - 由于存在 Bug,实验特性
hashid已被移除。其实现质量从一开始就存在疑问,并且始终未能脱离实验状态。此更改关闭了 #52406。#52449(Alexey Milovidov)。
新增功能
- 新增
Overlay数据库引擎,用于将多个数据库组合为一个。新增Filesystem数据库引擎,用于将文件系统中的目录表示为一组隐式可用的表,其格式和结构可自动检测。新增S3数据库引擎,通过将前缀表示为一组表,以只读方式访问 S3 存储。新增HDFS数据库引擎,可以相同方式访问 HDFS 存储。 #48821 (alekseygolub). - 在 Keeper 中新增对外部磁盘的支持,用于存储快照和日志。#50098(Antonio Andelic)。
- 为多目录选择(
{})glob 模式添加支持。#50559 (Andrey Zvonov)。 - Kafka 连接器支持使用 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 bin 的统计信息。查询示例: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)。 - CREATE TABLE 语句现在支持在列定义中使用
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和now添加别名:today现在也可以使用名称curdate/current_date,now则可以使用current_timestamp。 #52106 (Lloyd-Pottiger). - 在异步插入中支持
async_deduplication_token。#52136 (Han Fei). - 新增设置项
disable_url_encoding,允许在 URL 引擎中禁用对 URI 路径的编码/解码。#52337 (Kruglov Pavel)。
性能优化
- 默认启用自动选择稀疏序列化格式,以提升性能。该格式从 22.1 版本开始支持。此变更后,可能无法再降级到早于 22.1 的版本。若需降级,可能需要将
ratio_of_defaults_for_sparse_serialization设置为0.937555153。你可以通过在 MergeTree 表上将ratio_of_defaults_for_sparse_serialization = 1SETTING 来关闭稀疏序列化格式的使用。#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 条件链的末尾。这样做的原因是,包含主键列的条件很可能会在主键分析阶段被使用,对 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)。 - 修复错误的 PROJECTION 分析导致主键失效的问题。该问题仅在
query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1时存在。修复了 #48823。修复了 #51173。#52308(Amos Bird)。 - 减少在
FileCache::loadMetadata中的系统调用次数——如果配置了文件系统缓存,这将加快服务器启动速度。#52435(Raúl Marín)。 - 通过在后台下载剩余数据,可以为文件段大小设置严格的下边界。文件段的最小大小(如果实际文件大小更大)通过缓存配置项
boundary_alignment进行配置,默认值为4Mi。后台线程数量通过缓存配置项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,用于指定副本在关闭用于复制发送的服务器间处理器之前需要等待的时间。同时修复了在关闭表和服务器间处理器时的不一致:现在服务器会先关闭表,然后再关闭服务器间处理器。#51851 (alesapin). - 允许按照 SQL 标准在没有
OFFSET的情况下使用FETCH。参见 https://antonz.org/sql-fetch/。#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设置项。这是通用查询模糊测试器所必需的。#49343 (Alexey Milovidov)。 - 修复
geoHash函数的两个问题。#50066 (李扬). - 将异步插入刷新(flush)查询记录到
system.query_log中。 #51160 (Raúl Marín). - 函数
date_diff和age现在支持毫秒/微秒单位,并可在微秒级精度下工作。#51291 (Dmitry Kardymon)。 - 改进 clickhouse-keeper-client 中的路径解析。#51359 (Azat Khuzhin)。
- 一个依赖于 ClickHouse 的第三方产品(Gluten: a Plugin to Double Spark SQL's Performance)存在一个缺陷。该修复在从 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设置中添加占位符%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)。
- 修复仪表盘页面中未显示与身份验证无关错误的问题,同时修复图表“重叠”显示的问题。 #51744 (Zach Naimon).
- 支持 UUID 到 UInt128 的转换。 #51765 (Dmitry Kardymon)。
- 为
rangeFUNCTION 新增对 Nullable 参数的支持。 #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).
- 允许在 DESCRIBE TABLE 查询中在 FORMAT 之前使用 SETTINGS,以保持与 SELECT 查询的兼容性。修复问题 #51544。#51899(Nikolay Degterinsky)。
- Var-Int 编码整数(例如原生协议中使用的整数)现在可以使用完整的 64 位取值范围。建议第三方客户端相应更新其 Var-Int 编码实现。#51905 (Robert Schulze).
- 在证书发生变更时自动更新证书,而无需手动执行 SYSTEM RELOAD CONFIG。#52030 (Mike Kot)。
- 新增了
allow_create_index_without_typeSETTING,用于忽略未指定TYPE的ADD INDEX查询。标准 SQL 查询将在不更改表结构的情况下直接执行成功。#52056(Ilya Yatsishin)。 - 自服务器启动时起,日志消息就会被写入
system.text_log。#52113 (Dmitry Kardymon). - 在 HTTP 端点具有多个 IP 地址且第一个 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 primitives 的有效性。关闭了:#27090。#52260 (Nikita Mikhaylov)。
- 在
query_plan_optimize_projection = 1时补充缺失的 projection QueryAccessInfo。修复 #50183。修复 #50093。#52327(Amos Bird)。 - 当
ZooKeeperRetriesControl重新抛出错误时,与其查看ZooKeeperRetriesControl本身的堆栈跟踪,不如查看原始堆栈跟踪更有用。 #52347 (Vitaly Baranov). - 即使某些磁盘不支持零拷贝复制锁,也要等待该锁。 #52376 (Raúl Marín).
- 现在只有在所有表关闭之后才会关闭 interserver 端口。 #52498 (alesapin).
实验性功能
- 写入 Parquet 文件的速度提升了 10 倍,现在支持多线程,速度几乎与读取相同。 #49367 (Michael Kolupaev)。该行为由设置
output_format_parquet_use_custom_encoder控制,默认关闭,因为该功能还不够完善。 - 增加对将 PRQL 用作查询语言的支持。#50686 (János Benjamin Antal)。
- 允许为自定义磁盘添加磁盘名称。之前自定义磁盘会使用内部生成的磁盘名称。现在可以通过
disk = disk_<name>(...)(例如磁盘的名称将是name)来指定。 #51552 (Kseniia Sumarokova)。该语法在此版本中可能会发生变化。 - (实验性 MaterializedMySQL)修复了在
mysqlxx::Pool::Entry断开连接后仍被使用时导致的崩溃问题。 #52063 (Val Doroshchuk)。 - (实验性 MaterializedMySQL)现在在 MaterializedMySQL 中支持
CREATE TABLE ... AS SELECT。 #52067 (Val Doroshchuk)。 - (实验性 MaterializedMySQL)为 MaterializedMySQL 引入了将文本类型自动转换为 UTF-8 的功能。 #52084 (Val Doroshchuk)。
- (实验性 MaterializedMySQL)现在在 MaterializedMySQL 的 DDL 中支持未加引号的 UTF-8 字符串。 #52318 (Val Doroshchuk)。
- (实验性 MaterializedMySQL)现在在 MaterializedMySQL 中支持使用双引号的注释。 #52355 (Val Doroshchuk)。
- 将 Intel QPL 从 v1.1.0 升级到 v1.2.0,将 Intel accel-config 从 v3.5 升级到 v4.0,并修复了 IAA 加速器在出现 Device IOTLB miss 时会导致严重性能影响的问题。 #52180 (jasperzhu)。
- 将在 23.6 版本中新引入的
session_timezone设置降级为实验性。 #52445 (Alexey Milovidov)。 - 为 ClickHouse Keeper 增加对 ZooKeeper
reconfig命令的支持,使用可通过keeper_server.enable_reconfiguration设置启用的增量重配置方式。支持添加服务器、移除服务器以及修改服务器优先级。 #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)。
- 修复 projection 在启用 optimize_aggregators_of_group_by_keys 时的问题 #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 时的 Block 结构不匹配问题 #51492(Nikita Taranov)。
- 修复在所有分片权重均为零的集群上出现的 SIGSEGV(修复 INSERT INTO FUNCTION clusterAllReplicas())#51545(Azat Khuzhin)。
- 修复对冲请求的超时设置 #51582(Azat Khuzhin)。
- 修复在含有 NULL 的 ANTI JOIN 中的逻辑错误 #51601(vdimir)。
- 修复将 'IN' 条件下推到 PREWHERE 时的问题 #51610 (Alexander Gololobov).
- 不再对 ASOF/ANTI JOIN 应用 PredicateExpressionsOptimizer #51633 (vdimir)。
- 修复在 ReplicatedMergeTree 中使用合并算法时,带去重的异步插入出现的问题 #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)。 - 允许使用参数化 UDF #51964 (Alexey Milovidov).
- 对 toDateTime64() 在 2283-12-31 之后日期的处理进行了小幅修复 #52130(Andrey Zvonov)。
- 修复 WINDOW 函数中 ORDER BY 元组的问题 #52145 (Alexey Milovidov).
- 修复当聚合表达式包含单调函数时对 PROJECTION 的错误分析 #52151 (Amos Bird)。
- 修复
groupArrayMoving函数中的错误 #52161 (Alexey Milovidov). - 禁用范围字典的直接 JOIN #52187 (Duc Canh Le).
- 修复 sticky mutations 测试(以及一个极其罕见的竞态条件)#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).
- 修复可能出现的错误 "Cannot drain connections: cancel first" #52585(Kruglov Pavel)。
ClickHouse 23.6 版本,2023-06-29
向后不兼容的变更
- 删除 fs 缓存中的功能
do_not_evict_index_and_mark_files。该功能只会让情况变得更糟。#51253 (Kseniia Sumarokova)。 - 移除对实验性 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 OUTFILE子句新增对TRUNCATE修饰符的支持。建议在目标文件已存在时,对INTO OUTFILE使用APPEND或TRUNCATE。#50950(alekar)。 - 新增表引擎
Redis和表函数redis,用于查询外部 Redis 服务器。#50150(JackyWoo)。 - 允许通过
s3_skip_empty_files、hdfs_skip_empty_files、engine_file_skip_empty_files、engine_url_skip_empty_files这些设置,在 file/s3/url/hdfs 表函数中跳过空文件。#50364(Kruglov Pavel)。 - 新增名为
use_mysql_types_in_show_columns的设置,用于修改SHOW COLUMNSSQL 语句,使其在客户端通过 MySQL 兼容端口连接时显示 MySQL 等价类型。#49577(Thomas Panetti)。 - 现在可以通过连接字符串调用 clickhouse-client,而不是使用
--host、--port、--user等参数。#50689(Alexey Gerasimchuck)。 - 新增设置
session_timezone;当未显式指定时,它用作会话的默认时区。#44149(Andrey Zvonov)。 - 编解码器 DEFLATE_QPL 现在通过服务器设置
enable_deflate_qpl_codec(默认:false)进行控制,而不是通过allow_experimental_codecs设置。这标志着 DEFLATE_QPL 不再是实验特性。#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 输入/输出格式以提升性能。使列名与 CapnProto 字段之间的映射不区分大小写,并修复嵌套结构字段的读写。#49752(Kruglov Pavel)。
- 为并行线程场景优化 Parquet 写入性能。#50102(Hongbin Ma)。
- 对仅包含一个 block 的 MATERIALIZED VIEW 和存储禁用
parallelize_output_from_storages。#50214(Azat Khuzhin)。 - 合并 PR #46558。如果 block 已经排序,则在排序时避免对 block 进行重排。#50697(Alexey Milovidov,Maksim Kita)。
- 对 ZooKeeper 发起多个并行的 list 请求,以加快从 system.zookeeper 表读取数据的速度。#51042(Alexander Gololobov)。
- 加速时区相关 DateTime 查找表的初始化。这应当会减少 clickhouse-client 的启动和连接时间,特别是在调试构建版本中,因为该过程相对较重。#51347(Alexander Gololobov)。
- 修复由于同步 HEAD 请求导致的数据湖访问变慢问题(与大量文件场景下 Iceberg/Deltalake/Hudi 访问缓慢相关)。#50976(Kseniia Sumarokova)。
- 不再从右侧 GLOBAL JOIN 表中读取所有列。#50721(Nikolai Kochetov)。
实验功能
- 支持在 analyzer 中使用并行副本。#50441 (Raúl Marín).
- 在执行大型合并/变更前增加随机休眠时间,以便在零拷贝复制场景下更均匀地在副本之间分摊负载。#51282 (alesapin).
- 当
Replicated数据库只有一个分片且底层表为ReplicatedMergeTree时,不再通过该数据库复制ALTER PARTITION查询和变更操作。#51049 (Alexander Tokmakov).
改进
- 将 “too many parts” 的阈值放宽,使其更符合当前需求。恢复对长时间运行的插入查询的背压机制。 #50856 (Alexey Milovidov).
- 允许将 IPv6 地址在 CIDR ::ffff:0:0/96 范围内转换为 IPv4 地址(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)。 - 在模式推断时遵循
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 格式中跳过末尾的空行(默认禁用)。关闭 #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来校验分区片段的一致性。 #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 字段,以改进进度条显示。 #51158 (Kruglov Pavel).
- 在启用文件系统缓存的磁盘上,对数据分区片段进行更完善的检查。#51164 (Anton Popov).
- 修复文件系统缓存中
current_elements_num值有时不正确的问题。#51242 (Kseniia Sumarokova).
构建/测试/打包改进
- 为独立 keeper 可执行文件添加嵌入式 keeper-client。#50964 (pufit).
- 现在使用正确的 LZ4 版本。#50621 (Nikita Taranov).
- ClickHouse 服务器现在会在发生致命错误时打印已更改设置的列表。此更改关闭了 #51137。#51138 (Alexey Milovidov).
- 允许使用 clang-17 构建 ClickHouse。#51300 (Alexey Milovidov).
- SQLancer 检查现已被认为是稳定的,因为其触发的 bug 已经修复。现在,SQLancer 检查失败会被报告为检查失败状态。#51340 (Ilya Yatsishin).
- 将 Dockerfile 中体量很大的
RUN指令拆分为多个较小的条件块。在同一RUN层中按需安装必要工具,并在之后将其移除。仅在开始时执行一次操作系统升级。使用更现代的方式验证已签名的仓库。将基础镜像降级为 ubuntu:20.04,以解决旧版 docker 上的问题。升级 golang 版本以修复相关安全漏洞。#51504 (Mikhail f. Shiryaev).
Bug 修复(官方稳定版中用户可见的异常行为)
- 正确地报告可执行字典的加载状态 #48775 (Anton Kozlov).
- 正确处理针对 skip 索引和投影的 mutation #50104 (Amos Bird)。
- 清理分区片段移动相关逻辑 #50489 (vdimir).
- 修复聚合函数中 IP 类型哈希的向后兼容性问题 #50551 (Yakov Olkhovskiy)。
- 修复在执行 TRUNCATE 后,Log 系列表返回的行数不正确的问题 #50585(flynn)。
- 修复
uniqExact在并行合并时的问题 #50590(Nikita Taranov)。 - 回滚最近对 Grace 哈希连接的更改 #50699 (vdimir)。
- Query Cache:修复将
ColumnConst错误转换为ColumnVector<char8_t>的问题 #50704 (Robert Schulze). - 避免在 Keeper 中存储带有未知操作的日志 #50751 (Antonio Andelic)。
- 为 DateTime64 提供 SummingMergeTree 支持 #50797 (Jordi Villar)。
- 为非 const 时区添加兼容性设置 #50834 (Robert Schulze).
- 修复缓存条目中 LDAP 参数的哈希计算问题 #50865(Julian Maicher)。
- 在 Parquet 格式中,改为从 String 解析大整数,而不是直接抛出异常 #50873 (Kruglov Pavel).
- 修复写入备份时对锁文件检查过于频繁的问题 #50889 (Vitaly Baranov).
- 如果启用了 read-in-order,则不要应用投影。 #50923 (Nikolai Kochetov).
- 修复 Azure Blob 存储迭代器中的竞态条件 #50936 (SmitaRKulkarni)。
- 修复
CreatingSets中错误传播的sort_description#50955(Nikita Taranov)。 - 修复 Iceberg v2 可选元数据的解析 #50974(Kseniia Sumarokova)。
- MaterializedMySQL:为空表 override 保留括号 #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)。
- 修复在切换 URL 时
StorageURL中的 use-after-free 错误 #51260(Michael Kolupaev)。 - 更新了对参数化 VIEW 的检查 #51272 (SmitaRKulkarni).
- 修复同一文件在备份中被多次写入的问题 #51299 (Vitaly Baranov).
- 修复 ActionsDAG 中的模糊测试失败 #51301(Alexey Milovidov)。
- 从函数
transform中移除错误数据 #51350 (Alexey Milovidov).
ClickHouse 23.5 版本发布,2023-06-08
升级说明
- 默认压缩 marks 和主键。这可以显著减少冷查询时间。升级说明:对压缩 marks 和主键的支持是在 22.9 版本中添加的。如果你已经开启了压缩 marks 或主键,或者安装了 23.5 或更新版本(这些版本默认开启压缩 marks 或主键),则将无法降级到 22.8 或更早的版本。你也可以在服务器配置文件的
<merge_tree>部分通过指定compress_marks和compress_primary_key设置,显式禁用压缩 marks 或主键。**升级说明:**如果你从 22.9 之前的版本升级,应当要么一次性升级所有副本,要么在升级前禁用压缩,或者通过一个中间版本进行升级(该版本支持压缩 marks,但默认未启用),例如 23.3。#42587(Alexey Milovidov)。 - 使本地对象存储与 S3 对象存储行为一致,修复追加写入的问题(关闭 #48465),并使其可配置为独立存储。该变更不向后兼容,因为本地对象存储之上的缓存与之前版本不兼容。#48791(Kseniia Sumarokova)。
- 移除实验特性 “in-memory data parts”。数据格式仍然受支持,但相关设置不再生效,将改为使用 compact 或 wide 分区片段。这解决了 #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)。 - 使 PROJECTION 达到生产可用。新增
optimize_use_projections设置,用于控制是否在 SELECT 查询中选择 PROJECTION。设置allow_experimental_projection_optimization已过时且不再起作用。#49719(Alexey Milovidov)。 - 将
joinGet标记为非确定性函数(dictGet也是如此)。这允许在 mutation 中使用它们而无需额外的设置。#49843(Azat Khuzhin)。 - 回滚 “
groupArray返回值不能为 Nullable” 的变更(因为这会导致对Nullable类型的groupArray/groupArrayLast/groupArraySample的二进制兼容性破坏,很可能会导致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 表函数以减少代码重复。使模式推断适用于所有可能的 *Cluster 函数签名以及命名集合。关闭了 #38499。#45427 (attack204), Pavel Kruglov。 - 查询缓存现在可以用于生产环境中的工作负载。#47977(Robert Schulze)。查询缓存现在支持带有 totals 和 extremes 修饰符的查询。#48853(Robert Schulze)。将
allow_experimental_query_cache设置标记为已废弃以保持向后兼容性。它已在 https://github.com/ClickHouse/ClickHouse/pull/47977 中移除。#49934(Timur Solodovnikov)。 - 地理数据类型(
Point、Ring、Polygon和MultiPolygon)已可用于生产环境。 #50022 (Alexey Milovidov). - 为 PostgreSQL、MySQL、MeiliSearch 和 SQLite 表引擎添加模式推断支持。解决了 #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以支持更多类型。同时修复了一些问题,这些问题在小数类型与其他数值类型混用时会导致 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函数能够以数组形式返回来自多个匹配的值。关闭 #50254。#50255(Johann Gan)。 - 新增
toLastDayOfWeek函数,用于将日期或带时间的日期向上取整到下一个星期六或星期日。#50315 (Victor Krasnov)。 - 通过指定
ignore_data_skipping_indices可以忽略 skip index。#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). - 允许为某个 DATABASE 下的所有表设置 ROW POLICY。 #47640 (Ilya Golshtein).
性能优化
- 默认对 marks 和主键进行压缩。这可以显著减少冷查询时间。升级说明:对压缩 marks 和主键的支持是在 22.9 版本中添加的。如果你开启了压缩 marks 或主键,或者安装了 23.5 或更新版本(这些版本默认开启压缩 marks 和主键),将无法降级到 22.8 或更早的版本。你也可以在服务器配置文件的
<merge_tree>部分通过设置compress_marks和compress_primary_key,显式禁用 marks 或主键压缩。 #42587 (Alexey Milovidov). - 新增
s3_max_inflight_parts_for_one_fileSETTING,用于限制在单个文件内,通过 multipart 上传请求并发加载的分区片段数量上限。#49961 (Sema Checherinda)。 - 从多个文件读取时,降低每个文件的并行解析线程数。修复了 #42192。#46661(SmitaRKulkarni)。
- 仅当通过聚合 projection 读取的 granule 数量少于常规读取时,才使用聚合 projection。这在查询命中表的主键但未命中 projection 时应有所帮助。修复了 #49150。#49417(Nikolai Kochetov)。
- 在未插入任何数据时,不再在
ANY哈希连接中存储数据块。 #48633 (vdimir). - 修复了在使用 JIT 编译时聚合组合器
-If的问题,并为聚合函数启用 JIT 编译。关闭了 #48120。#49083(Igor Nikonov)。 - 在从远程表读取数据时,我们使用更小的任务(而不是读取整个 part),以便任务窃取机制能够发挥作用:* 任务大小由要读取的列的数据量决定 * 从 S3 读取时始终使用 1MB 缓冲区 * 缓存段的边界按 1MB 对齐,这样即使在小任务下它们的大小也足够合理,同时还能避免碎片化。#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). - 通过在适当的地方应用
LowCardinality来优化system.query_log和system.query_thread_log表。对这些表的查询速度将会更快。#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请求,以提升 Replicated 表的性能。#48897(Antonio Andelic)。 - Keeper 性能优化:在处理过程中避免对同一请求进行两次序列化,并对大型请求的反序列化结果进行缓存。通过新的协调设置
min_request_size_for_cache进行控制。#49004 (Antonio Andelic). - 在选择要合并的分区片段且许多分区没有任何可合并内容时,减少了对 ZooKeeper 发起的
List请求次数。 #49637 (Alexander Tokmakov). - 重构文件系统缓存中的锁实现 #44985 (Kseniia Sumarokova).
- 如果可以应用简单的 COUNT 优化,则禁用纯并行副本。#50594 (Raúl Marín).
- 在 Iceberg 模式推断中,不要对所有键发送 HEAD 请求,仅对用于读取数据的键发送。 #50203 (Kruglov Pavel).
- 设置
enable_memory_bound_merging_of_aggregation_results现在默认启用。 #50319 (Nikita Taranov).
实验性功能
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)。
- 在启用“零拷贝复制”时删除
Outdated分区片段的操作中提供了更高的并行度。#49630(Alexander Tokmakov)。 - 并行副本:1)修复了在对非复制存储且禁用了 SETTING
parallel_replicas_for_non_replicated_merge_tree的情况下使用并行副本时出现的错误NOT_FOUND_COLUMN_IN_BLOCK。2)现在allow_experimental_parallel_reading_from_replicas有 3 个可能的值——0、1 和 2。0:禁用;1:启用,在失败时静默禁用并行副本(在使用 FINAL 或 JOIN 的情况下);2:启用,在失败时抛出异常。3)如果在 SELECT 查询中使用了 FINAL 修饰符并启用了并行副本,当allow_experimental_parallel_reading_from_replicas设置为 1 时,ClickHouse 将尝试禁用并行副本,否则抛出异常。#50195(Nikita Mikhaylov)。 - 当启用并行副本时,它们将始终跳过不可用的服务器(该行为由 SETTING
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的 insert 查询不会生效,此时请使用查询级设置。#49122 (Anton Popov). - 为 QUOTA 创建语句的参数增加对大小后缀的支持。 #49087 (Eridanus).
- 扩展
first_value和last_value,使其接受 NULL 值。#46467 (lgbo)。 - 为
extractKeyValuePairs添加别名str_to_map和mapFromString,修复了 https://github.com/clickhouse/clickhouse/issues/47185 中的问题。 #49466 (flynn). - 添加对 CGroup v2 的支持,用于采集内存使用和可用性的异步指标。关闭了 #37983。#45999(sichenzhao)。
- 集群表函数现在会始终跳过不可用的分片。修复了 #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),用于在表已存在大量未完成 mutation 时,延迟或抛出创建 mutation 的ALTER查询(ALTER UPDATE、ALTER DELETE、ALTER MODIFY COLUMN等)。#49117(Anton Popov)。 - 在 filesystem 缓存中捕获
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_sizeSETTING 控制。 #49317 (Nikita Mikhaylov). - 当
LowCardinality列在数据块之间共享字典时,不要将已处理数据的大小估算得过大。此更改修复了 #49322。另见 #48745。#49323(Alexey Milovidov)。 - Parquet 写入器现在在通过
OUTFILE调用时,会使用合理的行组(row group)大小。#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). - 允许从远程文件系统读取大小为零的对象。(由于空文件不会被备份,因此元数据文件中可能会出现大小为零的 blob)。修复 #49480。#49519(Kseniia Sumarokova)。
- 在
ThreadGroup分离后,将线程的 MemoryTracker 附加到total_memory_tracker。#49527 (Dmitry Novik)。 - 修复当在查询中多次使用同一查询参数时参数化视图的行为问题。 #49556 (Azat Khuzhin).
- 在查询上下文中释放为最后一次发送的 ProfileEvents 快照分配的内存。跟进 #47564。#49561(Dmitry Novik)。
- 函数 "makeDate" 现在提供了一个与 MySQL 兼容的重载版本(接受年份和一年中的第几天作为参数)。#49603 (Robert Schulze)。
- 为
RegExpTreeDictionary添加对dictionary表函数的支持。 #49666 (Han Fei). - 添加了加权公平 IO 调度策略。添加了动态资源管理器,支持在运行时更新 IO 调度层次结构,而无需重启服务器。 #49671 (Sergei Trifonov).
- 在向 GCS 进行分片上传后添加 compose 请求。这使得可以对通过分片上传的对象使用 copy 操作。建议将
s3_strict_upload_part_size设置为一个具体值,因为对于由不同大小的分片创建的对象,compose 请求可能会失败。#49693 (Antonio Andelic). - 对于
extractKeyValuePairs函数:改进“best-effort”解析逻辑,使其接受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 加载字典和函数。在此前的版本中,需要在配置文件中修改
dictionaries_config或user_defined_executable_functions_config,因为它们期望的是*.xml文件。#49812(Alexey Milovidov)。 - Kafka 表引擎现在支持使用别名列。#49824 (Aleksandr Musorin).
- 新增一个 setting,用于限制
extractKeyValuePairs可生成的键值对数量上限,作为防止占用过多内存的保护措施。 #49836 (Arthur Passos)。 - 为
IN运算符添加对参数为单元素元组(这一情况较为少见)时的支持。#49844 (MikhailBurdukov)。 bitHammingDistance函数现已支持String和FixedString数据类型。修复 #48827。#49858(flynn)。- 修复 OS X 上客户端超时时间重置时出现的错误。 #49863 (alekar).
- 为函数
bitCount添加对大整数的支持,例如 UInt128、Int128、UInt256 和 Int256。这样可以在大规模位掩码上计算汉明距离,用于 AI 应用。#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 设置以支持多个 compute group。作为一个集群的 compute group 对其他 compute group 是不可见的。#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,并在服务器启动时遵守 cgroup v2 内存限制。#50379 (alekar). - 为 SIGQUIT 添加信号处理程序,使其行为与 SIGINT 相同。关闭了 #50298。#50435(Nikolay Degterinsky)。
- 如果由于对象过大导致 JSON 解析失败,则输出最后处理到的位置以便调试。 #50474 (Valentin Alexeev).
- 支持非固定精度的小数。关闭 #49130。#50586(Kruglov Pavel)。
构建 / 测试 / 打包方面的改进
- 全新改进的
keeper-bench。所有内容都可以通过 YAML/XML 文件进行自定义:请求生成器,每种类型的请求生成器都可以拥有一组特定字段,多个请求只需在multi键下进行相同配置即可,为multi中的每个请求或子请求定义weight字段以控制分布,定义在一次测试运行中需要预先设置的树结构,定义主机并自定义所有超时时间,同时可以控制为每个主机生成多少会话,使用min_value和max_value字段定义的整数为随机数生成器。#48547 (Antonio Andelic). - Io_uring 在 macOS 上不受支持,本地运行测试时不要启用它,以避免偶发性失败。 #49250 (Frank Chen)。
- 支持具名故障注入以便测试。 #49361 (Han Fei).
- 允许在不支持
prctl(进程控制)系统调用的操作系统上运行 ClickHouse,例如 AWS Lambda。#49538(Alexey Milovidov)。 - 修复了 qpl 中
contrib/isa-l与isa-l之间的构建冲突问题(49296)。 #49584 (jasperzhu)。 - 现在仅在通过设置 "-DENABLE_UTILS=1" 显式请求时才会构建这些工具程序(utilities),而不再默认构建,从而缩短了典型开发构建的链接时间。 #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(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)。
- 在 Backup/Restore 先前失败的情况下添加并发检查 #48726 (SmitaRKulkarni)。
- 修复在附加具有不存在 ZK 路径的表时不会增加 ReadonlyReplica 指标的问题 #48954(wangxiaobo)。
- 修复在某些情况下可能因未捕获异常而调用
terminate的问题 #49112 (Kruglov Pavel). - 修复在包含多个 StorageJoin 的查询中出现的 “key not found” 错误 #49137 (vdimir)。
- 修复在使用 Nullable 主键时查询结果错误的问题 #49172 (Duc Canh Le)。
- 修复在大端序机器上 reinterpretAs*() 的问题 #49198 (Suzy Wang)。
- (实验性零拷贝复制)以更强的原子性锁定零拷贝分区片段 #49211 (alesapin)。
- 修复过期分区片段加载中的竞争问题 #49223 (Alexander Tokmakov).
- 修复在所有键的值均为 NULL 且分组使用 ROLLUP 时会返回错误结果的问题 #49282 (Shuai li).
- 修复在带有 SHARDS 的 HASHED 字典中计算 load_factor 的问题 #49319 (Azat Khuzhin)。
- 不允许为别名列配置压缩 CODEC #49363 (Timur Solodovnikov).
- 修复删除已存在的 part 目录时的错误 #49365 (alesapin)。
- 正确修复在使用 HMAC 时的 GCS 问题 #49390 (Antonio Andelic).
- 修复在通过 remote() 读取时未构建子查询 Set 的 fuzz 测试缺陷 #49425(Alexander Gololobov)。
- 反转
shutdown_wait_unfinished_queries设置的语义 #49427 (Konstantin Bogdanov). - (实验性的零拷贝复制)修复另一个零拷贝相关的 bug #49473 (alesapin)。
- 修复 Postgres 数据库配置 #49481(Mal Curtis)。
- 正确处理
s3Cluster参数 #49490(Antonio Andelic)。 - 修复
TraceCollector析构函数中的 bug。 #49508 (Yakov Olkhovskiy)。 - 修复 AsynchronousReadIndirectBufferFromRemoteFS 在短距离定位(seek)时出错的问题 #49525 (Michael Kolupaev).
- 修复字典的加载顺序 #49560(Alexander Tokmakov)。
- 禁止修改 Object('json') 列的数据类型 #49563 (Nikolay Degterinsky)。
- 修复压力测试(逻辑错误:期望 7134 >= 11030)#49623(Kseniia Sumarokova)。
- 修复
DISTINCT的一个缺陷 #49628(Alexey Milovidov)。 - 修复:在 ORDER BY 中,当未排序列包含零值时使用 DISTINCT 的问题 #49636 (Igor Nikonov).
- 修复在启用模糊测试的 UBSan 中发现的大整数一位偏差错误(off-by-one error)#49645(Alexey Milovidov)。
- 修复重启后从稀疏列读取数据时的问题 #49660 (Anton Popov)。
- 在使用 fibers 时,修复
SpanHolder::finish()中的断言问题 #49673 (Kruglov Pavel). - 修复带有稀疏参数的短路函数和 Mutation 的问题 #49716 (Anton Popov).
- 修复将追加的文件写入到增量备份中的问题 #49725 (Vitaly Baranov)。
- 修复在对包含 Object 类型列的表执行轻量级删除变更时出现“There is no physical column _row_exists in table”错误的问题。#49737(Alexander Gololobov)。
- 修复
randomStringUTF8(参数为奇数时)中的 msan 问题 #49750(Robert Schulze)。 - 修复聚合函数 kolmogorovSmirnovTest #49768 (FFFFFFFHHHHHHH)。
- 修复原生协议中的设置别名问题 #49776 (Azat Khuzhin)。
- 修复
arrayMap在处理包含单个元素的元组数组时的问题 #49789(Anton Popov)。 - 修复按查询级别的 IO/备份限速设置 #49797 (Azat Khuzhin).
- 修复在 profile 定义中将值设置为 NULL 时的问题 #49831 (Vitaly Baranov)。
- 修复与投影以及 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 相关的断言问题(第二次尝试) #50034 (Kruglov Pavel)。 - 为 DDL 中的 OpenTelemetry 上下文序列化添加正确的转义 #50045 (Azat Khuzhin)。
- 修复损坏的 PROJECTION 分区片段的上报问题 #50052 (Amos Bird).
- 修复 JIT 编译中与 NaN 不等比较的问题 #50056(Maksim Kita)。
- 修复在未指定参数的 Replicated 数据库情况下发生崩溃的问题 #50058 (Azat Khuzhin)。
- 修复在使用
multiIf时,由常量条件和 Nullable 参数组合导致的崩溃 #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格式中在行尾跳过空格的问题 #50224(Kruglov Pavel)。 - 修复 Iceberg 元数据的解析 #50232 (Kseniia Sumarokova).
- 修复
WITH子句中嵌套的分布式SELECT查询 #50234(Azat Khuzhin)。 - 修复 keyed SipHash 中的 MSan 问题 #50245(Robert Schulze)。
- 修复 Poco 套接字在非阻塞模式下的 bug,改为使用真正的非阻塞套接字 #50252 (Kruglov Pavel)。
- 修复备份项的校验和计算 #50264 (Vitaly Baranov)。
- 修复比较函数中 NaN 的问题 #50287(Maksim Kita)。
- 修复 JIT 聚合中 Nullable 键的问题 #50291 (Maksim Kita).
- 修复在写入空的 Arrow 或 Parquet 输出时导致 clickhouse-local 崩溃的问题 #50328 (Michael Kolupaev)。
- 修复在调用 Pool::Entry::disconnect() 时发生的崩溃 #50334 (Val Doroshchuk)。
- 通过延长目录锁的持有时间改进了 fetch part 逻辑 #50339 (SmitaRKulkarni)。
- 修复当两个参数都是常量时的 bitShift* 函数问题 #50343(Kruglov Pavel)。
- 修复在预处理请求时因异常导致 Keeper 死锁的问题。 #50387 (frinkr).
- 修复对常量整数值的哈希计算 #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)。
- 修复压力测试中的逻辑错误(Not enough space to add ...)#50583(Kseniia Sumarokova)。
- 修复在 values 表函数中将 Null 转换为 LowCardinality(Nullable) 时的问题 #50637 (Kruglov Pavel)。
- 回滚无效的 RegExpTreeDictionary 优化 #50642 (Johann Gan)。
ClickHouse 23.4 发布,2023-04-26
不兼容变更
- 函数
formatDateTime()中的格式化符号%M现在会输出月份名称,而不是分钟,从而使其行为与 MySQL 保持一致。可以通过设置formatdatetime_parsedatetime_m_is_month_name = 0恢复之前的行为。 #47246 (Robert Schulze) - 仅当使用虚拟文件系统缓存时,此变更才有效。如果虚拟文件系统缓存配置中的
path非空且不是绝对路径,则会被解析为<clickhouse server data directory>/caches/<path_from_cache_config>下的路径。 #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 (李扬)。 - 新增语句
SHOW COLUMNS,用于展示来自 system.columns 的提炼信息。#48017(Robert Schulze)。 - 为
SYSTEM SYNC REPLICA查询新增了LIGHTWEIGHT和PULL修饰符。LIGHTWEIGHT版本仅等待 fetch 和 drop-range 操作(忽略 merge 和 mutation)。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列。该列的值显示相应表中丢失分区片段的总数。该值存储在 ZooKeeper 中,并可用于替代非持久化的ReplicatedDataLossprofile 事件来进行监控。 #48526 (Sergei Trifonov). - 添加
soundex函数以提高兼容性。关闭 #39880。#48567(FriendLey)。 - 使 JSONExtract 支持
Map类型。#48629 (李扬)。 - 添加
PrettyJSONEachRow格式,以输出带有换行分隔符和 4 个空格缩进的格式化 JSON。#48898 (Kruglov Pavel)。 - 新增
ParquetMetadata输入格式,用于读取 Parquet 文件元数据。 #48911 (Kruglov Pavel). - 添加
extractKeyValuePairs函数,用于从字符串中提取键值对。输入字符串可能包含噪声(例如日志文件 / 不必完全采用键值对格式),算法会根据传入函数的参数查找匹配的键值对。目前,该函数接受以下参数:data_column(必需)、key_value_pair_delimiter(默认为:)、pair_delimiters(默认为\space \, \;)以及quoting_character(默认为双引号)。#43606(Arthur Passos)。 - 现在,函数 replaceOne()、replaceAll()、replaceRegexpOne() 和 replaceRegexpAll() 现在可以使用非 const 的模式和替换参数进行调用。#46589 (Robert Schulze)。
- 新增用于处理
Map类型列的函数:mapConcat、mapSort、mapExists。#48071(Anton Popov)。
性能改进
- 现在读取
Parquet格式的文件速度更快。I/O 和解码已实现并行化(由max_threads设置控制),并且只读取所需的数据范围。#47964 (Michael Kolupaev). - 如果我们运行一个带有 IN(子查询)的变更(mutation)操作,如:
ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table),并且表t有多个分区片段,那么对于每个分区片段都会在内存中构建一次子查询SELECT id FROM huge_table的 set。如果分区片段很多,则可能会消耗大量内存(并导致 OOM)和 CPU。解决方案是为当前由 mutation 任务构建的 set 引入一个短生命周期的缓存。如果同一 mutation 的另一个任务并发执行,它可以在缓存中查找该 set,等待其构建完成并复用。#46835 (Alexander Gololobov). - 仅在必要时才在执行
ALTER TABLE查询时检查依赖关系。#48062 (Raúl Marín). - 优化函数
mapUpdate。#48118 (Anton Popov). - 现在发往本地副本的内部查询会被显式发送,并通过回环接口接收数据。对于并行副本,不再遵循
prefer_localhost_replica设置。这对于实现更好的调度是必要的,并且使代码更简洁:发起方只负责协调读取过程和合并结果,持续响应请求,而所有次级查询负责读取数据。注意:使用回环接口本身性能并不是最优的,否则某些副本可能会因任务饥饿而导致查询执行更慢,且无法利用所有可用资源。协调器的初始化现在更加惰性化。所有传入请求都包含关于读取算法的信息,我们在第一个请求到来时使用该信息初始化协调器。如果任何副本决定使用不同的算法读取,将抛出异常并终止查询。#48246 (Nikita Mikhaylov). - 当
IN子句右侧的子查询仅用于分析跳过索引,并且通过设置(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 互斥锁的竞争(在大量小任务场景下可能提升性能)。#48750 (Sergei Trifonov).
- 降低了多个
ALTER DELETEmutation 的内存使用。#48522 (Nikolai Kochetov). - 当启用
skip_unavailable_shards设置时,移除多余的连接尝试。#48771 (Azat Khuzhin).
实验特性
- 查询缓存中的条目现在会被压缩到不超过
max_block_size的块大小,然后进行压缩。#45912 (Robert Schulze)。 - 现在可以在查询缓存中为每个用户定义 QUOTA。#48284 (Robert Schulze)。
- 对并行副本进行了一些修复。#48433 (Nikita Mikhaylov)。
- 在加密磁盘上实现 zero-copy-replication(实验性功能)。#48741 (Vitaly Baranov)。
改进
- 将
connect_timeout_with_failover_ms的默认值提高到 1000 ms(因为在 https://github.com/ClickHouse/ClickHouse/pull/47229 中引入了异步连接)。修复并关闭 #5188。#49009(Kruglov Pavel)。 - 围绕数据湖进行了多项改进:- 使
Iceberg能够处理非分区数据。- 支持Iceberg格式版本 v2(此前仅支持 v1)。- 支持为DeltaLake/Hudi读取分区数据。- 通过使用 Delta 的 checkpoint 文件加快DeltaLake元数据读取速度。- 修复Hudi读取不正确的问题:此前会错误选择要读取的数据,因此只能正确读取小表。- 使这些引擎能够感知并应用已变更数据的更新(此前状态仅在创建表时确定)。- 使用 Spark 为Iceberg/DeltaLake/Hudi进行完善的测试。#47307 (Kseniia Sumarokova)。 - 为 socket 添加异步连接和异步写入能力。将跨分片的连接创建以及查询/外部表的发送改为异步。使用 fibers 重构代码。修复 #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,以便默认构建完整的凭证 provider 链。#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 对象/数组)时会返回该复杂类型的值,而在JSON_VALUE中会返回空字符串。 #47494 (KevinyhZou). - 对于
use_structure_from_insertion_table_in_table_functions,实现了更灵活的将插入表结构传播到 table function 的方式。修复了名称映射和使用虚拟列时的问题。不再需要使用auto设置。#47962(Yakov Olkhovskiy)。 - 如果查询被终止或超出限制,则停止重试连接 Keeper。#47985 (Raúl Marín).
- 在
BSONEachRow中支持 Enum 的输入/输出,允许使用所有 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/BACKUP 的按查询/按服务器级别限流(服务器级别设置:
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)。 - 检查 simple dictionary 的主键类型是否为原生无符号整数类型。新增设置项
check_dictionary_primary_key以保持兼容性(将check_dictionary_primary_key = false以禁用检查)。 #48335 (lizhuoyu5). - 不要为
KeeperMap复制变更操作,因为没有必要。#48354 (Antonio Andelic)。 - 允许在 Protobuf 格式中将未命名 tuple 读写为嵌套 Message。Tuple 元素与 Message 字段按位置匹配。#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}宏的支持。在自动伸缩集群中,它对于标识副本非常有用,因为在运行时不断有新的副本被添加和移除。关闭了 #48554。#48563(Alexey Milovidov)。 - 在可能的情况下,安装脚本将创建硬链接,而不是复制文件。#48578(Alexey Milovidov)。
- 支持
SHOW TABLE语法,其语义与SHOW CREATE TABLE相同。修复 #48580。#48591(flynn)。 - HTTP 临时缓冲区现在支持通过从虚拟文件系统缓存中淘汰数据来进行处理。 #48664 (Vladimir C).
- 使 Schema 推断适用于
CREATE AS SELECT。关闭 #47599。#48679(flynn)。 - 为
ReplicatedMergeTree新增了replicated_max_mutations_in_one_entry设置项,用于限制单个MUTATE_PART条目中包含的 mutation 命令数量(默认值为 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 中的一个 bug 而导致崩溃。此变更修复了 #47679。#48816(Alexey Milovidov)。 - 修复
RabbitMQ中的数据竞争(报告),并重构代码。#48845(Kseniia Sumarokova)。 - 为
system.parts和system.part_log添加别名name和part_name。关闭 issue #48718。#48850 (sichenzhao)。 - 函数 "arrayDifferenceSupport()"、"arrayCumSum()" 和 "arrayCumSumNonNegative()" 现在支持宽整数类型 (U)Int128/256 的输入数组。 #48866 (cluster)。
- clickhouse-client 中的多行历史记录现在不再填充空格,这使粘贴操作更加自然。#48870 (Joanna Hulboj)。
- 在极少数情况下,当在 LXC 中运行 ClickHouse 且使用 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).
- 在测试中随机化 marks 和 indices 的压缩方式。 #48286 (Alexey Milovidov).
- 将内部 ZSTD 从 1.5.4 升级到 1.5.5。 #46797 (Robert Schulze).
- 在测试中随机化从紧凑分区片段到宽分区片段的垂直合并。 #48287 (Raúl Marín).
- 在 HDFS 中支持 CRC32 校验和,并修复性能问题。 #48614 (Alexey Milovidov).
- 移除残留的 GCC 支持代码。 #48671 (Robert Schulze).
- 新增启用新 analyzer 基础设施的 CI 任务。 #48719 (Dmitry Novik).
Bug 修复(官方稳定版中用户可见的异常行为)
- 修复在由后台线程推送物化视图时
system.query_views_log的记录问题 #46668 (Azat Khuzhin)。 - 修复了多个与
RENAME COLUMN相关的问题 #46946(alesapin)。 - 修复 clickhouse-format 中一些轻微的高亮显示问题 #47610 (Natasha Murashkina)。
- 修复 LLVM 的 libc++ 中的一个错误,该错误会在将大小超过 INT_MAX 的分区片段上传到 S3 时导致崩溃 #47693 (Azat Khuzhin)。
- 修复
sparkbar函数中的溢出问题 #48121(Vladimir C)。 - 修复 S3 中的竞争条件 #48190 (Anton Popov)。
- 由于行为不一致,禁用聚合函数的 JIT 功能 #48195(Alexey Milovidov)。
- 修复
ALTER语句格式(小问题)#48289(Natasha Murashkina)。 - 修复 RabbitMQ 中的 CPU 使用问题(在 23.2 版本中因 #44404 而加剧)#48311(Kseniia Sumarokova)。
- 修复在对基于 Distributed 的 Merge 查询执行 EXPLAIN PIPELINE 时发生的崩溃 #48320 (Azat Khuzhin)。
- 修复将 LowCardinality 序列化为 Arrow 字典时的问题 #48361 (Kruglov Pavel).
- 重置 TemporaryFileStream 中缓存文件片段的下载器 #48386 (Vladimir C)。
- 修复在执行 DROP/REPLACE PARTITION 时可能出现的 SYSTEM SYNC REPLICA 卡住问题 #48391 (Azat Khuzhin)。
- 修复在加载依赖于字典的分布式表时出现的启动错误 #48419 (MikhailBurdukov)。
- 在自动重命名 system 表时不再检查依赖关系 #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)。 - 修复在客户端重新连接时,Bracketed Paste 模式导致密码输入异常的问题 #48528(Michael Kolupaev)。
- 修复键类型为 IP 和 UUID 的嵌套 map 问题 #48556 (Yakov Olkhovskiy).
- 修复哈希字典并行加载器中的未捕获异常问题 #48571 (Azat Khuzhin).
groupArray聚合函数在 Nullable 类型上处理空结果时能够正确工作 #48593 (lgbo)。- 修复 Keeper 中的一个 bug:在 ACL 中使用
authscheme 创建节点时,节点有时不会被创建。 #48595 (Aleksei Filatov). - 允许在 IPv4 与 UInt 之间使用比较运算符 #48611(Yakov Olkhovskiy)。
- 修复缓存中可能出现的错误 #48636(Kseniia Sumarokova)。
- 异步插入空数据时将不再抛出异常。 #48663 (Anton Popov).
- 在
RENAME TABLE操作失败时修复表的依赖关系 #48683(Azat Khuzhin)。 - 如果主键中包含重复的列(这种情况只会在使用 PROJECTION 时出现),在之前的版本中可能会触发一个 bug #48838(Amos Bird)。
- 修复 ZooKeeper 在 join send_thread/receive_thread 时的竞态条件 #48849(Alexander Gololobov)。
- 修复在尝试删除被忽略的、使用零拷贝复制的已分离 part 时出现的意外 part 名称错误 #48862 (Michael Lex)。
- 修复从 Parquet/Arrow 读取
Date32列时未被解析为Date32列的问题 #48864 (Kruglov Pavel). - 修复在对带有 ROW POLICY 且包含点号的列的表执行 SELECT 查询时出现的
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).
- 移除了“异步连接排空(asynchronous connection drain)”特性。相关设置和指标也一并删除。这是一个内部特性,因此对于从未听说过该特性的用户来说,其移除不应产生影响。#47486 (Alexander Tokmakov).
- 在
arraySum/Min/Max/Avg/Product、arrayCumSum/CumSumNonNegative、arrayDifference、数组构造、IN 运算符、查询参数、groupArrayMovingSum、统计函数、min/max/any/argMin/argMax、PostgreSQL wire 协议、MySQL 表引擎和函数、sumMap、mapAdd、mapSubtract、arrayIntersect中支持 256 位 Decimal 数据类型(超过 38 位数字)。在arrayIntersect中增加对大整数的支持。涉及矩(moment)的统计聚合函数(例如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在副本之间拆分工作的新模式。若集群由单个分片(shard)和多个副本组成,则会随机选择最多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)。 - 允许为命名集合单独授予权限(例如,仅对某些集合授予
SHOW/CREATE/ALTER/DROP 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 语法将字符串解析为 DateTime,parseDateTimeInJodaSyntax按 Joda 语法进行解析。#46815 (李扬). - 将
dummy UInt8用作表函数null的默认结构。修复了 #46930。#47006(flynn)。 parseDateTimeBestEffortFUNCTION 现在支持带逗号的日期格式,例如Dec 15, 2021。解决了 #46816。#47071(chen)。- 为 HTTP 接口添加
http_wait_end_of_query和http_response_buffer_size两个设置项,对应 URL 参数wait_end_of_query和buffer_size。这样就可以在配置 profile 中修改这些设置项。#47108 (Vladimir C)。 - 新增
system.dropped_tables表,用于显示已在Atomic数据库中执行 DROP 但尚未彻底移除的表。#47364 (chen). - 添加
INSTR作为positionCaseInsensitive的别名,以兼容 MySQL。关闭了 #47529。#47535(flynn)。 - 新增
toDecimalString函数,用于将数字转换为固定精度的字符串。 #47838 (Andrey Zvonov). - 添加 MergeTree 设置项
max_number_of_mutations_for_replica。它将每个副本的 part 变更数量限制为指定值。0 表示对每个副本的 mutation 数量不设限制(执行仍可能受其他设置约束)。 #48047 (Vladimir C)。 - 新增 Map 相关函数
mapFromArrays,用于从一对数组构造一个 Map。 #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)。
性能改进
- 内存中的标记现已压缩处理,内存占用减少 3–6 倍。#47290 (Michael Kolupaev)。
- 在之前的版本中,大量文件的备份速度慢得难以置信。现在不再如此——现在快得难以置信。#47251(Alexey Milovidov)。为备份的 I/O 操作引入了单独的线程池。这样可以让其独立于其他线程池进行扩展,从而提升性能。#47174(Nikita Mikhaylov)。在备份处理的最终阶段,使用 MultiRead 请求和重试机制来收集元数据。#47243(Nikita Mikhaylov)。如果备份和要恢复的数据都在 S3 中,那么从现在开始将使用服务端复制。#47546(Vitaly Baranov)。
- 修复了在使用
FINAL的查询中出现的过多读取。 #47801 (Nikita Taranov). - 在服务器启动时,
max_final_threads的 SETTING 将按照与max_threads相同的算法被设置为 CPU 核心数。这提升了在拥有大量 CPU 的服务器上执行final的并发性能。#47915(Nikita Taranov)。 - 允许为以 CLICKHOUSE 作为源的 DIRECT 字典在多线程中执行读取 pipeline。要启用此功能,请在
CREATE DICTIONARY语句中,为该源的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 线程池来计算分区片段大小,即并行执行系统调用。 #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)。
- 在 Merge 引擎中,即使各列具有不同的 DEFAULT 表达式,也允许使用 PREWHERE。 #46831 (Azat Khuzhin).
实验性特性
- 并行副本:通过更好地利用本地副本提升整体性能,并且默认禁止对非复制的 MergeTree 执行并行副本读取。#47858 (Nikita Mikhaylov).
- 在启用实验性 Analyzer 时,对于使用
Join、Dictionary和EmbeddedRocksDB表的 JOIN,支持将过滤条件下推到左表。#47280 (Maksim Kita). - 启用 zero copy 复制的 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_errorsSETTING,默认值为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 主题。#46752(Robert Schulze)。 - 修复用于检查 hyperscan 模式中存在问题的重复的启发式算法。#46819 (Robert Schulze).
- 当某个数据块由其他副本并发创建时,不再向 system.errors 报告 ZK 节点已存在的情况。 #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_native_allow_types_conversion来控制该行为(默认启用)。#46990 (Kruglov Pavel)。 - 在
range函数中支持 IPv4,以生成 IP 范围。 #46995 (Yakov Olkhovskiy). - 在无法将数据片段从一个卷/磁盘移动到另一个卷/磁盘时,改进异常信息。 #47032 (alesapin).
- 在
JSONType函数中支持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 重写。 - 从堆栈跟踪中移除
::__1部分。在堆栈跟踪中将std::basic_string<char, ...显示为String。 #47171 (Mike Kot). - 重新实现 interserver 模式以避免重放攻击(注意,该变更与旧版本服务器保持向后兼容性)。 #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函数添加对 bigint 类型的支持。解决 #47194。#47322(Nikolay Degterinsky)。 - 为具有过期时间的 S3 凭证添加一个过期窗口,以避免在某些极端情况下出现
ExpiredToken错误。可以通过expiration_window_seconds配置进行控制,默认值为 120 秒。#47423 (Antonio Andelic)。 - 在
Avro格式中支持 Decimal 和 Date32。#47434(Kruglov Pavel)。 - 在检测到从
Ordinary到Atomic的转换中断时,不要启动服务器,并输出更完善的错误信息以及故障排查指引。 #47487 (Alexander Tokmakov). - 向
system.opentelemetry_span_log添加一个新列kind。该列存储 OpenTelemetry 中定义的 SpanKind 值。#47499 (Frank Chen)。 - 允许在
Protobuf格式中仅使用根字段名作为列名来读取/写入嵌套数组。之前列名必须包含所有嵌套字段名(例如a.b.c Array(Array(Array(UInt32)))),现在可以只使用a Array(Array(Array(UInt32)))。#47650(Kruglov Pavel)。 - 为
SYSTEM SYNC REPLICA新增了可选的STRICT修饰符,使查询会一直等待直到复制队列清空(其行为与 https://github.com/ClickHouse/ClickHouse/pull/45648 之前相同)。#47659(Alexander Tokmakov)。 - 优化部分 OpenTelemetry span 日志的命名。#47667 (Frank Chen).
- 避免使用过长的聚合函数组合器链(在分析阶段可能导致查询变慢)。关闭了 #47715。#47716(Alexey Milovidov)。
- 支持在参数化视图中使用子查询;解决了 #46741 #47725(SmitaRKulkarni)。
- 修复 MySQL 集成中的内存泄漏问题(当
connection_auto_close=1时可重现)。 #47732 (Kseniia Sumarokova). - 改进了与 Decimal 参数相关代码中的错误处理,使错误消息的信息量更高。此前,当传入不正确的 Decimal 参数时,生成的错误消息不够清晰或缺乏参考价值。通过此次更新,输出的错误消息已调整为提供更详细且有用的信息,从而更容易识别和修正与 Decimal 参数相关的问题。#47812(Yu Feng)。注意:此变更日志条目由 ChatGPT 重写。
- 参数
exact_rows_before_limit用于确保rows_before_limit_at_least能够精确反映在达到 limit 之前返回的行数。此 pull request 解决了当查询涉及跨多个分片的分布式处理或排序操作时遇到的问题。在此更新之前,这些场景未按预期生效。#47874(Amos Bird)。 - 支持对 ThreadPools 指标的内省。 #47880 (Azat Khuzhin).
- 新增
WriteBufferFromS3Microseconds和WriteBufferFromS3RequestsErrors两个 profile event。#47885(Antonio Andelic)。 - 为 ClickHouse 安装添加
--link和--noninteractive(-y)选项。修复 #47750。#47887(Nikolay Degterinsky)。 - 修复了在附加到 materialized view 时,如果其依赖表不可用会出现
UNKNOWN_TABLE异常的问题。这在尝试从备份恢复状态时可能会很有用。#47975 (MikhailBurdukov)。 - 修复在加密磁盘配置中未添加可选路径时的问题。 #47981 (Kseniia Sumarokova).
- 在参数化视图中支持 CTE。实现:已更新以便在计算标量子查询时允许使用查询参数。#48065 (SmitaRKulkarni).
- 支持大整数
(U)Int128/(U)Int256、任意键类型的Map,以及任意精度(不再局限于 3 和 6)的DateTime64。 #48119 (Kruglov Pavel). - 允许在行输入格式中忽略由于未知枚举值导致的错误。 #48133 (Alexey Milovidov).
构建/测试/打包改进
- ClickHouse 现在使用
C++23进行构建。#47424 (Robert Schulze). - 在 AST Fuzzer 中对
EXPLAIN查询进行模糊测试。#47803 #47852 (flynn). - 将压力测试与自动化向后兼容性检查拆分开(后者现在称为 Upgrade 检查)。#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 能在带有旧版 glibc 的 ARM 上运行。#47063 (Robert Schulze).
- 添加样式检查以防止错误使用
NDEBUG宏。#47699 (Alexey Milovidov). - 略微加快构建速度。#47714 (Alexey Milovidov).
- 将
vectorscan升级到 5.4.9。#47955 (Robert Schulze). - 添加单元测试,以确保 Apache Arrow 的致命日志记录不会触发
abort退出。该测试覆盖了 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 TABLE操作期间过期,并且同时创建了一个在 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 模式时可能发生的异常中止问题 #46731(Kruglov Pavel)。 - 修复修改已过期角色时的错误 #46772 (Vitaly Baranov)。
- 修复多个步骤合并 PREWHERE 列时的累积问题 #46785 (Alexander Gololobov).
- 在 HTTP 读取缓冲区中使用初始 Range 请求来获取文件大小。否则,某些远程文件将无法被处理。 #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).
- 修复在拉取期间零拷贝复制时磁盘选择的错误 #47010 (alesapin)。
- 修复 systemd 服务定义中的拼写错误 #47051(Palash Goel)。
- 修复在使用 CROSS JOIN 且 algorithm = auto 时出现的 NOT_IMPLEMENTED 错误 #47068 (Vladimir C)。
- 修复在将 'part_type' 配置为 'InMemory' 模式(实验性功能)时,'ReplicatedMergeTree' 表无法插入两行相似数据的问题。 #47121 (liding1992).
- External dictionaries / 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)。 - 修复带有投影的 EXPLAIN 图 #47473 (flynn).
- 修复查询参数 #47488(Alexey Milovidov)。
- 参数化视图:修复了一个缺陷。#47495 (SmitaRKulkarni)。
- 数据格式模糊测试器及相关修复。 #47519 (Alexey Milovidov).
- 修复
DateTime64单调性检查问题 #47526(Antonio Andelic)。 - 修复 Nullable LowCardinality 列出现的“块结构不匹配”问题 #47537(Nikolai Kochetov)。
- 针对 Apache Parquet 中一个 bug 的正确修复 #45878 #47538 (Kruglov Pavel)。
- 修复当文档大小无效时的
BSONEachRow并行解析 #47540(Kruglov Pavel)。 - 在执行
SYSTEM FLUSH DISTRIBUTED时保留system.distribution_queue中的错误信息 #47541 (Azat Khuzhin)。 - 检查
BSONEachRow格式中的重复列 #47609 (Kruglov Pavel). - 修复在移动操作过程中等待零拷贝锁的问题 #47631 (alesapin).
- 修复按分区聚合的问题 #47634 (Nikita Taranov).
- 修复
BSONEachRow格式中将元组序列化为数组时的错误 #47690(Kruglov Pavel)。 - 修复
polygonsSymDifferenceCartesian函数中的崩溃 #47702(pufit)。 - 修复从存储
File读取使用zlib或gzip压缩的文件时的错误 #47796(Anton Popov)。 - Improve empty 查询 detection for PostgreSQL(适用于 pgx Go 语言驱动)#47854(Azat Khuzhin)。
- 修复 LowCardinality 类型的 DateTime 单调性检查问题 #47860(Antonio Andelic)。
- 在 RESTORE ASYNC 中使用 restore_threads(而不是 backup_threads)#47861(Azat Khuzhin)。
- 修复在包含投影的 ReplicatedMergeTree 表上执行 DROP COLUMN 时的问题 #47883(Antonio Andelic)。
- 修复 Replicated 数据库恢复问题 #47901(Alexander Tokmakov)。
- 针对 HTTP 中过于冗长的警告的热修复 #47903(Alexander Tokmakov)。
- 修复
catboostEvaluate中出现的 “Field value too long” 错误 #47970 (Robert Schulze)。 - 修复 #36971:Watchdog:在子进程退出时以非零状态码退出 #47973(Коренберг Марк)。
- 修复 "索引文件
cidx意外过长" 问题 #48010(SmitaRKulkarni)。 - 修复 MaterializedPostgreSQL 查询以正确获取属性(replica-identity) #48015 (Solomatov Sergei)。
- parseDateTime(): 修复未定义行为(有符号整数溢出) #48019 (Robert Schulze).
- 为 Avro 的 Records 使用唯一名称,以避免复用其 schema #48057 (Kruglov Pavel)。
- 正确配置 Keeper 中的 TCP/HTTP 套接字超时时间 #48108(Antonio Andelic)。
- 修复
Avro格式中可能出现的对空指针进行成员调用的问题 #48184 (Kruglov Pavel)。
ClickHouse 发行版 23.2,2023-02-23
向后不兼容变更
- 为函数 "toDayOfWeek()"(别名:"DAYOFWEEK")扩展了一个模式参数,用于指示一周是从星期一还是星期天开始,以及计数是从 0 还是 1 开始。为了与其他日期时间函数保持一致,模式参数被插入到时间参数和时区参数之间。这会导致之前使用(此前未在文档中说明的)两个参数语法 "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 子句之前指定 SETTINGS 子句,则这些设置也会应用于格式化。#46003(Azat Khuzhin)。
- 移除对设置
materialized_postgresql_allow_automatic_update的支持(该设置默认是关闭的)。#46106(Kseniia Sumarokova)。 - 略微提升
countDigits在真实数据集上的性能。关闭了 issue #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)。 - 引入
arrayShuffleFUNCTION,用于对数组进行随机排列。 #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). - 新增了两个函数,用于在 SipHash128 中使用用户自定义键/种子。 #45513 (Salvatore Mesoraca)。
- 为表函数
format增加支持三个参数的版本。关闭 #45808。#45873 (FFFFFFFHHHHHHH)。 - 为
'x'、'w'、'S'添加对JodaTime格式的支持。参见 https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html。#46073 (zk_kiger)。 - 新增对窗口函数
ntile的支持。(lgbo)。 - 新增
final设置,以隐式地将FINAL修饰符应用于所有表。 #40945 (Arthur Passos). - 新增了
arrayPartialSort和arrayPartialReverseSort函数。 #46296 (Joanna Hulboj). - 新的 HTTP 参数
client_protocol_version允许为以 Native 格式返回的 HTTP 响应设置客户端协议版本。#40397。#46360 (Geoff Genz)。 - 新增函数
regexpExtract,用于兼容 Spark 函数REGEXP_EXTRACT。其行为与已有函数extract类似。 #46469 (李扬). - 新增函数
JSONArrayLength,返回最外层 JSON 数组中的元素个数。如果输入的 JSON 字符串无效,该函数返回 NULL。 #46631 (李扬)。
性能优化
- 引入的逻辑在 PREWHERE 条件是多个条件的合取(cond1 AND cond2 AND ...)时生效。它会将那些需要读取相同列的条件分组成若干步骤。在每个步骤之后,会计算完整条件中对应的部分,并可能对结果行进行过滤。这样可以在后续步骤中读取更少的行,从而节省 I/O 带宽并减少计算开销。该逻辑目前默认是禁用的。一旦确认不会带来任何回归问题,它将在未来的某个版本中默认启用,因此强烈建议在测试中使用。它可以通过两个设置进行控制:"enable_multiple_prewhere_read_steps" 和 "move_all_conditions_to_prewhere"。#46140(Alexander Gololobov)。
- 如果表的分区键和
GROUP BY键兼容,新增了一个选项可对各个分区进行独立聚合。该行为由设置allow_aggregate_partitions_independently控制。由于适用范围有限(请参阅文档),该选项默认关闭。 #45364 (Nikita Taranov). - 允许在 Compact 格式的分区片段上使用 Vertical 合并算法。这将显著减少 ClickHouse 服务器在执行后台操作时的内存占用。修复了 #46084。#45681 #46282(Anton Popov)。
- 通过使用批读取器优化
Parquet读取器。#45878 (LiuNeng). - 新增基于 Linux 异步 io_uring 子系统的
local_filesystem_read_method方式io_uring,与默认的pread方式相比,几乎在所有情况下都提升了读取性能。 #38456 (Saulius Valatka). - 当逻辑上等价时,重写以
if表达式作为参数的聚合函数。例如,可以将avg(if(cond, col, null))重写为 avgIf(cond, col)。这有助于提升性能。#44730 (李扬)。 - 使用 AVX-512 指令提升 lower/upper 函数的性能。 #37894 (yaqi-zhao).
- 移除了这样一个限制:在具有 >=32 个内核且禁用 SMT 的系统上,ClickHouse 仅使用一半内核(即在 BIOS 中禁用超线程时的情况)。 #44973 (Robert Schulze)。
- 通过列式执行方式提升
multiIf函数的性能,提速 2.3 倍。 #45296 (李扬). - 为
positionFUNCTION 在待搜索子串为空时添加快速路径。 #45382 (李扬). - 默认启用
query_plan_remove_redundant_sorting优化。此优化功能最初在 #45420 中实现。#45567 (Igor Nikonov)。 - 增大 HTTP Transfer Encoding 的分块大小,以提升通过 HTTP 接口执行大型查询时的性能。#45593 (Geoff Genz)。
- 优化了在包含大量
Array/Map/Nested列的表上执行的短SELECT查询的性能。 #45630 (Anton Popov). - 提升对大整数和 Decimal 类型进行过滤时的性能。#45949 (李扬)。
- 此更改可以有效减少从 ColumnNullable(UInt8) 获取过滤器的开销,并提升整体查询性能。为了评估此更改的影响,我们采用了 TPC-H 基准测试,但对其做了修改:将列类型从非 Nullable 改为 Nullable,并以其查询的 QPS 作为性能指标进行测量。 #45962 (Zhiguo Zhou).
- 将
_part和_partition_id这两个虚拟列的类型设为LowCardinality(String)。修复 #45964。#45975(flynn)。 - 在
Decimal类型转换中,当 scale 不发生变化时提升性能。 #46095 (Alexey Milovidov). - 允许提升读取数据时的预取量。 #46168 (Kseniia Sumarokova).
- 将
arrayExists(x -> x = 1, arr)重写为has(arr, 1),将性能提升 1.34 倍。#46188 (李扬)。 - 修复在非远程磁盘上执行垂直合并时过高的内存使用。在远程磁盘上遵守
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、一元算术函数和比较函数添加 AVX-512 指令集支持。#37870 (zhao zhou)。 - 重写了与 marks 分布和整体读取协调相关的代码,以获得最大性能提升。解决了 #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 (李扬). - 改进了在带
ORDER BY的顶层查询计划中,内存受限的合并与聚合之间的交互方式。此前,在某些情况下我们会为 AIO 回退到显式排序,但实际上并不需要这样做。#45892 (Nikita Taranov)。 - 默认情况下,并发合并采用轮询(round-robin)方式进行调度,以确保公平且无饥饿的运行。此前在高负载分片中,由于使用严格优先级调度,大型合并任务可能会被较小的合并任务“饿死”。新增
background_merges_mutations_scheduling_policy服务器配置选项,用于选择调度算法(round_robin或shortest_task_first)。#46247(Sergei Trifonov)。
改进
- 在 ZooKeeper 会话丢失时默认启用对 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(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)。- 实验性的查询结果缓存现在支持更模块化的配置选项。#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 中引入、用于替代HeadObject的GetObjectAttributes请求改为可选(且默认禁用)。#45701(Vitaly Baranov)。 - 添加了基于连接名称覆盖连接设置的功能(也就是说,现在你不必再为每个连接单独存储密码,只需将所有内容统一放入
~/.clickhouse-client/config.xml中,甚至可以为不同连接使用各自的历史记录文件,这在某些场景下也很有用)。 #45715 (Azat Khuzhin). - Arrow 格式:支持 duration 类型。修复 #45669。#45750(flynn)。
- 扩展 Query Cache 的日志记录,以便更好地分析和排查缓存行为。#45751(Robert Schulze)。
query cache的服务器级别设置现在可以在运行时重新配置。#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)。
- 改进了将边界值 65535(2149-06-06)转换为 Date 类型时的行为。#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)。
- 禁止使用错误的创建 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 时,允许为 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 方言的兼容性,并为函数
formatDateTime扩展替换符 "a"、"b"、"c"、"h"、"i"、"k"、"l"、"r"、"s"、"W"。 ### 面向用户变更的文档条目 用户可读的简短描述:DATE_FORMAT是formatDateTime的别名。根据给定的格式字符串格式化时间。Format 是一个常量表达式,因此无法为单个结果列使用多种格式。(提供指向 formatDateTime 的链接)。#46302 (Jake Bamrah)。 - 为并行副本(
s3Cluster和MergeTree表)相关的回调任务添加ProfileEvents和CurrentMetrics。#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 runtime 实现的 GWP-ASan。修复了 #27039。#45226(Han Fei)。
- 我们希望让测试变得没那么稳定、更容易暴露问题:在测试中为 MergeTree 的 settings 添加随机化。#38983(Anton Popov)。
- 在 PowerPC 上启用 HDFS 支持,从而修复以下功能测试: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 分支从 "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,并构建 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 位数字推断为
Date类型。这可能会导致读到错误的数据。#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相关的段错误。这些问题是我之前的拉取请求(pull request)引入的。我在 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 步骤所致。#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)。 - 修复在读取启用了稀疏列(由设置项
ratio_of_defaults_for_sparse_serialization控制)的表数据时,带有INTERSECT和EXCEPT修饰符的SELECT查询发生崩溃的问题。 #45987 (Anton Popov)。 - 修复针对使用 FINAL 的 DESC 排序的顺序读取优化,关闭 #45815。#46009(Vladimir C)。
- 修复在紧凑分区片段中读取多层级不存在的嵌套列的问题。 #46045 (Azat Khuzhin).
- 修复
system.processes中elapsed列的 10 倍误差。 #46047 (Azat Khuzhin). - 针对“将域 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时,修复s3Cluster在并行分布式 INSERT SELECT 操作中的 schema 推断问题。#46381 (Kruglov Pavel). - 修复类似
ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ...的查询语句,其中arr1和arr2是同一个Nested类型列中的字段。#46387(Anton Popov)。 - Scheduler 可能会调度任务失败。如果发生这种情况,应中止整个 MulityPartUpload,并且
UploadHelper必须等待已经被调度的任务完成。 #46451 (Dmitry Novik). - 修复在 Merge 表中因默认类型不同而导致的
PREWHERE处理问题(修复当列的默认类型不一致时出现的一些NOT_FOUND_COLUMN_IN_BLOCK错误,同时在各表中列类型相同时允许使用PREWHERE,仅在类型不同时才禁止)。#46454 (Azat Khuzhin)。 - 修复了在
ORDER BY子句中使用常量值时可能发生的崩溃。已修复 #46466。#46493(Nikolai Kochetov)。 - 当在查询级别指定了
disk设置,但在 MergeTree 引擎配置的 settings 部分中指定了storage_policy时,不再抛出异常。disk将覆盖配置中的设置。#46533 (Kseniia Sumarokova)。 - 修复了在
arrayMap函数中对常量LowCardinality参数的错误处理。此缺陷可能在发布版中导致段错误(segfault),并在 debug 构建中触发逻辑错误Bad cast。 #46569 (Alexey Milovidov)。 - 修复 #46557。#46611(Alexander Gololobov)。
- 修复当服务器无法在 1 分 30 秒内启动时,
clickhouse-serversystemd 单元出现无限重启的问题(禁用通过 systemd service 启动clickhouse-server时的超时逻辑)。 #46613 (Azat Khuzhin)。 - 在异步插入过程中分配的内存缓冲区在全局上下文中被释放,但相应 USER 和 查询 的 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查询现在变为一个空操作(no-op)。#44647(alesapin)。HASHED/SPARSE_HASHED字典的PREALLOCATE选项现在变为一个空操作。#45388(Azat Khuzhin)。它不再具有显著优势。- 禁止在非 Float32 或非 Float64 类型的列上使用
Gorilla编解码器。#45252(Robert Schulze)。这没有意义,并且会导致结果不一致。 - 对于使用已弃用语法创建的
*MergeTree表,并行仲裁插入(parallel quorum inserts)可能工作不正确。因此,对此类表完全禁用并行仲裁插入支持。这不会影响使用新语法创建的表。#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这样的时区名称;应使用 IANA 时区数据库名称,例如Asia/Aden。#44225(Kruglov Pavel)。 - 由于会产生不正确的结果,禁止使用将等值连接和常量表达式组合在一起的查询(例如
JOIN ON t1.x = t2.x AND 1 = 1)。#44016(Vladimir C)。
新功能
- 用于通过遍历正则表达式树提取键的字典源。可用于解析 User-Agent。 #40878 (Vage Ogannisian)。 #43858 (Han Fei)。
- 新增参数化 View 功能,现在可以为 View 表引擎指定查询参数。修复了 #40907。#41687(SmitaRKulkarni)。
- 新增
quantileInterpolatedWeighted/quantilesInterpolatedWeighted函数。 #38252 (Bharat Nallan)。 - 为
Map类型提供数组展开支持,类似于 Spark 中的explode函数。 #43239 (李扬)。 - 支持 SQL 标准中的二进制和十六进制字符串字面量。#43785 (Mo Xuan)。
- 允许以 Joda-Time 风格格式化
DateTime。请参考 Joda-Time 文档。#43818(李扬)。 - 为
formatDateTime实现了用于格式化秒的小数部分的格式说明符(%f)。 #44060 (ltrk2). #44497 (Alexander Gololobov). - 新增
age函数,用于计算两个日期或日期时间值之间的差值,并将其表示为完整单位数。关闭了关联的 issue #41115。#44421(Robert Schulze)。 - 为字典新增
Null源。解决 #44240。#44502(mayamika)。 - 允许通过
s3_storage_class配置项设置 S3 存储类别,例如<s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>。关闭 #44443。#44707(chen)。 - 在解析 Named Tuple(命名元组)时,如果 JSON 对象中缺少字段,则插入默认值。新增设置
input_format_json_defaults_for_missing_elements_in_named_tuple,用于控制此行为。关闭 #45142#issuecomment-1380153217。 #45231(Kruglov Pavel)。 - 在 ProfileEvents 中记录服务器启动时长(
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)。
实验特性
- 添加一种实验性的倒排索引,作为新的二级索引类型,用于高效文本搜索。#38667 (larryluogit)。
- 添加实验性的查询结果缓存。#43797 (Robert Schulze)。
- 添加可扩展、可配置的 IO 请求调度子系统(尚未与 IO 代码本身集成)。#41840 (Sergei Trifonov)。此功能目前完全不起任何作用,敬请欣赏。
- 添加
SYSTEM DROP DATABASE REPLICA,用于移除Replicated数据库中失效副本的元数据。解决 #41794。#42807 (Alexander Tokmakov)。
性能优化
- 在启动
MergeTree表时不再加载非活跃的分区片段。 #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 子句)中的 happy path 优化做了小幅改进。#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).
- 在使用表函数 file/hdfs/s3 时,如果
SELECT查询中存在虚拟列,改进了从插入表自动获取表结构的机制,从而修复可能出现的Block structure mismatch或number of columns mismatch错误。#43695 (Kruglov Pavel)。 - 为函数
range添加对有符号参数的支持。修复 #43333。#43733(sanyu)。 - 移除冗余排序,例如移除子查询中与 ORDER BY 子句相关的排序。基于 query plan 实现。它对
ORDER BY子句所做的优化与optimize_duplicate_order_by_and_distinct类似,但更加通用,因为它适用于任意冗余的排序步骤(不仅限于由 ORDER BY 子句引起的排序),并且可应用于任意深度的子查询。相关 issue:#42648。#43905(Igor Nikonov)。 - 添加了在执行 BACKUP 时禁用文件去重功能的选项(对于不进行去重的备份,可以使用 ATTACH 来代替完整的 RESTORE)。例如
BACKUP foo TO S3(...) SETTINGS deduplicate_files=0(默认值为deduplicate_files=1)。 #43947(Azat Khuzhin)。 - 重构并优化文本格式的 schema 推断。新增设置项
schema_inference_make_columns_nullable,用于控制是否将结果列类型设为Nullable(默认启用)。#44019 (Kruglov Pavel)。 - 改进了对
PROXYv1协议的支持。#44135 (Yakov Olkhovskiy). - 将清理线程最近一次分区片段检查的信息添加到
system.parts表中。#44244 (Dmitry Novik)。 - 在只读模式下禁止使用表函数进行插入操作。 #44290 (SmitaRKulkarni).
- 添加名为
simultaneous_parts_removal_limit的设置项,用于限制 CleanupThread 在一次迭代中处理的分区片段数量。 #44461 (Dmitry Novik). - 当查询中只需要虚拟列时,不要初始化 ReadBufferFromS3。此更改可能有助于解决 #44246。#44493(chen)。
- 避免列名提示重复。修复 #44130。#44519(Joanna Hulboj)。
- 允许在磁盘 endpoint 中使用宏替换。解决 #40951。#44533(SmitaRKulkarni)。
- 在启用
input_format_json_read_object_as_string时改进模式推断。 #44546 (Kruglov Pavel)。 - 新增一个用户级别的设置项
database_replicated_allow_replicated_engine_arguments,用于禁止在DatabaseReplicated中创建带参数的ReplicatedMergeTree表。#44566 (alesapin)。 - 防止用户误将
index_granularity设置为零(无效)值。此更改修复了 #44536。#44578(Alexey Milovidov)。 - 在 config.xml 的
kerberos部分中,新增支持通过keytab参数设置服务 keytab 文件路径。 #44594 (Roman Vasin)。 - 在模糊搜索中复用已编写的查询部分(将其传递给用 Rust 编写并静态链接到 ClickHouse 的
skim库)。 #44600 (Azat Khuzhin). - 默认启用
input_format_json_read_objects_as_strings,以便在 JSON Object 类型仍处于实验阶段时也能读取嵌套 JSON 对象。#44657 (Kruglov Pavel)。 - 对异步插入去重的改进:当用户执行重复的异步插入时,应在查询 Keeper 之前先在内存中完成去重。#44682 (Han Fei)。
- 输入/输出
Avro格式会将布尔类型解析为 ClickHouse 的布尔类型。#44684 (Kruglov Pavel)。 - 在 Arrow/Parquet/ORC 中支持 Bool 类型。修复 #43970。#44698(Kruglov Pavel)。
- 在读取 UUID 时不要贪婪地解析超出引号的部分——这可能会导致错误数据被误判为解析成功。 #44686 (Raúl Marín).
- 在 Int64 溢出的情况下推断为 UInt64,并修复模式推断中的部分转换。#44696 (Kruglov Pavel).
- 之前在
Replicated数据库中的依赖关系解析是通过一种比较 “hacky” 的方式完成的,现在改为使用显式图进行规范实现。#44697(Nikita Mikhaylov)。 - 修复
output_format_pretty_row_numbers在块之间无法保持行号连续的问题。关闭 #44815。#44832(flynn)。 - 不再将由于分区片段与后台清理进程并发合并导致的错误报告到
system.errors中。 #44874 (Raúl Marín). - 优化并修复与 Distributed 异步 INSERT 相关的指标。 #44922 (Azat Khuzhin).
- 新增用于禁止并发备份和恢复的设置,修复了 #43891。实现方式:* 新增服务器级设置,用于禁止并发备份和恢复,在
Context中创建BackupWorker时读取并设置。* 这些设置默认值为 true。* 在开始备份或恢复之前,增加了检查步骤,用于判断是否有其他备份/恢复正在运行。对于内部请求,会通过backup_uuid检查该请求是否来自本节点。#45072 (SmitaRKulkarni)。 - 为系统日志新增
<storage_policy>配置参数。#45320 (Stig Bakken)。
构建/测试/打包改进
- 将用于 ClickHouse 客户端/本地历史记录模糊搜索的
skim库(使用 Rust 编写)改为静态链接。#44239 (Azat Khuzhin)。 - 由于 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)。
- 自动合并 CI 通过的回溯 PR 和 CI 通过且已批准的 PR。#41110 (Mikhail f. Shiryaev)。
- 提供一个用于查看 ClickHouse CI 状态的网站。源码。
错误修复
- 将域名 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)。 - 修复了从兼容性设置中解析无效版本的问题。 #44224 (Kruglov Pavel).
- 使在 datetime 上进行 interval 相减的行为与相加保持一致。#44241 (ltrk2).
- 移除 VIEW 结果的最大大小限制。 #44261 (lizhuoyu5).
- 修复在
do_not_evict_index_and_mrk_files=1时缓存中可能出现的逻辑错误。解决 #42142 中的问题。#44268(Kseniia Sumarokova)。 - 修复直写缓存中可能过早中断缓存写入的问题(由于错误假设导致缓存在不该停止时被停止)。#44289 (Kseniia Sumarokova).
- 修复了在将带有常量参数的
IN函数与LowCardinality一起作为常量参数使用时可能导致的崩溃。修复了 #44221。#44346(Nikolai Kochetov)。 - 修复了对参数化聚合函数中复杂参数(如数组)的支持,关闭了 #30975。在此更改之前,聚合函数
sumMapFiltered在分布式查询中无法使用。#44358 (Alexey Milovidov)。 - 修复在 BSON 模式推断中读取 ObjectId 的问题。 #44382 (Kruglov Pavel).
- 修复了 ReplicatedMergeTree 中可能导致在合并完成前提前删除临时分区片段的竞争条件。该问题可能会导致类似
No such file or directory: xxx的错误。修复 #43983。#44383(alesapin)。 - 某些无效的
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 "Left five eighths block")字符来显示 5/8 和 6/8 的刻度。此更改通过对 6/8 的刻度使用 '▊'(U+258A "Left three quarters block")来纠正这一问题。#44410(Alexander Gololobov)。 - 在配置文件中将 profile 设置放在 profile 设置的约束之后会使这些约束失效。#44411 (Konstantin Bogdanov)。
- 修复在执行包含数据的
EXPLAIN AST INSERT查询时出现的SYNTAX_ERROR。关闭 #44207。#44413(save-my-heart)。 - 修复了在 CSV 格式中读取包含 CRLF 的布尔值时的问题。关闭 #44401。#44442(Kruglov Pavel)。
- 不要在 LowCardinality 字典上执行 and/or/if/multiIf 函数,因此结果类型不能为 LowCardinality。否则在某些情况下可能会导致错误
Illegal column ColumnLowCardinality。修复了 #43603。#44469(Kruglov Pavel)。 - 修复在使用
max_streams_for_merge_tree_readingSETTING 时出现的 mutation 问题。#44472(Anton Popov)。 - 修复在
ASTSelectQuery::formatImpl中使用GROUPING SETS时可能出现的空指针解引用问题(#43049)。#44479(Robert Schulze)。 - 按照 settings 对表函数参数、CAST 函数参数以及 JSONAsObject 的 schema 推断中的类型进行校验。 #44501 (Kruglov Pavel).
- 修复 IN 函数在与 LowCardinality 和常量列一起使用时的问题,关闭 #44503。#44506(Duc Canh Le)。
- 修复了在
CREATE TABLE语句中规范化DEFAULT表达式时的一个 bug。函数in的第二个参数(或运算符IN的右侧参数)在执行 CREATE 查询时,可能会被替换为其求值结果。修复了 #44496。#44547(Alexander Tokmakov)。 - 在包含 WITH ROLLUP、WITH CUBE 和 WITH TOTALS 的情况下,PROJECTION 无法生效。在之前的版本中,查询会抛出异常,而不是跳过对 PROJECTION 的使用。修复了 #44614。修复了 #42772。#44615(Alexey Milovidov)。
- 由于函数
get all blocks sorted by time未获取到异步块,异步块因此没有被清理。#44651(Han Fei)。 - 修复在包含子查询的 JOIN、UNION 和 TOTALS 查询中出现的
LOGICAL_ERROR错误:The 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)的fsync处理(min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge)。#44781 (Azat Khuzhin)。 - 当在分区片段在磁盘之间移动时查询
system.parts或system.parts_columns表,可能会触发罕见的竞态条件。该问题最初在 #41145 中引入。#44809(Alexey Milovidov)。 - 修复在启用 PROJECTION 优化后可能出现的
Context has expired错误。该问题可以在包含某些函数的查询中复现,例如在运行时使用上下文的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),即延迟随超过阈值的分区片段数量成比例增长。修复了 #44902。#44954(Igor Nikonov)。 - 修复在宽 part 包含轻量级删除掩码时执行
ALTER TABLE ... TTL出错的问题。 #44959 (Mingliang Pan). - 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”变更的后续修复 #43221。#45024(Yakov Olkhovskiy)。
- 针对“将域名 IP 类型(IPv4、IPv6)替换为原生类型”的后续修复:https://github.com/ClickHouse/ClickHouse/pull/43221。#45043(Yakov Olkhovskiy)。
- 在解析器中可能发生缓冲区溢出。由模糊测试程序发现。#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 PROJECTION 时,由于未应用
additional_table_filters中的附加过滤条件而导致查询结果错误的问题。 #45133 (Nikolai Kochetov). - 修复了
histogram函数会接受负值的错误。 #45147 (simpleton)。 - 修复
StorageJoin中错误的列可空性设置,关闭 #44940。 #45184 (Vladimir C). - 修复在运行时增大
background_fetches_pool_size设置时的重新加载问题。 #45189 (Raúl Marín). - 正确处理在 KV 引擎(例如 KeeperMap、EmbeddedRocksDB)上,当键列使用返回不同类型结果的子查询与
IN搭配时的SELECT查询。#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 类型] 时的 bug,#45275。修复将
bytes类型错误推断为Float的 bug。#45276 (flynn)。 - 当显式
PREWHERE不能用于使用Merge存储引擎的表时,抛出正确的异常。 #45319 (Antonio Andelic). - 在 WSL1 Ubuntu 下,自解压版 ClickHouse 因不一致问题导致解压失败——/proc/self/maps 报告的是 32 位文件的 inode,而 stat 报告的是 64 位文件的 inode。 #45339 (Yakov Olkhovskiy)。
- 修复分布式表启动时的竞态条件(可能导致异步 INSERT 的文件被重复处理)。 #45360 (Azat Khuzhin).
- 修复了在从
S3存储和表函数s3读取数据时,当ListObject请求失败时可能发生的崩溃问题。#45371 (Anton Popov)。 - 修复在存在结构错误的字典(例如 XML 配置中类型不正确)时执行
SELECT ... FROM system.dictionaries会抛出异常的问题。 #45399 (Aleksei Filatov)。 - 修复在
INSERT INTO ... SELECT * FROM s3Cluster查询中,当基于插入表的表结构进行 schema 推断时出现的问题。 #45422 (Kruglov Pavel). - 修复了通过 HTTP 解析 JSON/BSONEachRow 时的一个问题,该问题可能会导致某些列使用默认值而不是数据中的值。 #45424 (Kruglov Pavel).
- 修复了在从文本源按类型解析 IP 类型时出现的错误(代码 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).
- 为缓存策略 getter 添加合适的默认值(SLRU),修复了 #45514。#45524(Kseniia Sumarokova)。
- 在变更(mutation)中禁止使用 ARRAY JOIN,关闭了 #42637 #44447(SmitaRKulkarni)。
- 修复了在使用表别名和列转换器时的限定星号问题。解决了 #44736。#44755(SmitaRKulkarni)。