跳到主要内容
跳到主要内容

2023 更新日志

目录

ClickHouse release v23.12, 2023-12-28
ClickHouse release v23.11, 2023-12-06
ClickHouse release v23.10, 2023-11-02
ClickHouse release v23.9, 2023-09-28
ClickHouse release v23.8 LTS, 2023-08-31
ClickHouse release v23.7, 2023-07-27
ClickHouse release v23.6, 2023-06-30
ClickHouse release v23.5, 2023-06-08
ClickHouse release v23.4, 2023-04-26
ClickHouse release v23.3 LTS, 2023-03-30
ClickHouse release v23.2, 2023-02-23
ClickHouse release v23.1, 2023-01-25
2022 年更新日志

ClickHouse release 23.12, 2023-12-28

向后不兼容的变更

  • 修复了在 TTL 表达式中对非确定性函数的检查。此前,在某些情况下你可以在 TTL 表达式中使用非确定性函数,这可能会在后续导致未定义行为。此修复解决了 #37250。默认情况下,不再允许与表中任何列都无关的 TTL 表达式。可以通过 SET allow_suspicious_ttl_expressions = 1SET compatibility = '23.11' 重新启用这类表达式。关闭了 #37286#51858Alexey Milovidov)。
  • MergeTree 设置项 clean_deleted_rows 已被弃用,不再产生任何效果。OPTIMIZECLEANUP 关键字在默认情况下不被允许(可以通过 allow_experimental_replacing_merge_with_cleanup 设置解除限制)。#58267Alexander Tokmakov)。此变更修复了 #57930。关闭了 #54988。关闭了 #54570。关闭了 #50346。关闭了 #47579。该功能必须被移除,因为它并不理想。我们必须尽快将其移除,因为别无他法。#57932Alexey Milovidov)。

新功能

  • 实现可刷新物化视图功能,该功能最初在 #33919 中提出需求。#56946Michael KolupaevMichael 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#57995Yarik Briukhovetskyi)。
  • ORDER BY 子句现在支持使用 ALL,这意味着 ClickHouse 会按照 SELECT 子句中的所有列进行排序。示例:SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL#57875 (zhongyuankai).
  • 添加了一个新的变更(mutation)命令 ALTER TABLE <table> APPLY DELETED MASK,用于强制应用由轻量级删除(lightweight delete)写入的掩码,并将标记为已删除的行从磁盘中物理删除。#57433Anton Popov)。
  • 处理程序 /binary 会打开一个可视化的符号查看器,用于浏览 ClickHouse 二进制文件中的符号。 #58211 (Alexey Milovidov).
  • 新增了一个 SQL 函数 sqid,用于生成 Sqids(https://sqids.org/),示例:SELECT sqid(125, 126)#57512Robert Schulze)。
  • 新增函数 seriesPeriodDetectFFT,用 FFT 检测序列周期。#57574Bhavna Jindal)。
  • 添加一个 HTTP 端点,用于检查 Keeper 是否已就绪以接受流量。#55876 (Konstantin Bogdanov)。
  • 为 schema 推断新增 'union' 模式。在此模式下,生成的表 schema 是所有文件 schema 的并集(即从每个文件单独推断 schema)。schema 推断模式由设置 schema_inference_mode 控制,可选值为 defaultunion。解决了 #55428#55892Kruglov Pavel)。
  • 新增设置项 input_format_csv_try_infer_numbers_from_strings,允许在 CSV 格式下从字符串中推断数字。关闭 #56455#56859Kruglov Pavel)。
  • 当数据库或表的数量超过可配置的阈值时,向用户显示警告。#57375 (凌涛)。
  • 采用 HASHED_ARRAY(以及 COMPLEX_KEY_HASHED_ARRAY)布局的字典现在也支持 SHARDS,其行为与 HASHED 类似。#57544 (vdimir)。
  • 为主键总字节数以及内存中已分配的主键总字节数添加异步指标。 #57551 (Bharat Nallan).
  • 新增 SHA512_256 函数。 #57645 (Bharat Nallan).
  • 添加 FORMAT_BYTES 作为 formatReadableSize 的别名。#57592Bharat Nallan)。
  • 允许向 s3 表函数传递可选会话令牌。#57850Shani Elharrar)。
  • 新增设置项 http_make_head_request。如果关闭该设置,URL 表引擎将不会执行 HEAD 请求来确定文件大小。这样可以支持低效、配置错误或不具备该能力的 HTTP 服务器。#54602 (Fionera)。
  • 现在可以在索引(非主键)定义中引用 ALIAS 列(问题 #55650)。示例:CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;#57546Robert Schulze)。
  • 新增了一个名为 readonly 的设置,可用于将 S3 磁盘指定为只读。在仅对底层 S3 bucket 拥有只读访问权限的情况下,在 s3_plain 类型的磁盘上创建表会非常有用。#57977Pengyuan Bian)。
  • 现在,MergeTree 表中的主键分析也将应用于包含虚拟列 _part_offset(可选地包含 _part)的谓词。此功能可以用作一种特殊形式的二级索引。 #58224 (Amos Bird)。

性能优化

  • 在对 MergeTree 表执行 FINAL 处理时提取互不相交的数据分片区间,从而避免对这些互不相交的分片区间执行额外的 FINAL 逻辑。如果具有相同主键的重复值数量较少,性能将与不使用 FINAL 时几乎相同。在启用 do_not_merge_across_partitions_select_final 设置时,提高带 FINAL 的 MergeTree 查询的读取性能。#58120Maksim 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 函数现已可以利用全文本跳过索引。#57878Jpnock)。
  • 函数 if(cond, then, else)(及其别名 cond ? then : else)已优化为使用无分支计算。#57885 (zhanglistar)。
  • 如果分区键表达式仅包含主键表达式中的列,MergeTree 会自动推断是否启用 do_not_merge_across_partitions_select_final 设置。#58218Maksim Kita)。
  • 加速原生数据类型的 MINMAX#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_timeoutreplicated_fetches_http_send_timeoutreplicated_fetches_http_receive_timeout 已移动到 Server 级别。- 设置 keep_alive_timeout 已添加到 Server 级别设置列表中。#57523 (Nikita Mikhaylov)。
  • 降低查询 system.filesystem_cache 时的内存开销。#57687 (Kseniia Sumarokova).
  • 减少字符串反序列化时的内存占用。 #57787 (Maksim Kita)。
  • 更高效的 Enum 构造函数——在 Enum 具有大量枚举值时优势明显。#57887 (Duc Canh Le)。
  • 针对从文件系统缓存读取的操作进行了改进:改为始终使用 pread 方法。#57970Nikita 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).
  • skip_unavailable_shards 添加为 Distributed 表的设置,与对应的查询级别设置类似。修复 #43666#57218Gagan Goel)。
  • 函数 substring(别名:substrmid)现在可以用于 Enum 类型的值。此前,第一个函数参数必须是 StringFixedString 类型的值。此更改提高了通过 MySQL 接口使用 Tableau 等第三方工具时的兼容性。#57277Serge Klochkov)。
  • 函数 format 现在支持任意参数类型(而不仅仅是 StringFixedString 参数)。这对于能够执行 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())#57624Yarik Briukhovetskyi)。
  • 当表不存在时提供更友好的错误提示。#57342 (Bharat Nallan).
  • 允许在查询执行时重写服务器设置 max_partition_size_to_dropmax_table_size_to_drop#57452Jordi Villar)。
  • 略微改进了 JSON 格式中未命名元组的推断。#57751Kruglov Pavel)。
  • 在连接到 Keeper 时添加对只读标志的支持(修复了 #53749)。#57479Mikhail Koviazin)。
  • 修复在从磁盘恢复批次数据时,可能因 “No such file or directory” 而导致的分布式发送卡住问题。修复在 distributed_directory_monitor_max_sleep_time_ms > 5 分钟时,system.distribution_queueerror_count 可能出现的问题。引入用于跟踪异步 INSERT 失败的 profile event(概要事件)—— DistributedAsyncInsertionFailures#57480 (Azat Khuzhin)。
  • MaterializedPostgreSQL(实验性特性)中支持 PostgreSQL 生成列和列的默认值。修复 #40449#57568Kseniia Sumarokova)。
  • 允许在不重启服务器的情况下应用部分文件系统缓存配置的更改。#57578 (Kseniia Sumarokova).
  • 正确处理包含空数组的 PostgreSQL 表的结构。#57618 (Mike Kot).
  • 将自上次服务器重启以来发生的错误总数作为 ClickHouseErrorMetric_ALL 指标对外暴露。 #57627 (Nikita Mikhaylov).
  • 允许在配置文件中使用带有 from_env/from_zk 引用,并且元素非空且设置了 replace=1 的节点。#57628 (Azat Khuzhin).
  • 一个表函数 fuzzJSON,用于为模糊测试生成大量格式错误的 JSON。#57646Julia 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#57796Nikolay Degterinsky)。
  • 修复并改进对外部数据库查询的转换逻辑,以递归方式获取所有兼容的谓词。#57888 (flynn)。
  • 支持动态调整文件系统缓存大小。修复 #57866#57897 (Kseniia Sumarokova).
  • 正确支持在 SIGRTMIN 被阻塞的线程上使用 system.stack_trace(这类线程可能存在于像 Apache rdkafka 这样的低质量外部库中)。#57907Azat Khuzhin)。并且仅在信号未被阻塞时才向线程发送信号,以避免在毫无意义的情况下等待 storage_system_stack_trace_pipe_read_timeout_ms#58136Azat Khuzhin)。
  • 在 quorum 插入检查时容忍 Keeper 故障。#57986 (Raúl Marín).
  • 将最大/峰值 RSS(MemoryResidentMax)添加到 system.asynchronous_metrics 表中。#58095 (Azat Khuzhin)。
  • 此 PR 允许用户在未显式指定非默认区域的情况下使用 S3 风格链接(https://s3://)。此外,如果用户指定了错误的区域,也能自动找到正确的区域。#58148Yarik Briukhovetskyi)。
  • clickhouse-format --obfuscate 将识别到 Settings、MergeTreeSettings 和时区,并保持它们的名称不作更改。 #58179 (Alexey Milovidov)。
  • ZipArchiveWriter 中添加了显式的 finalize() 函数,并简化了其中过于复杂的代码。修复了 #58074#58202Vitaly Baranov)。
  • 让具有相同路径的缓存使用同一个缓存对象。这个行为之前就存在,但在 23.4 中被破坏。如果此类具有相同路径的缓存设置了不同的缓存参数,将抛出异常,指出这是不被允许的。#58264Kseniia Sumarokova)。
  • 并行副本(实验功能):更友好的配置选项 #57542 (Igor Nikonov)。
  • 并行副本(实验性功能):改进公告响应处理逻辑 #57749Igor Nikonov)。
  • 并行副本(实验性功能):在 ParallelReplicasReadingCoordinator 中更严格地遵从 min_number_of_marks #57763 (Nikita Taranov)。
  • 并行副本(实验性功能):在 IN(子查询)中禁用并行副本 #58133 (Igor Nikonov)。
  • Parallel replicas(实验性功能):添加 profile 事件 'ParallelReplicasUsedCount' #58173 (Igor Nikonov)。
  • 非 POST 请求(例如 HEAD)将为只读,行为与 GET 类似。 #58060 (San)。
  • system.part_log 中新增 bytes_uncompressed#58167 (Jordi Villar)。
  • 将基础备份名称添加到 system.backupssystem.backup_log 表中 #58178 (Pradeep Chhetri)。
  • 在 clickhouse-local 中新增通过命令行指定查询参数的支持 #58210 (Pradeep Chhetri)。

构建/测试/打包改进

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 版本 23.11,2023-12-06

向后不兼容变更

  • 默认的 ClickHouse 服务器配置文件已为 default 用户启用 access_management(通过 SQL 查询进行用户操作)和 named_collection_control(通过 SQL 查询操作命名集合)。已关闭 #56482#56619Alexey Milovidov)。
  • 对窗口函数的 RESPECT NULLS/IGNORE NULLS 做了多项改进。如果你将它们用作聚合函数,并且存储了带有这些修饰符的聚合函数状态,它们可能会变得不兼容。#57189Raúl Marín)。
  • 移除优化项 optimize_move_functions_out_of_any#57190Raú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 控制,但默认关闭,以避免破坏现有用例。#55872Azat Khuzhin)。
  • 不再允许对 Decimal 类型的参数使用聚合函数 avgWeighted。变通方法:将参数转换为 Float64。已关闭 #43928#31768#56435。如果你在物化视图或带有 Decimal 参数的投影中使用过此函数,请联系 [email protected]。修复了聚合函数 sumMap 中的错误,并导致其速度变慢约 1.5 到 2 倍。影响不大,因为这个函数本身就几乎没什么用。已关闭 #54955#53134#55148。修复了函数 groupArraySample 的一个缺陷——在一个查询中生成多个聚合状态时,它使用了相同的随机种子。#56350Alexey Milovidov)。

新功能

  • 新增服务器设置 async_load_databases,用于异步加载数据库和数据表,以加快服务器启动速度。适用于使用 OrdinaryAtomicReplicated 引擎的数据库,这些数据库中的表会异步加载元数据。对某个表的查询会提升对应加载任务的优先级,并等待其完成。新增 system.asynchronous_loader 系统表用于自省。 #49351 (Sergei Trifonov).
  • 添加系统表 blob_storage_log。可用于审计写入到 S3 和其他对象存储的所有数据。 #52918 (vdimir)。
  • 使用统计信息对 PREWHERE 条件进行更合理的排序。#53240 (Han Fei)。
  • 在 Keeper 协议中新增了对压缩的支持。可以在 ClickHouse 端通过在 zookeeper 配置段中使用 use_compression 标志来启用。请注意,只有 ClickHouse Keeper 支持压缩,而 Apache ZooKeeper 不支持。解决了 #49507#54957SmitaRKulkarni)。
  • 引入特性 storage_metadata_write_full_object_key。如果将其设置为 true,则元数据文件将按新格式写入。使用该格式时,ClickHouse 会在元数据文件中存储完整的远程对象键,从而提供更高的灵活性和优化空间。#55566 (Sema Checherinda)。
  • 添加新的设置和语法,以防止命名集合中的字段被覆盖。此举旨在防止恶意用户未经授权访问机密信息。#55782 (Salvatore Mesoraca).
  • 为所有系统日志表添加 hostname 列——如果将系统表设置为副本、共享或分布式表,这会很有用。 #55894 (Bharat Nallan)。
  • 新增 CHECK ALL TABLES 查询。#56022vdimir)。
  • 新增函数 fromDaysSinceYearZero,其作用类似于 MySQL 的 FROM_DAYS。例如:SELECT fromDaysSinceYearZero(739136) 返回 2023-09-08#56088Joanna Hulboj)。
  • 添加了一个外部 Python 工具,用于查看备份,并在无需使用 ClickHouse 的情况下从中提取信息。 #56268 (Vitaly Baranov).
  • 引入一个名为 preferred_optimize_projection_name 的新设置。如果将其配置为非空字符串,则在可能的情况下会优先使用指定的投影,而不是从所有候选项中进行选择。#56309 (Yarik Briukhovetskyi)。
  • 添加用于让出/放弃主节点领导权的四字母命令(https://github.com/ClickHouse/ClickHouse/issues/56352)。#56354Pradeep Chhetri)。#56620Pradeep Chhetri)。
  • 新增了一个 SQL 函数 arrayRandomSample(arr, k),用于从输入数组中随机抽取 k 个元素。此前只能通过语法较为繁琐的方式实现类似功能,例如:SELECT arrayReduce('groupArraySample(3)', range(10))#56416 (Robert Schulze).
  • .npy 文件中使用的 Float16 类型数据添加了支持。解决了 #56344#56424Yarik Briukhovetskyi)。
  • 添加了系统视图 information_schema.statistics,以增强与 Tableau Online 的兼容性。#56425 (Serge Klochkov).
  • 添加 system.symbols 表,用于对二进制程序进行自省。 #56548 (Alexey Milovidov).
  • 可配置仪表板。用于图表的查询现在通过查询加载,默认使用新的 system.dashboards 表。#56771Sergei Trifonov)。
  • 新增 fileCluster 表函数——在将共享文件系统(如 NFS)挂载到 user_files 目录时非常有用。#56868Andrey 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#57311alesapin)。
  • 设置 join_algorithm 时会遵循指定的顺序 #51745vdimir)。
  • 在 Protobuf 格式中新增对常用 Protobuf 内置类型的支持。#56741János Benjamin Antal)。

性能优化

  • 与 S3 交互时采用自适应超时策略。第一次请求会使用较短的发送和接收超时时间。#56314 (Sema Checherinda)。
  • max_concurrent_queries 的默认值从 100 提高到 1000。当存在大量连接客户端且它们发送或接收数据较慢、因此服务器不受 CPU 限制时,或者当 CPU 核心数大于 100 时,这样的设置是合理的。同时,默认启用并发控制,并将总的查询处理线程数设置为 CPU 核心数的两倍。在存在极大量并发查询的场景下,这可以提升性能。#46927Alexey 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 等待时间。#55841Nikita Taranov)。
  • 针对从 maparrayElement 中获取值的优化,可带来约 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%,且对其他查询没有影响。#56079Zhiguo Zhou)。
  • 限制查询分析器中参与分析的线程数量。若线程数超过该限制,超出的线程将不会进行分析。 #56105 (Alexey Milovidov).
  • 减少窗口函数中的虚函数调用次数。 #56120 (Maksim Kita).
  • 在 ORC 数据格式中允许对 Tuple 字段进行递归裁剪,以加快扫描。#56122李扬)。
  • 针对 Npy 数据格式的简单 count 优化:像 select count() from 'data.npy' 这样的查询现在由于结果缓存而会运行得快得多。#56304Yarik Briukhovetskyi)。
  • 包含聚合且具有大量数据流的查询,在构建执行计划阶段将占用更少的内存。#57074 (Alexey Milovidov).
  • 通过优化对 ProcessList 的访问,在拥有大量用户且查询高度并发(>2000 QPS)的场景中提升查询执行性能。 #57106 (Andrej Hoos).
  • array join 做了小幅改进,复用了一些中间结果。#57183 (李扬)。
  • 在某些情况下,栈展开以前会很慢。现在已经不再是问题。#57221Alexey Milovidov)。
  • 现在,当 max_streams = 1 时,我们会使用默认读池从外部存储读取数据。在启用读取预取时,这样做会更有利。#57334Nikita Taranov)。
  • Keeper 改进:通过延迟日志预处理来降低启动期间的内存使用。#55660 (Antonio Andelic)。
  • 提升了 FileHDFS 存储中 glob(通配符)匹配的性能。#56141 (Andrey Zvonov).
  • 实验性全文索引中的 posting list 现已压缩,其大小减少了 10–30%。 #56226 (Harry Lee).
  • 在备份流程中对 BackupEntriesCollector 进行并行化。#56312Kseniia Sumarokova)。

改进

  • 新增一个名为 add_implicit_sign_column_constraint_for_collapsing_engineMergeTree 设置(默认禁用)。启用后,会为 CollapsingMergeTree 表添加一个隐式的 CHECK 约束条件,将 Sign 列的取值限制为仅为 -1 或 1。 #56701#56986 (Kevin Mingtarja)。
  • 允许在无需重启的情况下向存储配置添加新磁盘。#56367 (Duc Canh Le)。
  • 支持在同一条 ALTER 查询语句中创建并物化索引,也支持在同一条查询中同时执行 "modify TTL" 和 "materialize TTL"。修复了 #55651 中的问题。#56331 (flynn)。
  • 添加一个名为 fuzzJSON 的新表函数,其行包含在源 JSON 字符串基础上加入随机扰动后的变体。#56490Julia Kartseva)。
  • 引擎 Merge 会根据底层表的行策略过滤记录,因此你无需在 Merge 表上再创建行策略。#50209Ilya 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#54800Kruglov Pavel)。
  • 通过在查找 DDL 条目中 hosts 列表里的本地 IP 地址时,移除为获取所有网络接口而进行的代价高昂的系统调用,提升 ON CLUSTER 查询的性能。 #54909 (Duc Canh Le).
  • 修复了在将线程附加到查询或用户之前对已分配内存的记账问题。 #56089 (Nikita Taranov).
  • 在 Apache Arrow 格式中增加对 LARGE_LIST 的支持。#56118 (edef)。
  • 允许通过 OPTIMIZE 查询对 EmbeddedRocksDB 执行手动压实(compaction)。#56225Azat Khuzhin)。
  • EmbeddedRocksDB 表新增指定 BlockBasedTableOptions 的支持。 #56264 (Azat Khuzhin).
  • 当通过 MySQL 协议建立连接时,SHOW COLUMNS 现在会显示对应的 MySQL 数据类型名称。此前,只有在将 use_mysql_types_in_show_columns = 1 设置为启用时才会如此。该设置仍然保留,但已被废弃。 #56277 (Robert Schulze).
  • 修复了这样一个问题:如果在执行 TRUNCATEDROP PARTITION 之后立即重启服务器,可能会出现 The local set of parts of table doesn't look like the set of parts in ZooKeeper 错误。#56282Alexander Tokmakov)。
  • 修复了在函数 formatQuery/formatQuerySingleLine 中对非常量查询字符串的处理。同时新增了这两个函数的 OrNull 变体,在无法解析查询时返回 NULL,而不是抛出异常。#56327Robert Schulze)。
  • 允许在内部表已被删除时仍备份物化视图,而不是让备份操作失败。 #56387 (Kseniia Sumarokova).
  • system.replicas 的查询在检索某些列时会向 ZooKeeper 发起请求。当存在成千上万张表时,这些请求可能会给 ZooKeeper 带来相当大的负载。如果有多个同时对 system.replicas 的查询,则会多次重复发出相同的请求。此更改的目的在于对并发查询的请求进行“去重”。#56420Alexander Gololobov)。
  • 修复在查询外部数据库时生成 MySQL 兼容查询的转换。#56456 (flynn).
  • 新增对使用 KeeperMap 引擎进行表备份和恢复的支持。#56460 (Antonio Andelic).
  • 需要重新确认 CompleteMultipartUpload 返回的 404 响应。即使客户端发生超时或其他网络错误,该操作也可能已经在服务器端完成。下一次重试 CompleteMultipartUpload 时会收到 404 响应。如果对应的对象键已存在,则认为该操作已成功完成。#56475 (Sema Checherinda).
  • 默认启用 HTTP OPTIONS 方法——以便更方便地从 Web 浏览器向 ClickHouse 发起请求。#56483 (Alexey Milovidov)。
  • dns_max_consecutive_failures 的值在 #46550 中被误改 —— 现已恢复并调整为一个更合适的值。同时,将 HTTP keep-alive 超时时间提升到了一个参考生产环境的合理数值。#56485 (Alexey Milovidov).
  • 延迟加载基础备份(仅在需要时才加载基础备份)。同时为备份添加一些日志消息和 profile 事件。#56516 (Vitaly Baranov).
  • 设置项 query_cache_store_results_of_queries_with_nondeterministic_functions(取值为 falsetrue)已被标记为废弃。它被设置项 query_cache_nondeterministic_function_handling 所取代,这是一个三值枚举,用于控制查询缓存如何处理包含非确定性函数的查询:a)抛出异常(默认行为),b)仍然保存该非确定性查询的结果,或 c)忽略,即既不抛出异常也不缓存结果。#56519Robert Schulze)。
  • 在 JOIN 的 ON 子句中,将等值条件改写为 is null 检查。实验性功能,仅适用于 Analyzer#56538 (vdimir).
  • 函数 concat 现在支持任意类型的参数(不再仅限于 String 和 FixedString 参数)。这使其行为更接近 MySQL 中的 concat 实现。例如,SELECT concat('ab', 42) 现在会返回 ab42#56540 (Serge Klochkov)。
  • 允许从配置文件中的 'named_collection' 部分或从通过 SQL 创建的命名集合中获取缓存配置。 #56541 (Kseniia Sumarokova).
  • PostgreSQL 数据库引擎:在 PostgreSQL 连接失败时,降低对过期表删除策略的激进程度。#56609 (jsc0218)。
  • 当 URL 不正确时,连接 PG 会耗费过多时间,导致相关查询长时间挂起并最终被取消。#56648 (jsc0218).
  • Keeper 改进:在 Keeper 中默认禁用压缩日志。#56763Antonio Andelic)。
  • 添加配置项 wait_dictionaries_load_at_startup#56782 (Vitaly Baranov).
  • 在之前的 ClickHouse 版本中存在一个潜在漏洞:如果某个用户连接后尝试使用 "interserver secret" 方法进行认证但失败,服务器不会立即终止连接,而是继续接收并忽略来自客户端的剩余数据包。尽管这些数据包会被忽略,但它们仍然会被解析,如果其中使用了一种已知存在其他漏洞的压缩方法,就可能在未通过认证的情况下被利用触发该漏洞。该问题是通过 ClickHouse Bug Bounty Programhttps://twitter.com/malacupa 发现的。#56794Alexey Milovidov)。
  • 在获取某个 part 时,会等待该 part 在远程副本上完全提交之后才开始获取。最好不要发送处于 PreActive 状态的 part。对于零拷贝(zero copy)场景,这是一个强制性限制。#56808Sema Checherinda)。
  • 修复在使用实验性 MaterializedPostgreSQL 时可能出现的 PostgreSQL 逻辑复制转换错误。#53721takakawa)。
  • 实现用户级别设置 alter_move_to_space_execute_async,允许异步执行 ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME 查询。用于后台执行的线程池大小由 background_move_pool_size 控制。默认行为为同步执行。修复了 #47643#56809alesapin)。
  • 在扫描 system.tables 时可以按引擎进行过滤,从而避免不必要(且可能耗时)的连接操作。#56813jsc0218)。
  • 在系统表中显示 RocksDB 存储的 total_bytestotal_rows#56816 (Aleksandr Musorin)。
  • 允许在 ALTER 中对 TEMPORARY 表执行基本命令。 #56892 (Sergey).
  • LZ4 压缩。在极少数情况下,当输出缓冲区的容量不足以将压缩块直接写入输出缓冲区时,对压缩块进行缓冲处理。 #56938 (Sema Checherinda).
  • 为队列中的作业数量添加指标,这对于 IO 线程池非常有用。#56958 (Alexey Milovidov)。
  • 在配置文件中为 PostgreSQL 表引擎添加了一个设置项,增加了对该设置的检查,并补充了相关文档说明。#56959 (Peignon Melvyn)。
  • 函数 concat 现在可以仅使用单个参数进行调用,例如:SELECT concat('abc')。这使其行为与 MySQL 的 concat 实现更加一致。#57000Serge Klochkov)。
  • 按 AWS S3 文档要求对所有 x-amz-* 请求头进行签名。#57001 (Arthur Passos)。
  • 函数 fromDaysSinceYearZero(别名:FROM_DAYS)现在可以用于无符号和有符号整数类型(之前只支持无符号整数)。这提升了与 Tableau Online 等第三方工具的兼容性。#57002Serge Klochkov)。
  • 在默认配置中添加 system.s3queue_log#57036 (Kseniia Sumarokova)。
  • wait_dictionaries_load_at_startup 的默认值改为 true,并且仅在 dictionaries_lazy_load 为 false 时才使用此设置。#57133Vitaly Baranov)。
  • 即使启用了 dictionaries_lazy_load,在创建时仍会检查字典源类型。#57134Vitaly Baranov)。
  • 现在可以单独启用或禁用计划级别优化。之前只能一次性全部禁用。此前用于执行该操作的设置(query_plan_enable_optimizations)仍然保留,仍可用于禁用所有优化。#57152Robert Schulze)。
  • 服务器的退出状态码将与异常代码对应。例如,如果服务器由于内存限制而无法启动,它将以代码 241 = MEMORY_LIMIT_EXCEEDED 退出。在之前的版本中,异常的退出状态码始终是 70 = Poco::Util::ExitCode::EXIT_SOFTWARE。 #57153 (Alexey Milovidov).
  • 不再对来自 functional C++ 头文件的栈帧执行名称还原和符号化处理。#57201 (Mike Kot)。
  • HTTP 服务器页面 /dashboard 现在支持包含多条曲线的图表。#57236 (Sergei Trifonov)。
  • 命令行选项 max_memory_usage_in_client 现已支持带后缀(K、M、G 等)的字符串值。已解决 #56879#57273Yarik Briukhovetskyi)。
  • 将 Intel QPL(供编解码器 DEFLATE_QPL 使用)从 v1.2.0 升级到 v1.3.1。还修复了在 BOF(Block On Fault)= 0 时的一个问题,改为在发生页故障时回退到软件路径(SW path)进行处理。#57291 (jasperzhu)。
  • 将 MergeTree 设置中的 replicated_deduplication_window 默认值从 100 提高到 1k。 #57335 (sichenzhao).
  • 尽量减少使用 INCONSISTENT_METADATA_FOR_BACKUP。如果可能,应尽量继续扫描,而不是停止并从头重新进行备份扫描。 #57385 (Vitaly Baranov).

构建/测试/打包改进

  • 添加 SQLLogic 测试。#56078Han Fei)。
  • 为提高易用性,将 clickhouse-localclickhouse-client 支持通过简写名称(chchlchc)调用。#56634Alexey Milovidov)。
  • 通过移除外部库中未使用的代码,进一步优化了构建产物体积。#56786 (Alexey Milovidov).
  • 新增自动检查,确保不存在过大的翻译单元。#56559 (Alexey Milovidov)。
  • 缩小单一二进制发行包的体积。此更改关闭了 issue #55181#56617Alexey Milovidov)。
  • 每次构建完成后,关于每个翻译单元和二进制文件大小的信息都会发送到 ClickHouse Cloud 中的 CI 数据库。这解决了 #56107#56636Alexey Milovidov)。
  • “Apache Arrow” 库中的某些文件(我们仅将其用于诸如解析 Arrow 格式之类的非关键功能)之前无论构建缓存如何都会被重新构建。现在已修复。#56657 (Alexey Milovidov)。
  • 避免因版本相关的自动生成源文件而重新编译依赖它的翻译单元。 #56660 (Alexey Milovidov).
  • 链接器调用的跟踪数据将被发送到 ClickHouse Cloud 的 CI 数据库。#56725Alexey Milovidov)。
  • 对 ClickHouse 二进制文件改用 DWARF 5 调试符号(此前为 DWARF 4)。 #56770 (Michael Kolupaev)。
  • 新增一个构建选项 SANITIZE_COVERAGE。如果启用,代码会被插桩以跟踪覆盖率。收集到的信息可以在 ClickHouse 中通过以下方式获取:(1)新增函数 coverage,返回自上次重置覆盖率以来在代码中发现的唯一地址数组;(2)SYSTEM RESET COVERAGE 查询,用于重置已累积的数据。这样可以比较不同测试的覆盖率,包括差分代码覆盖率。本项为 #20539 的延续。#56102Alexey Milovidov)。
  • 在收集堆栈时,部分栈帧可能无法被解析。这种情况下,原始地址信息可能会有用。#56267Alexander Gololobov)。
  • 新增可用于禁用 libssh 的选项。#56333 (Alexey Milovidov).
  • 在 CI 的 S3 测试中启用 temporary_data_in_cache。 #48425 (vdimir).
  • 在 CI 中将 clickhouse-client 的最大内存使用量设置为 1G#56873Nikita Mikhaylov)。

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 版本 23.10,2023-11-02

向后不兼容变更

  • 不再提供自动删除损坏数据分片的选项。此变更关闭了 #55174#55184Alexey Milovidov)。#55557Jihyuk Bok)。
  • 已废弃的内存数据分片将不再能够从预写日志(write-ahead log)中读取。如果之前配置过内存分片,在升级前必须将其移除。#55186Alexey Milovidov)。
  • 移除与 Meilisearch 的集成。原因:该集成仅与旧版本 0.18 兼容。最新版本的 Meilisearch 修改了协议,现已无法工作。注意:如能协助恢复该集成,我们将不胜感激。#55189Alexey Milovidov)。
  • 将目录监控(directory monitor)概念重命名为后台 INSERT。所有 *directory_monitor* 相关设置均重命名为 distributed_background_insert*应当保持向后兼容性(因为旧设置已作为别名保留)。#55978Azat Khuzhin)。
  • 不再将客户端设置的 send_timeout 解释为服务端的 receive_timeout,反之亦然。#56035Azat Khuzhin)。
  • 对具有不同单位的时间间隔进行比较时将抛出异常。此变更关闭了 #55942。你可能曾不经意地依赖之前的行为,即无视单位直接比较底层数值。#56090Alexey Milovidov)。
  • 已完全重写实验性的 S3Queue 表引擎:更改了在 ZooKeeper 中保存信息的方式,从而减少 ZooKeeper 请求次数;在已知状态不会改变的情况下增加 ZooKeeper 状态缓存;改进从 S3 的轮询过程,降低轮询的激进程度;更改维护已跟踪文件的 TTL 和最大集(max set)方式,现在由后台进程完成。新增 system.s3queuesystem.s3queue_log 表。关闭了 #54998#54422Kseniia Sumarokova)。
  • HTTP 端点上的任意路径将不再被解释为对 /query 端点的请求。#55521Konstantin Bogdanov)。

新功能

  • 新增函数 arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn),该函数对多个具有相同长度的数组应用 lambda 函数,并将结果累积到累加器(accumulator)中。#49794 (Lirikl)。
  • 新增对 Npy 格式的支持。SELECT * FROM file('example_array.npy', Npy)#55982Yarik 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 的延续。#55642Alexey Milovidov)。
  • 新增了一个名为 force_optimize_projection_name 的新设置,它接受某个 projection 的名称作为参数。如果该设置的值被指定为非空字符串,ClickHouse 会检查在查询中是否至少使用过一次该 projection。修复了 #55331#56134Yarik Briukhovetskyi)。
  • 通过原生协议支持使用外部数据的异步插入。此前仅在将数据内联到查询中时才可用。#54730 (Anton Popov)。
  • 新增聚合函数 lttb,使用 Largest-Triangle-Three-Buckets 算法对数据进行可视化降采样。#53145Sinan)。
  • CHECK TABLE 查询具有更好的性能和易用性(会发送进度更新,可取消)。支持使用 CHECK TABLE ... PART 'part_name' 检查指定的 part。 #53404 (vdimir)。
  • 新增函数 jsonMergePatch。在以字符串形式处理 JSON 数据时,该函数提供了一种方式,将多个(JSON 对象的)字符串合并成一个包含单个 JSON 对象的字符串。 #54364 (Memo)。
  • Kusto Query Language 方言支持的第二部分。第一阶段的实现已合并。#42510larryluogit)。
  • 新增了一个 SQL 函数 arrayRandomSample(arr, k),用于从输入数组中随机返回 k 个元素的样本。此前要实现类似功能只能使用不太方便的语法,例如 "SELECT arrayReduce('groupArraySample(3)', range(10))"。 #54391 (itayisraelov).
  • 引入 -ArgMin / -ArgMax 聚合组合子,它们仅按最小值/最大值进行聚合。一个使用场景示例见 #54818。此 PR 还将这些组合子重新组织到专用目录中。#54947Amos 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 引擎中保存未解析的记录及其错误。添加虚拟列 _error_raw_message(用于 NATS 和 RabbitMQ)、_raw_record(用于 FileLog),当 ClickHouse 无法解析新记录时,这些列会被填充。该行为通过存储设置中的 nats_handle_error_mode(用于 NATS)、rabbitmq_handle_error_mode(用于 RabbitMQ)、handle_error_mode(用于 FileLog)进行控制,类似于 kafka_handle_error_mode。如果将其设置为 default,当 ClickHouse 无法解析记录时会抛出异常;如果设置为 stream,错误和原始记录将会被保存到这些虚拟列中。修复并关闭 #36035#55477Kruglov 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 表中新增了 substreamsfilenames 列。 #55108 (Anton Popov).
  • 新增对 SHOW MERGES 查询的支持。#55815megao)。
  • 引入设置 create_table_empty_primary_key_by_default,以便在默认情况下使用 ORDER BY ()#55899Srikanth Chekuri)。

性能优化

  • 新增选项 query_plan_preserve_num_streams_after_window_functions,在计算窗口函数后保留数据流的数量,从而支持并行流处理。#50771 (frinkr).
  • 当数据量较小时,释放更多流。 #53867 (Jiebin Sun).
  • 在序列化之前对 RoaringBitmaps 进行了优化。#55044UnamedRus)。
  • 倒排索引中的 posting list 现已优化为对内部位图使用尽可能紧凑的表示形式。根据数据的重复程度,这可以显著减少倒排索引的空间占用。#55069Harry Lee)。
  • 修复 Context 锁上的竞争,这显著提升了大量短时间运行的并发查询的性能。#55121Maksim Kita)。
  • 将倒排索引构建的性能提升了 30%。这是通过将 std::unordered_map 替换为 absl::flat_hash_map 实现的。 #55210 (Harry Lee)。
  • 支持 ORC 过滤下推(行组级别)。#55330 (李扬).
  • 提升在存在大量临时文件时的外部聚合性能。#55489 (Maksim Kita)。
  • 为二级索引的 marks cache 设置合理的默认大小,以避免重复加载 marks。#55654Alexey Milovidov)。
  • 在读取 skip 索引时,避免对索引粒度进行不必要的重建。这解决了 #55653#55683Amos Bird)。
  • 在执行过程中对集合中的 CAST 操作进行缓存,以在集合元素类型与列类型不完全匹配时提升 IN 函数的性能。#55712 (Duc Canh Le)。
  • ColumnVector::insertManyColumnVector::insertManyFrom 的性能进行了改进。 #55714 (frinkr)。
  • 通过预测下一行键的位置来优化 Map 下标访问,从而减少比较次数。#55929 (lgbo)。
  • 在 Parquet 中支持结构体字段裁剪(在早期版本中在某些情况下不生效)。 #56117 (lgbo)。
  • 根据预估的读取行数,新增可调节查询执行时所使用并行副本数量的功能。#51692Raú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(即倒排列表中的行 ID 过多)。这样可以节省空间,并避免在顺序扫描同样快或更快的情况下进行低效的索引查找。此前用于控制何时不存储 token 的启发式规则(传递给索引定义的 density 参数)让用户感到困惑。现在引入了一个更简单的、基于 max_rows_per_postings_list 参数(默认值:64k)的启发式规则,用于直接控制单个倒排列表中允许的最大行 ID 数量。#55616Harry Lee)。
  • 提升对 EmbeddedRocksDB 表的写入性能。 #55732 (Duc Canh Le).
  • 在某个分区包含大量 part(超过 1000 个)时,提升了 ClickHouse 的整体健壮性。这可能会减少 TOO_MANY_PARTS 错误的出现次数。 #55526 (Nikita Mikhaylov).
  • 在加载分层字典时减少了内存占用。 #55838 (Nikita Taranov).
  • 现在所有字典都支持设置 dictionary_use_async_executor#55839vdimir)。
  • 防止在反序列化 AggregateFunctionTopKGenericData 时出现过量的内存占用。#55947 (Raúl Marín).
  • 在具有大量 watch 的 Keeper 实例上,AsyncMetrics 线程可能会在 DB::KeeperStorage::getSessionsWithWatchesCount 中长时间占用 100% 的 CPU。修复方法是避免遍历开销较大的 watcheslist_watches 集合。#56054 (Alexander Gololobov)。
  • 添加设置 optimize_trivial_approximate_count_query,以在 EmbeddedRocksDB 存储中使用 count 近似计数。为 StorageJoin 启用简单计数。#55806 (Duc Canh Le)。

改进

  • 函数 toDayOfWeek(MySQL 别名:DAYOFWEEK)、toYearWeekYEARWEEK)和 toWeekWEEK)现在支持 String 类型参数。这使其行为与 MySQL 保持一致。#55589Robert Schulze)。
  • 引入了 date_time_overflow_behavior 设置,可选值为 ignorethrowsaturate,用于控制在从 Date、Date32、DateTime64、Integer 或 Float 转换为 Date、Date32、DateTime 或 DateTime64 时的溢出处理行为。#55696Andrey Zvonov)。
  • ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType} 实现对查询参数的支持。合并 #49516。关闭 #49449#55604alesapin)。
  • 以更美观的方式在 EXPLAIN 中显示处理器 ID。#48852Vlad Seliverstov)。
  • 在创建 direct dictionary 时指定 lifetime 字段会导致创建被拒绝(因为 lifetime 对 direct dictionary 没有意义)。修复:#27861#49043Rory Crispin)。
  • 允许在包含分区子句的查询中使用参数,例如 ALTER TABLE t DROP PARTITION。修复了 #49449 问题。#49516Nikolay Degterinsky)。
  • system.zookeeper_connection 添加新列 xid#50702 (helifu).
  • 在配置重载后,在 system.server_settings 中显示正确的服务器设置。#53774 (helifu).
  • 在查询中添加对数学减号字符 的支持,其行为与 - 类似。 #54100 (Alexey Milovidov)。
  • 为试验性的 Replicated 数据库引擎添加副本组。关闭了 #53620#54421Nikolay Degterinsky)。
  • 对于可重试的 S3 错误,与其让查询直接失败,不如进行重试。默认将 s3_retry_attempts 设置为更大的值。 #54770 (Sema Checherinda).
  • 新增一种负载均衡模式 hostname_levenshtein_distance#54826 (JackyWoo)。
  • 改进日志中的敏感信息隐藏机制。 #55089 (Vitaly Baranov).
  • 目前投影分析只会基于查询计划执行。query_plan_optimize_projection 设置项已废弃(并且早在很久以前就已默认启用)。#55112 (Nikita Mikhaylov)。
  • 当函数 untuple 在具有命名元素的 tuple 上被调用且自身带有别名时(例如 select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias),结果列名现在由 untuple 的别名和 tuple 元素的别名组合生成(在该示例中为 “untuple_alias.element_alias”)。 #55123 (garcher22)。
  • 新增了设置 describe_include_virtual_columns,允许在 DESCRIBE 查询的结果中包含表的虚拟列。新增了设置 describe_compact_output。如果将其设置为 trueDESCRIBE 查询只返回列的名称和类型,而不包含额外信息。 #55129 (Anton Popov).
  • 有时带有 optimize_throw_if_noop=1OPTIMIZE 可能会以错误 unknown reason 失败,而其真实原因是各个部分的投影不一致。此行为已修复。 #55130 (Nikita Mikhaylov)。
  • 允许针对同一个 Postgres 表创建多个 MaterializedPostgreSQL 表。默认情况下此行为未启用(出于兼容性考虑,因为这是向后不兼容的更改),但可以通过设置 materialized_postgresql_use_unique_replication_consumer_identifier 来启用。解决了 #54918#55145Kseniia Sumarokova)。
  • 允许从短字符串中解析带小数部分的负 DateTime64DateTime 值。#55146 (Andrey Zvonov)。
  • 为提高与 MySQL 的兼容性:1. information_schema.tables 现在包含新字段 table_rows,2. information_schema.columns 现在包含新字段 extra#55215Robert 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_columnsmysql_map_fixed_string_to_text_in_show_columns,用于将类型 StringFixedString 的输出在 TEXTBLOB 之间切换。#55617Serge Klochkov)。
  • 在启动 ReplicatedMergeTree 表时,ClickHouse 服务器会检查本地数据片段集合中是否存在异常片段(仅在本地存在但在 ZooKeeper 中不存在)。所有异常片段都会被移动到 detached 目录中,服务器则尝试用它们的某个祖先(覆盖它们的)片段进行恢复。现在服务器会尝试恢复最近的祖先片段,而不是随机选择任意覆盖片段进行恢复。 #55645 (alesapin).
  • 高级仪表盘现在在触摸设备上也支持拖动图表。此更改解决了 #54206#55649Alexey Milovidov)。
  • 在使用 http_write_exception_in_output_format 输出异常时,如果声明了默认查询格式,则使用该默认查询格式。#55739 (Raúl Marín).
  • 为 MATERIALIZED VIEW 的常见问题提供了更清晰的错误消息。#55826Raúl Marín)。
  • 如果删除了当前数据库,你仍然可以在 clickhouse-local 中运行一些查询并切换到另一个数据库,从而使其行为与 clickhouse-client 保持一致。此更改修复了 #55834#55853Alexey Milovidov)。
  • 函数 (add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond) 现在支持以字符串形式传入日期参数,例如 SELECT addDays('2023-10-22', 1)。这提高了与 MySQL 的兼容性,并且是 Tableau Online 所需的。#55869Robert Schulze)。
  • 禁用 apply_deleted_mask 设置后,可以读取那些被轻量级 DELETE 查询标记为已删除的行。这对于调试非常有用。#55952Alexander 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 所必需的。#55960Robert Schulze)。
  • 允许 CSV 格式中的未加引号字符串包含 CR (\r)。关闭 #39930#56046Kruglov Pavel)。
  • 支持使用内置配置运行 clickhouse-keeper#56086 (Maksim Kita).
  • queued.min.messages 的最大配置值设置上限,以避免在开始从 Kafka 拉取数据时出现问题。#56121 (Stas Morozov).
  • 修复了 SQL 函数 minSampleSizeContinous 中的拼写错误(重命名为 minSampleSizeContinuous)。旧名称仍保留以确保向后兼容性。由此关闭:#56139#56143Dorota Szeremeta)。
  • 在关闭服务器之前,打印出磁盘上损坏分片的路径。之前如果某个分片在磁盘上已损坏且服务器无法启动,几乎无法确定是哪一个分片出了问题。此问题已修复。 #56181 (Duc Canh Le)。

构建/测试/打包改进

  • 如果 Docker 中的数据库已经初始化,在后续启动时就不需要再次初始化。这样可以修复在数据库未能在 1000 次尝试内加载时,容器出现无限重启的问题(与超大数据库和多节点部署相关)。#50724Alexander Nikolaev)。
  • 在 Darwin 的特殊构建任务中,会构建包含子模块在内的源代码资源。它可用于在不检出子模块的情况下构建 ClickHouse。#51435Ilya Yatsishin)。
  • 当在全局启用 AVX 指令集系列(不推荐这样做)来构建 ClickHouse 时,会出现错误。原因是 snappy 未启用 SNAPPY_HAVE_X86_CRC32#55049monchickey)。
  • 解决从 clickhouse-server 包中启动独立 clickhouse-keeper 的问题。#55226Mikhail f. Shiryaev)。
  • 在测试中,将 RabbitMQ 版本更新为 3.12.6。改进了 RabbitMQ 测试的日志收集。#55424Ilya Yatsishin)。
  • 调整 openssl 和 boringssl 之间的错误消息差异,以修复功能测试。#55975MeenaRenganathan22)。
  • 对 apache datasketches 使用上游仓库。#55787Nikita Taranov)。

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 发布 23.9,2023-09-28

向后不兼容的变更

  • 从默认的 Prometheus handler 中移除 status_info 配置选项以及字典状态信息。 #54090 (Alexey Milovidov).
  • 从代码库中移除实验性的 parts 元数据缓存。 #54215 (Alexey Milovidov).
  • 默认不再启用 input_format_json_try_infer_numbers_from_strings 设置,因此在 JSON 格式中将不再尝试从字符串推断数字,以避免在示例数据中包含看起来像数字的字符串时产生潜在的解析错误。 #55099 (Kruglov Pavel).

新功能

  • 改进从 JSON 格式推断表结构的能力:1)现在在 JSON 格式下,通过设置 input_format_json_try_infer_named_tuples_from_objects,可以在无需启用实验性 JSON 类型的情况下,从 JSON 对象中推断具名 Tuple。此前在没有实验性 JSON 类型时,我们只能将 JSON 对象推断为 String 或 Map,现在可以推断为具名 Tuple。最终得到的 Tuple 类型将包含在表结构推断期间、从数据样本中实际读取到的所有对象键。这对于在对象结构较为规整、没有稀疏字段的前提下读取结构化 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,避免在表结构推断时出现错误 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 调度支持。磁盘类型 s3s3_plainhdfsazure_blob_storage 的存储配置现在可以包含 read_resourcewrite_resource 元素,用于指定资源名称。可以在单独的服务器配置部分 resources 中为这些资源配置调度策略。可以通过设置项 workload 为查询打标,并通过服务器配置部分 workload_classifiers 对其进行分类,以实现多样化的资源调度目标。更多详情参见文档#47009Sergei Trifonov)。新增 "bandwidth_limit" IO 调度节点类型。它允许你为通过该节点的流量指定 max_speedmax_burst 约束。#54618Sergei Trifonov)。
  • 新增一种基于 SSH 密钥的身份验证方式。该功能目前仅适用于原生 TCP 协议。#41109 (George Gamezardashvili)。
  • 为 MergeTree 表新增了一列 _block_number#44532#47532SmitaRKulkarni)。
  • DROP TABLE 查询中添加对 IF EMPTY 子句的支持。#48915 (Pavel Novitskiy).
  • SQL 函数 toString(datetime, timezone)formatDateTime(datetime, format, timezone) 现在支持将时区作为非常量参数传入。#53680Yarik Briukhovetskyi)。
  • ALTER TABLE MODIFY COMMENT 添加支持。注意:很久以前一位外部贡献者曾添加过类似的功能,但该功能完全无法工作,只会让用户感到困惑。此更改关闭了 #36377#51304Alexey Milovidov)。注意:该命令不会在副本之间同步,因此同一张表的不同副本上可能存在不同的注释。
  • 新增 GCD(即 “greatest common denominator”,最大公约数)作为一种新的数据压缩 codec。该 codec 会计算所有列值的 GCD,然后将每个值除以该 GCD。GCD codec 是一种数据预处理 codec(类似于 Delta 和 DoubleDelta),无法单独使用。它适用于整数、Decimal 和日期/时间类型的数据。GCD codec 的一个适用场景是:列值以 GCD 的倍数变化(增大或减小),例如 24 - 28 - 16 - 24 - 8 - 24(假设 GCD = 4)。#53149Alexander Nam)。
  • 新增了两个类型别名 DECIMAL(P)(作为 DECIMAL(P, 0) 的简写)和 DECIMAL(作为 DECIMAL(10, 0) 的简写)。这使得 ClickHouse 与 MySQL 的 SQL 方言更加兼容。 #53328 (Val Doroshchuk)。
  • 新增系统日志表 backup_log,用于跟踪所有 BACKUPRESTORE 操作。#53638 (Victor Krasnov).
  • 新增了一个格式设置项 output_format_markdown_escape_special_characters(默认:false)。该设置控制在 Markdown 输出格式中,是否对 !#$ 等特殊字符进行转义(即在前面加上反斜杠)。#53860 (irenjj)。
  • 新增函数 decodeHTMLComponent#54097Bharat Nallan)。
  • query_log 表中新增了 peak_threads_usage#54335Alexey Gerasimchuck)。
  • 为 clickhouse-client 添加对 SHOW FUNCTIONS 的支持。#54337Julia Kartseva)。
  • 新增函数 toDaysSinceYearZero,其别名为 TO_DAYS(用于兼容 MySQL),用于返回自 0001-01-01 起经过的天数(使用前推格里高利历)。#54479Robert Schulze)。函数 toDaysSinceYearZero 现在支持 DateTimeDateTime64 类型的参数。#54856Serge Klochkov)。
  • 新增函数 YYYYMMDDtoDateYYYYMMDDtoDate32YYYYMMDDhhmmssToDateTimeYYYYMMDDhhmmssToDateTime64。它们将以整数编码的日期或日期时间(例如 20230911)转换为原生日期或日期时间。因此,它们与现有函数 YYYYMMDDToDateYYYYMMDDToDateTimeYYYYMMDDhhmmddToDateTimeYYYYMMDDhhmmddToDateTime64 执行相反方向的转换。 #54509 (Quanfa Fu) (Robert Schulze)。
  • 新增多个字符串距离函数,包括 byteHammingDistanceeditDistance#54935 (flynn)。
  • 允许在 VALID UNTIL datetime 子句中为用户凭证指定到期日期,并(可选)指定时间。 #51261 (Nikolay Degterinsky).
  • 允许在表函数 s3gcsoss 中使用 S3 样式的 URL。URL 会自动转换为 HTTP。例如:'s3://clickhouse-public-datasets/hits.csv' 会被转换为 'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'#54931Yarik Briukhovetskyi)。
  • 新增设置项 print_pretty_type_names,用于以更易读的方式打印 Tuple/Map/Array 等深度嵌套类型。#55095 (Kruglov Pavel)。

性能优化

  • 默认启用预取以加速从 S3 读取。#53709Alexey Milovidov)。
  • 对于带 FINAL 的查询,如无必要,不要在孤立部分中隐式读取主键(PK)和 version 列。 #53919 (Duc Canh Le).
  • 优化对常量键的 GROUP BY。在 https://github.com/ClickHouse/ClickHouse/pull/53529 之后,将对按 _file/_path 分组的查询进行优化。#53549Kruglov Pavel)。
  • 优化对 Decimal 列的排序性能。在 ORDER BY 包含 Decimal 列时,优化向 MergeTree 插入数据的性能。当数据已经排好序或接近排好序时,提升排序性能。#35961 (Maksim Kita)。
  • 提升超大查询分析的性能。修复了 #51224#51469frinkr)。
  • 一种优化:当从带有 GROUP BY 的子查询中进行 SELECT 时,将 COUNT(DISTINCT ...) 和各种 uniq 变体重写为 count#52082 #52645 (JackyWoo)。
  • 移除对 mmap/mremap/munmap 的手动调用,将这部分工作全部交由 jemalloc 处理,从而略微提升性能。#52792 (Nikita Taranov)。
  • 修复了在使用 NATS 时 CPU 使用率过高的问题。#54399 (Vasilev Pyotr).
  • 由于我们针对带有 datetime 参数的 toString 使用了单独的实现,因此在处理非 datetime 参数时可以略微提升性能,同时让部分代码更加简洁。这是对 #53680 的后续改进。#54443Yarik Briukhovetskyi)。
  • 这个 PR 不再将 JSON 元素序列化到 std::stringstream 中,而是尝试将序列化结果直接写入 ColumnString#54613 (lgbo)。
  • 当通过视图访问表时,启用 ORDER BY 优化,以便按相应顺序从 MergeTree 表中读取数据。#54628Vitaly Baranov)。
  • 通过复用 GeneratorJSONPath 并移除若干共享指针,对 JSON SQL 函数进行了改进。#54735 (lgbo).
  • Keeper 尝试对请求进行批量刷新以提升性能。#53049 (Antonio Andelic).
  • 现在,clickhouse-client 在使用 INFILE 'glob_expression' 时会并行处理文件。解决了 #54218#54533Max K.)。
  • 允许 IN 函数使用主键,即使主键列类型与 IN 函数右侧的列类型不同。示例:SELECT id FROM test_table WHERE id IN (SELECT '5')。解决 #48936#54544Maksim Kita)。
  • Hash JOIN 现在会尝试收缩内部缓冲区,使其仅消耗最大可用内存(由 max_bytes_in_join 设置)的一半。#54584 (vdimir)。
  • 在执行数组 JOIN 时遵循 max_block_size,以避免可能的 OOM。关闭 #54290#54664李扬)。
  • s3 表函数中复用 HTTP 连接。#54812 (Michael Kolupaev).
  • MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules 中的线性查找替换为二分查找。#54869usurai)。

实验性功能

  • 现在可以通过设置 max_threads_for_annoy_index_creation 来并行创建 Annoy 索引。#54047 (Robert Schulze)。
  • 分布式表上的并行副本不再从所有副本读取数据。#54199 (Igor Nikonov)。

改进

  • 允许将 MergeTree 数据部件中列文件过长的文件名替换为名称的哈希值。这有助于在某些情况下避免出现 File name too long 错误。#50612 (Anton Popov).
  • 当解析元数据失败时,将 JSON 格式的数据按 JSONEachRow 进行解析。这样即使实际格式是 JSONEachRow,也可以读取扩展名为 .json 的文件。修复了问题 #45740#54405Kruglov Pavel)。
  • 在执行 HTTP 查询时如发生异常,将输出有效的 JSON/XML。通过设置 http_write_exception_in_output_format 来启用或禁用此行为(默认启用)。#52853 (Kruglov Pavel)。
  • 视图 information_schema.tables 现在新增了一个字段 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 改进:添加 createIfNotExists Keeper 命令。#48855Konstantin Bogdanov)。
  • 更精确的整数类型推断,修复了 #51236#53003Chen768959)。
  • 在 MaterializedMySQL 中为字符串字面量引入了字符集解析功能。 #53220 (Val Doroshchuk)。
  • 修复一个在极其罕见场景下影响很少使用的 EmbeddedRocksDB 表引擎的细微问题:在执行 DROP TABLE 后,EmbeddedRocksDB 表引擎有时不会在 NFS 上正确关闭文件。#53502Mingliang Pan)。
  • RESTORE TABLE ON CLUSTER 必须在各个主机上创建具有匹配 UUID 的复制表。否则,ZooKeeper 路径中的 {uuid} 宏在 RESTORE 之后将无法正常工作。此 PR 实现了这一点。#53765 (Vitaly Baranov)。
  • 新增恢复设置 restore_broken_parts_as_detached:如果为 true,RESTORE 过程在恢复时遇到损坏的 part 不会停止,而是会将所有损坏的 part 复制到带有前缀 broken-from-backup'detached 目录中。如果为 false,RESTORE 过程会在遇到的第一个损坏的 part(如果存在)时停止。默认值为 false。 #53877 (Vitaly Baranov).
  • elapsed_ns 字段添加到 HTTP 头部 X-ClickHouse-Progress 和 X-ClickHouse-Summary 中。#54179 (joelynch)。
  • 在 keeper-client 中实现 reconfighttps://github.com/ClickHouse/ClickHouse/pull/49450)、syncexists 命令。#54201pufit)。
  • clickhouse-localclickhouse-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)。#54249Robert Schulze)。
  • formatReadableTimeDelta 添加亚秒级精度。#54250 (Andrey Zvonov)。
  • 默认启用 allow_remove_stale_moving_parts#54260 (vdimir)。
  • 修复使用缓存中的计数值的问题,并改进从归档读取时的进度条。#54271 (Kruglov Pavel).
  • 通过 SSO 添加对 S3 凭证的支持。要定义一个与 SSO 一起使用的配置文件,请设置 AWS_PROFILE 环境变量。#54347Antonio Andelic)。
  • 在输入格式中,为嵌套类型 Array/Tuple/Map 支持使用 NULL 作为默认值。修复 #51100#54351Kruglov Pavel)。
  • 允许从 Arrow/Parquet 格式中读取一些非常规配置的数据块。 #54370 (Arthur Passos).
  • stddevPop 函数添加 STD 别名以提高对 MySQL 的兼容性。关闭 #54274#54382Nikolay Degterinsky)。
  • 添加 addDate 函数以兼容 MySQL,并添加 subDate 以保持一致性。参考 #54275#54400Nikolay Degterinsky)。
  • modification_time 添加到 system.detached_parts 中。 #54506 (Azat Khuzhin).
  • 新增了一个设置项 splitby_max_substrings_includes_remaining_string,用于控制当函数 splitBy*() 的参数 max&#95;substring > 0 时,结果数组中是否包含剩余字符串(如有)(即 Python/Spark 语义),或不包含。默认行为不变。#54518 (Robert Schulze)。
  • 改进了对 Int64/UInt64 字段的整数类型推断,这是对 #53003 的延续。现在它也适用于嵌套类型(例如数组的数组)以及 map/tuple 等函数。相关 Issue:#51236#54553Kruglov Pavel)。
  • 新增了数组与标量进行乘法、除法和取模的运算。支持任意方向的写法,例如 5 * [5, 5][5, 5] * 5 都是可行的。#54608 (Yarik Briukhovetskyi)。
  • keeper-clientrm 命令中添加可选的 version 参数,以支持更安全地删除。 #54708 (János Benjamin Antal).
  • 禁止通过 systemd 杀死服务器进程(在使用 Buffer 表时,这可能会导致数据丢失)。 #54744 (Azat Khuzhin).
  • 在系统表 system.functions 中新增字段 is_deterministic,用于指示某个函数在两次调用(在输入完全相同的情况下)之间,其结果是否保持不变。#54766 #55035 (Robert Schulze)。
  • 使 schema information_schema 中的视图与 MySQL 中的对应视图更加兼容(即对其进行了修改和扩展),以便 Tableau Online 能够连接到 ClickHouse。具体包括:1. 将字段 information_schema.tables.table_type 的类型从 Enum8 修改为 String。2. 在视图 information_schema.table 中新增字段 table_commenttable_collation。3. 新增视图 information_schema.key_column_usagereferential_constraints。4. 将 information_schema 视图中的大写别名替换为具体的大写列。 #54773 (Serge Klochkov)。
  • 现在,当用户尝试缓存包含非确定性函数(例如 nowrandomStringdictGet)的查询结果时,查询缓存会返回错误。与之前静默地不缓存结果的行为相比,这样可以减少用户的困惑和意外。#54801Robert Schulze)。
  • 禁止在 file/s3/url/... 等存储中使用 materialized/ephemeral/alias 等特殊列,并修复了从文件插入到 ephemeral 列的问题。关闭 #53477#54803Kruglov Pavel)。
  • 备份元数据收集支持更多配置选项。#54804 (Vitaly Baranov).
  • clickhouse-local 的日志文件(如果通过 --server_logs_file 选项启用)现在会像 clickhouse-server 一样,为每一行加上时间戳、线程 ID 等前缀。#54807Michael Kolupaev)。
  • system.merge_tree_settings 表中的字段 is_obsolete —— 现在对于已废弃的 MergeTree 设置,该字段取值为 1。此前只有说明指出该设置已废弃。#54837 (Robert Schulze)。
  • 允许在使用 interval 字面量时使用复数形式。INTERVAL 2 HOURS 应与 INTERVAL 2 HOUR 等价。#54860 (Jordi Villar)。
  • 现在始终允许在创建 projection 时使用 Nullable 主键。此更改修复了 #54814#54895Amos Bird)。
  • 在因连接重置而失败时重试备份的 S3 操作。#54900Vitaly Baranov)。
  • 当某个设置项的最大值小于最小值时,使异常消息更加精确。 #54925 (János Benjamin Antal).
  • LIKEmatch 以及其他正则表达式匹配函数现在在遇到包含非 UTF-8 子串的模式时会回退到二进制匹配,从而允许使用此类模式进行匹配。例如,可以使用 string LIKE '\xFE\xFF%' 来检测 BOM。修复了 #54486#54942Alexey Milovidov)。
  • 新增了 ContextLockWaitMicroseconds profile event。#55029 (Maksim Kita)。
  • Keeper 会动态调整日志级别。#50372 (helifu)。
  • 新增函数 timestamp 以兼容 MySQL。关闭了 #54275#54639Nikolay 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 对填充是否为必需保持开放态度,但根据具体上下文,这一点可能会导致行为变化,需要留意。 #54119 (Mikhail Koviazin).

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 发行版 23.8 LTS,2023-08-31

向后不兼容的更改

  • 如果动态磁盘配置了名称,应在 disk 函数参数中指定为 disk = disk(name = 'disk_name', ...)。在之前的版本中,可以指定为 disk = disk_<disk_name>(...),该方式现已不再支持。#52820Kseniia Sumarokova)。
  • 当使用 --concurrency 大于 1 调用时,clickhouse-benchmark 将并行建立连接。之前,如果从欧洲向美国发起 1000 个并发连接,它几乎无法使用。现在已修正对高延迟连接的 QPS 计算。向后不兼容更改:移除了 clickhouse-benchmark 的 JSON 输出选项。如果你使用过该选项,可以改为从 system.query_log 中以 JSON 格式提取数据作为替代方案。#53293Alexey Milovidov)。
  • system.text_log 中移除了 microseconds 列,从 system.metric_log 中移除了 milliseconds 列,因为在存在 event_time_microseconds 列的情况下,这些列是冗余的。#53601Alexey Milovidov)。
  • 弃用元数据缓存功能。该功能是实验性的,而且我们从未使用过。该功能存在风险:#51182。移除 system.merge_tree_metadata_cache 系统表。元数据缓存在当前版本中仍然可用,但很快会被移除。由此关闭 #39197#51303Alexey Milovidov)。
  • 在 TLS 连接中禁用对 3DES 的支持。#52893Kenji Noguchi)。

新功能

  • 支持直接从 zip/7z/tar 压缩包导入。例如:file('*.zip :: *.csv')#50321nikitakeba)。
  • trace_type = 'MemorySample'system.trace_log 添加列 ptr。该列包含分配的内存地址。新增函数 flameGraph,可构建用于展示已分配但尚未释放内存的火焰图(flamegraph)。重新实现 #38391#45322 (Nikolai Kochetov)。
  • 新增了表函数 azureBlobStorageCluster。其支持的功能集与表函数 s3Cluster 非常相似。#50795 (SmitaRKulkarni)。
  • 允许在不指定表名的情况下使用 clusterclusterAllReplicasremoteremoteSecure,见 issue #50808#50848Yangkuan Liu)。
  • 一张用于监控 Kafka 消费者的系统表。#50999Ilya Golshtein)。
  • 新增 max_sessions_for_user 设置。#51724Alexey 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,用于显示查询缓存是否被使用以及具体的使用方式。#52384Robert Schulze)。
  • 新增了函数 startsWithUTF8endsWithUTF8#52555 (李扬)。
  • 在 TSV/CustomSeparated/JSONCompactEachRow 中允许列数可变,并使模式推断能够在列数可变的情况下正常工作。新增设置 input_format_tsv_allow_variable_number_of_columnsinput_format_custom_allow_variable_number_of_columnsinput_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 等表函数中的文件。#53209Kruglov Pavel)。
  • 添加 tupleConcat 函数。修复 #52759#53239Nikolay Degterinsky)。
  • 支持 TRUNCATE DATABASE 操作。#53261Bharat Nallan)。
  • 添加 max_threads_for_indexes 设置,用于限制主键处理所使用的线程数量。#53313 (jorisgio)。
  • 重新添加 SipHash 带密钥函数。 #53525 (Salvatore Mesoraca).
  • (#52755 , #52895) 新增了函数 arrayRotateLeftarrayRotateRightarrayShiftLeftarrayShiftRight#53557 (Mikhail Koviazin)。
  • 将列 name 添加到 system.clusters,作为 cluster 的别名。#53605 (irenjj)。
  • 高级仪表板现在支持批量编辑功能(保存/加载)。 #53608 (Alexey Milovidov).
  • 高级仪表盘现在支持将图表最大化并调整其位置。#53622Alexey Milovidov)。
  • 添加了对数组加减运算的支持:[5,2] + [1,7]。由于逐元素乘法与参数的点积(标量积)之间容易混淆,尚未实现除法和乘法。从而关闭了 #49939#52625Yarik Briukhovetskyi)。
  • 添加对将字符串字面量用作表名的支持。修复 #52178#52635hendrik-m)。

实验特性

  • 新增表引擎 S3Queue,用于从 S3 流式导入数据。修复 #37012#49086s-kat)。尚未准备好使用,请勿使用。
  • 启用在分布式表上从副本并行读取。相关 issue:#49708#53005Igor Nikonov)。
  • 为 HNSW 作为近似最近邻搜索方法添加实验性支持。#53447Davit Vardanyan)。当前仅供继续完善该实现的开发者使用,请勿使用。

性能优化

  • Parquet 过滤下推。即在读取 Parquet 文件时,会基于 WHERE 条件以及每一列的最小/最大值跳过部分行组(文件块)。尤其是当文件按某一列大致排序时,对该列上较短范围进行过滤的查询会快得多。 #52951 (Michael Kolupaev).
  • 通过在 Parquet 中将多个小行组批量合并来优化读取小行组的性能。修复了 #53069#53281Kruglov Pavel)。
  • 优化了大多数输入格式下对文件执行 count 计算的性能。关闭 #44334#53637Kruglov Pavel)。
  • 在使用 url/file/hdfs 表函数读取之前,先按文件/路径进行过滤。#53529 (Kruglov Pavel).
  • 为 AArch64、PowerPC、SystemZ 和 RISC-V 启用 JIT 编译。#38217 (Maksim Kita)。
  • 新增设置 rewrite_count_distinct_if_with_count_distinct_implementation,以便使用 count_distinct_implementation 重写 countDistinctIf。关闭 #30642#46051 (flynn)。
  • 在合并前对转换过程进行并行化,以加速 uniquniqExact 聚合函数状态的合并。#50748Jiebin Sun)。
  • 在存在大量可变长度键的场景下,优化可为空字符串键的聚合性能。#51399LiuNeng)。
  • 在 Analyzer 中添加一个用于基于 preimage 的时间过滤优化的 pass。在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上对 SSB 进行的性能实验表明,当启用实验性 Analyzer 时,此更改可使几何平均 QPS(geomean QPS)提升约 8.5%。#52091Zhiguo Zhou)。
  • uniqExact(COUNT DISTINCT)函数中所有哈希集合均为单级时,优化合并过程。#52973 (Jiebin Sun)。
  • Join 表引擎:不再为所有列克隆整个哈希连接数据结构。 #53046 (Duc Canh Le).
  • 实现无需依赖 Apache Arrow 库的原生 ORC 输入格式,以提升性能。 #53324 (李扬)。
  • 该仪表板会指示服务器压缩数据,这在时间范围较长且网络连接较慢的情况下非常有用。比如,一个包含 86400 个点的图表,在未压缩时大小为 1.5 MB,而使用 br 压缩后仅为 60 KB。#53569Alexey Milovidov)。
  • 更高效利用线程池执行 BACKUP 和 RESTORE 操作。#53649 (Nikita Mikhaylov).
  • 在启动时并行加载文件系统缓存元数据。可通过缓存配置项 load_metadata_threads(默认为 1)进行配置。相关问题:#52037#52943Kseniia Sumarokova)。
  • 改进 move_primary_key_columns_to_end_of_prewhere#53337 (Han Fei).
  • 此改动优化了与 ClickHouse Keeper 的交互方式。此前,调用方可能会多次注册相同的 watch 回调。在这种情况下,每个条目都会消耗内存,并且同一个回调会被调用多次,这并没有太大意义。为避免这种情况,调用方需要自行实现逻辑以避免多次添加相同的 watch。通过此更改,如果通过 shared_ptr 传递 watch 回调,则去重会在内部自动完成。#53452Alexander Gololobov)。
  • 对 file/s3/url/hdfs/azure 函数所处理文件的行数进行缓存,用于执行计数操作。可以通过设置 use_cache_for_count_from_files(默认启用)来开启或关闭该缓存。本功能是对 https://github.com/ClickHouse/ClickHouse/pull/53637 的延续。#53692Kruglov Pavel)。
  • 更精细的线程管理可使 S3 表函数在处理大量文件时的速度提升 25% 以上。 #53668 (pufit).

改进

  • 添加 stderr_reaction 配置项,用于控制当外部命令的 stderr 有输出数据时的处理行为(none、log 或 throw)。这有助于简化外部命令的调试。#43210 (Amos Bird)。
  • system part_log 及相应的合并表中添加 partition 列。#48990Jianfei Hu)。
  • (索引)uncompressed/mark、mmap 和 query 缓存的大小现在可以在运行时动态调整(无需重启服务器)。 #51446 (Robert Schulze)。
  • 使用复杂键创建字典时,将自动选择“complex key”布局变体。#49587xiebin)。
  • 添加设置 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" 的连接字符串并不总是以默认终结点开头;同时在将 Azure 容器添加到 URL 后,更新了连接 URL,使其在其中包含 "sas" 令牌。#51141 (SmitaRKulkarni)。
  • 修正 full_sorting_merge JOIN 算法中关于集合过滤的描述。#51329 (Tanay Tummalapalli).
  • 修复了在 max_block_size 非常大时 Aggregator 的内存消耗问题。#51566 (Nikita Taranov).
  • 添加了 SYSTEM SYNC FILESYSTEM CACHE 命令。它会比较文件系统缓存的内存状态与磁盘上的状态,并在必要时纠正内存状态。只有在你对磁盘上的数据进行手动修改时才需要这样做,而这类操作是强烈不推荐的。#51622Kseniia Sumarokova)。
  • 尝试为 ClickHouse 实现一个通用代理解析器,同时保持与现有 S3 存储配置中的代理解析器向后兼容。#51749 (Arthur Passos).
  • 支持在 file/s3/hdfs/url/azureBlobStorage 表函数中读取 tuple 的子列。#51806 (Kruglov Pavel)。
  • 函数 arrayIntersect 现在会按照第一个参数中元素的顺序返回结果。关闭了 #27622#51850Yarik Briukhovetskyi)。
  • 新增查询,可在指定的访问存储中创建/删除访问实体,或在不同的访问存储之间移动访问实体。 #51912 (pufit).
  • 使 ALTER TABLE FREEZE 查询在 Replicated 数据库引擎中不再被复制。#52064 (Mike Kot)。
  • 在发生异常关闭时,支持刷新 system 表。#52174 (Alexey Gerasimchuck)。
  • 修复 s3 表函数无法与预签名 URL 一起使用的问题。关闭 #50846#52310chen)。
  • system.eventssystem.metrics 表中添加列 name,作为 eventmetric 的别名。修复 #51257#52315 (chen)。
  • 在解析器中新增对语法 CREATE UNIQUE INDEX 的支持,作为空操作以提升 SQL 兼容性,但 UNIQUE 索引本身仍不受支持。可将 create_index_ignore_unique 设置为 1,以在查询中忽略 UNIQUE 关键字。#52320Ilya Yatsishin)。
  • 在部分 Kafka 引擎设置项中新增对预定义宏({database}{table})的支持,例如 topic、consumer、client_id 等。#52386Yury Bogomolov)。
  • 在备份/恢复期间禁用对文件系统缓存的更新。备份/恢复期间不应更新文件系统缓存,因为这似乎只会在没有任何收益的情况下拖慢整个过程(因为 BACKUP 命令可能会读取大量数据,把所有数据放入文件系统缓存又立刻将其驱逐毫无意义)。#52402Vitaly Baranov)。
  • S3 endpoint 的配置允许从根路径使用它,并在需要时自动添加“/”。 #47809#52600 (xiaolei565)。
  • 对于 clickhouse-local,允许使用位置参数选项并设置全局 UDF 配置(user_scripts_path 和 user_defined_executable_functions_config)。#52643Yakov Olkhovskiy)。
  • system.asynchronous_metrics 现在包含指标 "QueryCacheEntries" 和 "QueryCacheBytes",用于查看查询缓存。#52650 (Robert Schulze)。
  • 新增支持在 BACKUP 语句的 SETTINGS 子句中使用 s3_storage_class 参数,将备份写入 S3。 #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.tablesinformation_schema.TABLES。提出的解决方案是在小写和大写的 information_schema 数据库中,同时各自复制一份小写和大写的表。#52695Yarik Briukhovetskyi)。
  • CHECK TABLE 查询具有更好的性能和易用性(支持进度更新并可取消)。#52745 (vdimir).
  • 通过将 modulointDivintDivOrZero 按元素应用到元组的各个成员上,为元组添加对这些函数的支持。#52758 (Yakov Olkhovskiy).
  • 在 clickhouse-client 中,在搜索 xml 之后也搜索默认的 yamlyml 配置。#52767Alexey Milovidov)。
  • 当合并到根节点不是 'clickhouse' 的配置时,根节点名称不同的配置会被直接忽略,而不会抛出异常。 #52770 (Yakov Olkhovskiy).
  • 现在可以为通过采样内存分析器跟踪的内存分配指定最小(memory_profiler_sample_min_allocation_size)和最大(memory_profiler_sample_max_allocation_size)大小。#52779alesapin)。
  • 添加 precise_float_parsing 设置,用于在快速/精确两种浮点数解析方法之间切换(fast/precise)。#52791 (Andrey Zvonov)。
  • clickhouse-keeper(符号链接)使用与 clickhouse-keeper(可执行文件)相同的默认路径。 #52861 (Vitaly Baranov)。
  • 改进表函数 remote 的错误信息。关闭 #40220#52959jiyoungyoooo)。
  • RESTORE 查询的 SETTINGS 子句中增加了指定自定义存储策略的功能。#52970 (Victor Krasnov)。
  • 在备份操作中新增了对 S3 请求进行限流的能力(BACKUPRESTORE 命令现在会遵守 s3_max_[get/put]_[rps/burst])。 #52974 (Daniel Pozo Escalona)。
  • 新增设置项,可在管理使用复制存储的用户自定义函数或访问控制实体时,忽略查询中的 ON CLUSTER 子句。 #52975 (Aleksei Filatov).
  • 在 JOIN 步骤中支持 EXPLAIN actions。 #53006 (Maksim Kita).
  • 使 hasTokenOrNullhasTokenCaseInsensitiveOrNullneedle 为空时返回 null。#53059 (ltrk2)。
  • 允许限制文件系统缓存的可用路径,这在动态磁盘场景中尤为有用。如果在服务器配置中指定了 filesystem_caches_path,则所有文件系统缓存的路径都将被限制在该目录中。比如,如果缓存配置中的 path 是相对路径,则会被放入 filesystem_caches_path 中;如果缓存配置中的 path 是绝对路径,则要求其必须位于 filesystem_caches_path 内部。如果在配置中未指定 filesystem_caches_path,则行为将与早期版本相同。#53124Kseniia Sumarokova)。
  • 添加了一系列自定义命令(主要是为了让 ClickHouse 调试更简单)。 #53127 (pufit).
  • 在模式推断时添加包含文件名的诊断信息——在使用 glob 通配符处理多个文件时会很有帮助。#53135 (Alexey Milovidov)。
  • 如果第二连接无法创建会话,客户端将使用主连接加载建议。 #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)。#53285Alexey 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_sasynchronous_heavy_metrics_update_period_s 错误配置为 0,系统现在会优雅地失败,而不是终止应用程序。#53428 (Robert Schulze)。
  • 现在,当重新加载配置时,ClickHouse 服务器会遵守通过 cgroups 修改的内存限制。#53455Robert Schulze)。
  • 新增选项,可在执行 DETACHDROP 或服务器关闭时禁用 Distributed 表的刷新操作。 #53501 (Azat Khuzhin).
  • domainRFC 函数现在支持以方括号形式表示的 IPv6 地址。 #53506 (Chen768959).
  • 将用于备份的 S3 CopyObject 请求的超时时间设置得更长。#53533 (Michael Kolupaev).
  • 新增了服务端设置 aggregate_function_group_array_max_element_size。该设置用于在序列化时限制 groupArray 函数生成的数组大小。默认值为 16777215#53550Nikolai Kochetov)。
  • 为了提高与 MySQL 的兼容性,添加了 SCHEMA 作为 DATABASE 的别名。#53587 (Daniël van Eeden)。
  • system 数据库中的表添加异步指标。例如,TotalBytesOfMergeTreeTablesSystem。此更改关闭了 #53603#53604Alexey Milovidov)。
  • Play UI 和 Dashboard 中的 SQL 编辑器将不再使用 Grammarly。#53614 (Alexey Milovidov)。
  • 作为专家级配置项,现在可以:(1) 配置 [index] 标记/未压缩缓存的 size_ratio(即受保护队列的相对大小),(2) 配置索引标记缓存和索引未压缩缓存的缓存策略。#53657Robert Schulze)。
  • 在 TCPHandler 中为查询数据包添加了客户端信息校验。#53673Alexey Gerasimchuck)。
  • 在与 Microsoft Azure 交互时,如遇网络错误,将重试加载数据分片。 #53750 (SmitaRKulkarni).
  • 为异常提供堆栈跟踪,物化视图中的异常将会被向上传播。 #53766 (Ilya Golshtein).
  • 如果未指定主机名或端口,Keeper 客户端会尝试在 ClickHouse 的 config.xml 中查找连接字符串。#53769 (pufit)。
  • 添加 profile event PartsLockMicroseconds,用于显示在 MergeTree 表引擎系列中持有数据部分锁的时长(微秒)。#53797alesapin)。
  • 使 keeper 中 RAFT 的重连次数限制可配置。通过该配置,如果当前连接中断,可以帮助 keeper 更快地与对等节点重建连接。#53817Pengyuan Bian)。
  • 在表定义中忽略外键以提高与 MySQL 的兼容性,这样用户就不需要重写其 SQL 中的外键部分,参见 #53380#53864jsc0218)。

构建/测试/打包改进

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 23.7 版本发布,2023-07-27

向后不兼容的变更

  • 新增 NAMED COLLECTION 访问类型(别名为 USE NAMED COLLECTIONNAMED COLLECTION USAGE)。此 PR 存在向后不兼容变更,因为该访问类型默认是禁用的(其父访问类型 NAMED COLLECTION ADMIN 也默认被禁用)。在 #50277 中提出。要授予此权限,请使用 GRANT NAMED COLLECTION ON collection_name TO userGRANT NAMED COLLECTION ON * TO user;要能够授予这些权限,需要在配置中启用 named_collection_admin(之前名称为 named_collection_control,因此仍将保留为别名)。#50625Kseniia Sumarokova)。
  • 修复 system.parts 列名 last_removal_attemp_time 中的拼写错误,现在名称为 last_removal_attempt_time#52104filimonov)。
  • 将 distributed_ddl_entry_format_version 的默认值提升到 5(启用 OpenTelemetry 和 initial_query_idd 透传)。这将导致在降级之后无法处理现有的分布式 DDL 条目(但请注意,通常不应存在此类未处理条目)。#52128Azat Khuzhin)。
  • 以与普通元数据相同的方式检查 projection 元数据。若存在带有无效 projection 的表,此更改可能会阻止服务器启动。例如,在主键中创建位置列(positional columns)的 projection(例如 projection p (select * order by 1, 4)),这是在表主键中不允许的,并且可能在插入/合并期间导致崩溃。请在升级前删除此类 projection。修复 #52353#52361Nikolai Kochetov)。
  • 由于存在 bug,移除了实验特性 hashid。该实现从一开始质量就存在疑问,且从未通过实验阶段。由此关闭 #52406#52449Alexey Milovidov)。

新功能

  • 新增 Overlay 数据库引擎,用于将多个数据库合并为一个。新增 Filesystem 数据库引擎,用于将文件系统中的目录表示为一组隐式可用的表,并自动检测其格式和结构。新增 S3 数据库引擎,通过将某个前缀表示为一组表,以只读方式访问 S3 存储。新增 HDFS 数据库引擎,可以相同方式访问 HDFS 存储。#48821 (alekseygolub)。
  • 在 Keeper 中添加对外部磁盘的支持,以用于存储快照和日志。#50098 (Antonio Andelic)。
  • 为多目录选择 ({}) 通配符添加支持。#50559 (Andrey Zvonov)。
  • Kafka 连接器可以使用 URL 编码的凭据进行基本身份验证,从 schema registry 获取 Avro schema。#49664Ilya Golshtein)。
  • 新增函数 arrayJaccardIndex,用于计算两个数组之间的 Jaccard 相似度。 #50076 (FFFFFFFHHHHHHH)。
  • system.settings 及类似的表中添加 is_obsolete 列。修复 #50819#50826flynn)。
  • 实现配置文件中加密元素的支持。新增支持在配置文件的叶子元素中使用加密文本。文本使用 <encryption_codecs> 节中的加密编解码器进行加密。#50986Roman 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 bin 统计信息的系统表 jemalloc_bins。示例:SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10。欢迎使用。#51674 (Alexander Gololobov)。
  • 添加 RowBinaryWithDefaults 格式,在每列之前增加一个额外字节,用作是否使用该列默认值的标志。修复 #50854#51695Kruglov Pavel)。
  • 新增了 default_temporary_table_engine 设置项。与 default_table_engine 相同,但用于临时表。#51292#51708velavokr)。
  • 新增了 initcap / initcapUTF8 函数,将每个单词的首字母转换为大写,其余字母转换为小写。 #51735 (Dmitry Kardymon).
  • CREATE TABLE 语句现在在列定义中支持使用 PRIMARY KEY 语法。各列会按照定义顺序依次加入主索引。 #51881 (Ilya Yatsishin).
  • 在日志和错误日志文件名中新增了对日期和时间格式说明符的支持,可在配置文件(logerrorlog 标签)或命令行参数(--log-file--errorlog-file)中使用。 #51945 (Victor Krasnov).
  • 在 HTTP 头部中新增峰值内存使用统计信息。#51946 (Dmitry Kardymon).
  • 新增 hasSubsequence 函数(以及 CaseInsensitiveUTF8 版本),用于匹配字符串中的子序列。#52050Dmitry Kardymon)。
  • array_agg 添加为 groupArray 的别名,以实现 PostgreSQL 兼容性。解决 #52100。### 用户可见变更的文档条目。#52135 (flynn)。
  • any_value 添加为聚合函数 any 的兼容性别名。关闭 #52140#52147flynn)。
  • 添加聚合函数 array_concat_agg 以实现与 BigQuery 的兼容性,它是 groupArrayArray 的别名。修复 #52139#52149flynn)。
  • OCTET_LENGTH 添加为 length 的别名。关闭了 #52153#52176FFFFFFFHHHHHHH)。
  • 添加了 firstLine 函数,用于从多行字符串中提取第一行。此更改解决了 #51172#52209Mikhail Koviazin)。
  • 实现对 Interval 数据类型的 KQL 风格格式化。此功能仅用于兼容 Kusto 查询语言。#45671 (ltrk2)。
  • 新增查询 SYSTEM FLUSH ASYNC INSERT QUEUE,用于将所有待处理的异步插入刷新到目标表。新增服务器端设置 async_insert_queue_flush_on_shutdown(默认值为 true),用于控制在优雅关闭时是否刷新异步插入队列。async_insert_threads 现在是一个服务器端设置。#49160Anton Popov)。
  • 为兼容 PostgreSQL,新增 current_database 的别名和新的 current_schemas 函数。 #51076 (Pedro Riera).
  • 为函数 today(现在也可以使用名称 curdate/current_date)和 nowcurrent_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.9375,详见 55153。可以通过为 MergeTree 表将 ratio_of_defaults_for_sparse_serialization 设置为 1 来关闭稀疏序列化格式的使用。#49631Alexey Milovidov)。
  • move_all_conditions_to_prewhereenable_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 中等待锁的开销有时可能会比较明显。我们将其拆分为多个子 map(每个都有自己的锁)以避免竞争。#51341Nikita Taranov)。
  • 将包含主键列的条件移动到 PREWHERE 链的末尾。这样做的考虑是,包含主键列的条件很可能会在主键分析中被使用,对 PREWHERE 过滤本身不会带来太多额外收益。 #51958 (Alexander Gololobov).
  • 通过内联 SipHash 加速 String 类型的 COUNT(DISTINCT)。在 ICX 平台(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上对 OnTime 进行的性能实验表明,此更改可以在不影响其他查询的情况下,使查询 Q8 的 QPS 提升 11.6%#52036Zhiguo Zhou)。
  • 默认启用 allow_vertical_merges_from_compact_to_wide_parts。这将减少合并期间的内存使用。#52295 (Alexey Milovidov).
  • 修复了导致主键失效的错误投影分析。该问题仅在 query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1 时存在。本次修复解决了 #48823#51173#52308Amos Bird)。
  • 减少 FileCache::loadMetadata 中的系统调用次数——如果配置了文件系统缓存,这将加快服务器启动速度。 #52435 (Raúl Marín)。
  • 通过在后台下载剩余数据,支持为文件分段大小设置严格的下限。文件分段的最小大小(如果实际文件大小更大)通过缓存配置项 boundary_alignment 配置,默认值为 4Mi。后台线程数通过缓存配置项 background_download_threads 配置,默认值为 2。同时,在此 PR 中将 max_file_segment_size8Mi 增加到 32Mi#51000Kseniia Sumarokova)。
  • 将 S3 的默认超时时间从 30 秒降低到 3 秒,将其他 HTTP 请求的默认超时时间从 180 秒降低到 30 秒。#51171 (Michael Kolupaev)。
  • 新增了设置项 merge_tree_determine_task_size_by_prewhere_columns。如果设置为 true,则在确定读取任务大小时只会考虑 PREWHERE 部分中的列大小;否则将考虑查询中的所有列。#52606Nikita 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/#51293Alexey Milovidov)。
  • 允许通过在配置中新增的 http_forbid_headers 配置段,对 URL/S3 表函数的 HTTP 头部进行过滤。支持精确匹配和正则表达式匹配。#51038Nikolay Degterinsky)。
  • 不再在日志中显示关于 16 EiB 可用空间的消息,因为这些信息没有意义。此更改关闭了 #49320#49342Alexey Milovidov)。
  • 完善对 sleepEachRow 函数限制的检查。新增设置项 function_sleep_max_microseconds_per_block。这是通用查询模糊测试工具所需要的。#49343 (Alexey Milovidov).
  • 修复 geoHash 函数的两个问题。 #50066 (李扬).
  • 将异步插入的 flush 查询记录到 system.query_log 中。#51160 (Raúl Marín).
  • 函数 date_diffage 现在支持毫秒/微秒时间单位,并支持微秒级精度。 #51291 (Dmitry Kardymon).
  • 优化 clickhouse-keeper-client 中路径解析。 #51359 (Azat Khuzhin).
  • 一个依赖于 ClickHouse 的第三方产品(Gluten:一个可将 Spark SQL 性能提升一倍的插件)存在一个缺陷。此修复可以避免该第三方产品在从 HDFS 读取时发生堆溢出。#51386 (李扬)。
  • 新增可禁用 S3 原生拷贝的功能(BACKUP/RESTORE 使用设置 allow_s3_native_copys3/s3_plain 磁盘使用 s3_allow_native_copy)。 #51448 (Azat Khuzhin)。
  • system.parts 表中新增列 primary_key_size,以显示磁盘上压缩后的主键大小。关闭了 #51400#51496Yarik Briukhovetskyi)。
  • 允许在没有 procfs、没有家目录,以及没有使用 glibc 名称解析插件的情况下运行 clickhouse-local#51518 (Alexey Milovidov)。
  • 在 rename_files_after_processing 设置中新增占位符 %a,用于表示完整文件名。#51603 (Kruglov Pavel)。
  • 将列 modification_time 添加到 system.parts_columns 中。 #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)。
  • range 函数新增对 Nullable 参数的支持。#51767 (Dmitry Kardymon)。
  • 将类似 toyear(x) = c 的条件重写为 c1 <= x < c2#51795Han Fei)。
  • 提高 SHOW INDEX 语句的 MySQL 兼容性。#51796Robert Schulze)。
  • 修复 use_structure_from_insertion_table_in_table_functions 在包含 MATERIALIZEDALIAS 列时无法工作的问题。修复了 #51817。修复了 #51019#51825flynn)。
  • 缓存字典现在仅从源请求唯一键。修复了 #51762#51853 (Maksim Kita)。
  • 修复了当指定 FORMAT 时,EXPLAIN 查询未应用设置的情况。#51859Nikita Taranov)。
  • 在 DESCRIBE TABLE 查询中允许在 FORMAT 之前使用 SETTINGS,以与 SELECT 查询保持兼容。修复了 #51544#51899Nikolay Degterinsky)。
  • VarInt 编码的整数(例如原生协议中使用的)现在可以使用完整的 64 位范围。建议第三方客户端相应地更新其 VarInt 相关代码。#51905Robert Schulze)。
  • 在证书变更时自动更新证书,而无需手动执行 SYSTEM RELOAD CONFIG。 #52030 (Mike Kot).
  • 新增了 allow_create_index_without_type 设置,允许忽略未指定 TYPEADD INDEX 查询。标准 SQL 查询将会直接成功执行,并且不会修改表结构。#52056Ilya Yatsishin)。
  • 从服务器启动时起,日志消息就会被写入到 system.text_log 中。#52113Dmitry Kardymon)。
  • 当 HTTP 端点具有多个 IP 地址且第一个地址不可达时,会抛出超时异常。现已改进会话创建逻辑,以处理所有解析得到的端点。#52116Aleksei Filatov)。
  • Avro 输入格式现在即使只包含单一类型也支持 Union。修复了 #52131#52137flynn)。
  • 添加 optimize_use_implicit_projections 设置以禁用隐式 projection(目前仅有 min_max_count projection)。 #52152 (Amos Bird)。
  • 此前可以利用函数 hasToken 构造无限循环。现已移除这种可能性,从而关闭了 #52156#52160Alexey Milovidov)。
  • 乐观地创建 ZK 祖先节点。 #52195 (Raúl Marín).
  • 修复 #50582。在某些顺序读取及涉及常量的读取场景中,避免出现 Not found column ... in block 错误。#52259Chen768959)。
  • 在 ClickHouse 端尽早检查 S2 地理基元是否无效。已关闭:#27090#52260Nikita Mikhaylov)。
  • query_plan_optimize_projection = 1 时补充缺失的投影 QueryAccessInfo。修复了 #50183。修复了 #50093#52327Amos 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)。
  • session_timezone 设置(在 23.6 版本中新增)降级为实验性设置。#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).

错误修复(官方稳定版本中用户可见的异常行为)

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_sizehttp_max_field_name_size 的默认值降低为 128 KiB。#51163 (Mikhail f. Shiryaev).
  • 将与 CPU 相关的 CGroups 指标合并为一个指标 CGroupMaxCPU,以提高可用性。当设置了 CGroups 限制时,Normalized CPU 使用率指标将相对于 CGroups 限制进行归一化,而不是相对于 CPU 总数。这解决了 #50836#50835 (Alexey Milovidov).

新功能

  • 函数 transform 以及按值匹配的 CASE 现在支持所有数据类型。修复了 #29730#32387#50827#31336#40493#51351Alexey Milovidov)。
  • 新增选项 --rename_files_after_processing <pattern>。修复了 #34207#49626alekseygolub)。
  • INTO OUTFILE 子句新增对 TRUNCATE 修饰符的支持。建议在文件已存在时,对 INTO OUTFILE 使用 APPENDTRUNCATE#50950alekar)。
  • 新增表引擎 Redis 和表函数 redis,用于查询外部 Redis 服务器。#50150JackyWoo)。
  • 通过设置 s3_skip_empty_fileshdfs_skip_empty_filesengine_file_skip_empty_filesengine_url_skip_empty_files,允许在 file/S3/url/HDFS 表函数中跳过空文件。#50364Kruglov Pavel)。
  • 新增名为 use_mysql_types_in_show_columns 的设置,用于修改 SHOW COLUMNS SQL 语句,从而在客户端通过 MySQL 兼容端口连接时显示等价的 MySQL 类型。#49577Thomas Panetti)。
  • clickhouse-client 现在可以使用连接字符串来调用,而无需再使用 --host--port--user 等参数。#50689Alexey Gerasimchuck)。
  • 新增设置 session_timezone;当未显式指定时,它将作为会话的默认时区使用。#44149Andrey Zvonov)。
  • 现在通过服务器设置 enable_deflate_qpl_codec(默认值:false)来控制编解码器 DEFLATE_QPL,而不再使用 allow_experimental_codecs 设置。这表明 DEFLATE_QPL 不再是实验特性。#50775Robert Schulze)。

性能改进

  • 改进了在 ReplicatedMergeTree 中选择合并和清理任务的调度。当没有需要合并或清理的内容时,这些任务不会被过于频繁地执行。新增设置 max_merge_selecting_sleep_msmerge_selecting_sleep_slowdown_factormax_cleanup_delay_periodcleanup_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).
  • 对仅包含一个数据块的物化视图和存储禁用 parallelize_output_from_storages#50214 (Azat Khuzhin).
  • 合并 PR #46558。如果数据块已经排好序,则在排序过程中避免对数据块进行重新排列。#50697 (Alexey Milovidov, Maksim Kita).
  • 并行向 ZooKeeper 发起多个 list 请求,加快从 system.zookeeper 表中读取的速度。#51042 (Alexander Gololobov).
  • 加速为时区初始化 DateTime 查找表。这应当会缩短 clickhouse-client 的启动/连接时间,尤其是在调试构建中,因为它的开销较大。#51347 (Alexander Gololobov).
  • 修复由于同步 HEAD 请求导致的数据湖变慢问题(与 Iceberg/Delta Lake/Hudi 在文件数量较多时变慢相关)。#50976 (Kseniia Sumarokova).
  • 避免从右侧 GLOBAL JOIN 表中读取所有列。#50721 (Nikolai Kochetov).

实验特性

  • 支持在分析器中使用并行副本(parallel replicas)。#50441 (Raúl Marín).
  • 在执行大型合并/变更操作之前添加随机休眠时间,以便在零拷贝复制场景下在副本之间更均匀地分摊负载。#51282 (alesapin).
  • 对于仅有一个分片且底层表为 ReplicatedMergeTreeReplicated 数据库,不再通过该数据库复制 ALTER PARTITION 查询和变更操作。#51049 (Alexander Tokmakov).

改进

  • 放宽 “too many parts” 阈值,使其更符合当前需求。在长时间运行的插入查询中恢复背压机制。#50856 (Alexey Milovidov)。
  • 允许将属于 CIDR ::ffff:0:0/96(IPv4 映射地址)的 IPv6 地址转换为 IPv4 地址。 #49759 (Yakov Olkhovskiy).
  • 更新 MongoDB 协议以支持 MongoDB 5.1 及更高版本,同时保留对使用旧协议(<3.6)版本的支持。关闭 #45621#49879#50061Nikolay Degterinsky)。
  • 添加设置 input_format_max_bytes_to_read_for_schema_inference,用于限制模式推断时可读取的最大字节数。修复 #50577#50592Kruglov Pavel)。
  • 在模式推断时遵循 input_format_null_as_default 设置。#50602 (Kruglov Pavel)。
  • 通过设置 input_format_csv_skip_trailing_empty_linesinput_format_tsv_skip_trailing_empty_linesinput_format_custom_skip_trailing_empty_lines,可以在 CSV/TSV/CustomSeparated 格式中跳过末尾的空行(默认关闭)。修复了 #49315#50635Kruglov Pavel)。
  • 函数 "toDateOrDefault|OrNull" 和 "accuateCast[OrDefault|OrNull]" 现在可以正确解析数值型参数。#50709 (Dmitry Kardymon)。
  • 支持使用空白字符或 \t 作为 CSV 字段分隔符,并且这些分隔符在 Spark 中也受支持。 #50712 (KevinyhZou).
  • 现在,number_of_mutations_to_delaynumber_of_mutations_to_throw 两个设置现已默认启用,默认值分别为 500 和 1000。#50726 (Anton Popov)。
  • 仪表板现在能够正确显示缺失值,从而关闭了 #50831#50832Alexey Milovidov)。
  • 在函数 parseDateTimeBestEffort*parseDateTime64BestEffort* 中,新增了在 syslog 时间戳格式中支持使用日期和时间参数的功能。 #50925 (Victor Krasnov).
  • clickhouse-client 中的命令行参数 --password 现在只能指定一次。#50966 (Alexey Gerasimchuck)。
  • 在集群内备份时,使用 system.parts 中的 hash_of_all_files 来检查各个 part 的标识。 #50997 (Vitaly Baranov)。
  • 系统表 zookeeper_connection 中的 connected_time 表示连接建立的时间(标准格式),并新增了 session_uptime_elapsed_seconds,用于表示已建立连接会话的持续时间(以秒为单位)。 #51026 (郭小龙).
  • 通过根据源数据的块大小(chunk size)并在每个线程中按增量方式统计总大小,改进 file/s3/hdfs/url 表函数的进度条。修复 *Cluster 函数的进度条。此更改关闭了 #47250#51088Kruglov Pavel)。
  • 在 TCP 协议中的 Progress 数据包中添加 total_bytes_to_read,以改进进度条显示。#51158 (Kruglov Pavel)。
  • 改进了在启用文件系统缓存的磁盘上对数据部件的校验。#51164 (Anton Popov).
  • 修复 fs 缓存中 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 版本以修复 golang 漏洞。 #51504 (Mikhail f. Shiryaev).

Bug 修复(在官方稳定版本中对用户可见的异常行为)

ClickHouse 版本 23.5,2023-06-08

升级说明

  • 默认压缩 marks 和主键。这可以显著减少冷查询时间。升级说明:对压缩 marks 和主键的支持是在 22.9 版本中添加的。如果你已经开启了压缩 marks 或主键,或者安装了 23.5 或更新版本(这些版本默认开启压缩 marks 和主键),则将无法降级到 22.8 或更早的版本。你也可以在服务器配置文件的 <merge_tree> 部分通过指定 compress_markscompress_primary_key 设置,显式关闭压缩 marks 或主键。升级说明: 如果你是从 22.9 之前的版本升级,则应当在升级时一次性升级所有副本,或者在升级前禁用压缩,或者先升级到一个中间版本(该版本支持压缩 marks 但默认未启用),例如 23.3。 #42587 (Alexey Milovidov).
  • 使本地对象存储与 S3 对象存储行为保持一致,修复追加写入的问题(修复 #48465),并使其可以作为独立存储进行配置。该变更不向后兼容,因为本地对象存储之上的缓存与之前的版本不兼容。#48791 (Kseniia Sumarokova).
  • 移除实验特性 “in-memory data parts”。数据格式仍然受支持,但相关设置不再生效,将改用 compact 或 wide parts。这解决了 #45409#49429 (Alexey Milovidov).
  • 修改设置 parallelize_output_from_storagesinput_format_parquet_preserve_order 的默认值。这允许 ClickHouse 在从文件(例如 CSV 或 Parquet)读取时重新排序行,在很多情况下可以大幅提升性能。要恢复保持顺序的旧行为,请使用 parallelize_output_from_storages = 0input_format_parquet_preserve_order = 1#49479 (Michael Kolupaev).
  • 使投影(projection)达到生产可用状态。新增 optimize_use_projections 设置,用于控制在 SELECT 查询中是否使用投影。设置 allow_experimental_projection_optimization 已废弃且不再生效。#49719 (Alexey Milovidov).
  • joinGet 标记为非确定性(dictGet 同样如此)。这允许在变更(mutation)中使用它们而无需额外设置。#49843 (Azat Khuzhin).
  • 回滚 “groupArray 的返回值不能为 Nullable” 的修改(因为对于 Nullable 类型上的 groupArray/groupArrayLast/groupArraySample 会破坏二进制兼容性,很可能导致 TOO_LARGE_ARRAY_SIZECANNOT_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 命令行客户端,可通过 clickhouse keeper-client 使用 #47414 (pufit).
  • 添加 urlCluster 表函数。重构所有 *Cluster 表函数以减少代码重复。使模式推断适用于所有可能的 *Cluster 函数签名和命名集合。关闭 #38499#45427attack204)、Pavel Kruglov。
  • 查询缓存现在可以用于生产环境工作负载。#47977 (Robert Schulze)。查询缓存现在可以支持带有 totalsextremes 修饰符的查询。#48853 (Robert Schulze)。将 allow_experimental_query_cache 设置标记为弃用以保持向后兼容。它已在 https://github.com/ClickHouse/ClickHouse/pull/47977 中移除。#49934 (Timur Solodovnikov)。
  • 地理数据类型(PointRingPolygonMultiPolygon)已可用于生产环境。#50022Alexey Milovidov)。
  • 为 PostgreSQL、MySQL、MeiliSearch 和 SQLite 表引擎添加模式推断。解决了 #49972#50000Nikolay Degterinsky)。
  • CREATE USER u IDENTIFIED BY 'p' 这类查询中,密码类型将会根据服务器上 config.xml 中的 default_password_type 设置自动确定。关闭了 #42915#44674 (Nikolay Degterinsky)。
  • 新增 bcrypt 密码身份验证类型。关闭 #34599#44905Nikolay Degterinsky)。
  • 新增关键字 INTO OUTFILE 'file.txt' APPEND#48880 (alekar)。
  • 新增了 system.zookeeper_connection 表,用于显示 Keeper 连接相关信息。#45245 (mateng915).
  • 新增函数 generateRandomStructure,用于随机生成表结构。它可以与表函数 generateRandom 搭配使用。#47409 (Kruglov Pavel)。
  • 允许在没有 ELSE 分支的情况下使用 CASE,并扩展 transform() 以处理更多类型。同时修复了一些问题:在 decimal 类型与其他数值类型混用时会导致 transform() 返回错误结果。#48300Salvatore Mesoraca)。此更改关闭了 #2655。此更改关闭了 #9596。此更改关闭了 #38666。
  • 为 S3 表添加了使用 KMS 密钥的服务端加密,并为 S3 磁盘添加了 header 设置。关闭了 #48723 问题。#48724Johann Gan)。
  • 为后台任务(合并和变更)添加 MemoryTracker。引入了 merges_mutations_memory_usage_soft_limitmerges_mutations_memory_usage_to_ram_ratio 设置,用于指定合并和变更的软性内存限制。如果达到该限制,ClickHouse 将不会调度新的合并或变更任务。同时引入了 MergesMutationsMemoryTracking 指标,用于监控后台任务当前的内存使用情况。重新提交 #46089。关闭 #48774#48787Dmitry Novik)。
  • 函数 dotProduct 现在可用于数组。 #49050 (FFFFFFFHHHHHHH).
  • 支持 SHOW INDEX 语句,以提高与 MySQL 的兼容性。#49158 (Robert Schulze)。
  • 为表函数 url 添加对虚拟列 _file_path 的支持。- 改进表函数 url 的错误信息。- 修复 #49231 - 修复 #49232#49356 (Ziyi Tan)。
  • 在 users.xml 文件中添加 grants 字段,用于为用户指定权限。#49381pufit)。
  • 通过使用 Grace 哈希连接算法支持 FULL/RIGHT JOIN。 #49483 (lgbo).
  • WITH FILL 修饰符会按排序前缀分组进行填充。通过 use_with_fill_by_sorting_prefix 设置进行控制(默认启用)。相关讨论:#33203#issuecomment-1418736794。#49503Igor Nikonov)。
  • 当未指定 "--query"(或 "-q")时,clickhouse-client 现在可以在 "--multiquery" 之后直接接受查询。例如:clickhouse-client --multiquery "select 1; select 2;"。#49870 (Alexey Gerasimchuk)。
  • 为从副本接收 Hello 数据包添加了单独的 handshake_timeout。修复了 #48854#49948Kruglov Pavel)。
  • 添加了一个名为 "space" 的函数,用于返回由指定次数空格字符组成的字符串。#50103 (Robert Schulze)。
  • 新增 --input_format_csv_trim_whitespaces 选项。#50215Alexey Gerasimchuk)。
  • 允许在正则表达式树(regexp tree)字典中,dictGetAll 函数将多个匹配的值以数组形式返回。关闭 #50254#50255Johann Gan)。
  • 新增 toLastDayOfWeek 函数,用于将日期或带时间的日期向后取整到最近的星期六或星期日。#50315Victor Krasnov)。
  • 支持通过指定 ignore_data_skipping_indices 来忽略数据跳过索引。#50329 (Boris Kuschel)。
  • 添加 system.user_processes 表和 SHOW USER PROCESSES 查询,用于在用户级别显示内存信息和 ProfileEvents。#50492 (János Benjamin Antal)。
  • 添加服务器和格式设置 display_secrets_in_show_and_select,用于显示表、数据库、表函数和字典的机密信息。新增权限 displaySecretsInShowAndSelect,用于控制哪些用户可以查看机密信息。 #46528 (Mike Kot).
  • 允许为某个数据库中的所有表设置行策略(ROW POLICY)。#47640 (Ilya Golshtein)。

性能优化

  • 默认压缩 marks 和 primary key,可显著减少冷查询时间。升级说明:对压缩 marks 和 primary key 的支持在 22.9 版本中引入。如果您启用了压缩 marks 或 primary key,或者安装了 23.5 或更新的版本(这些版本默认启用压缩 marks 和 primary key),则将无法降级到 22.8 或更早的版本。您也可以在服务器配置文件的 <merge_tree> 部分,通过指定 compress_markscompress_primary_key 设置,显式禁用压缩 marks 或 primary key。#42587Alexey Milovidov)。
  • 新增设置项 s3_max_inflight_parts_for_one_file 用于限制针对同一文件,通过分片(multipart)上传请求并发加载的分片数量上限。 #49961 (Sema Checherinda).
  • 在读取多个文件时,减少每个文件的并行解析线程数。解决了 #42192#46661SmitaRKulkarni)。
  • 仅在聚合投影读取的 granule 数量少于正常读取时才使用聚合投影。这在查询命中表的主键(PK)但未命中投影时会有所帮助。修复了 #49150#49417Nikolai Kochetov)。
  • 如果没有插入任何数据,则不要在 ANY 哈希连接中存储数据块。#48633 (vdimir)。
  • 修复了在进行 JIT 编译时的聚合组合器 -If 问题,并为聚合函数启用 JIT 编译。解决 #48120#49083Igor Nikonov)。
  • 对于从远程表读取,我们使用粒度更小的任务(而不是一次读取整个 part),以便任务窃取机制能够更好地发挥作用;任务大小由要读取的列的数据量决定;从 S3 读取时始终使用 1 MB 的缓冲区;缓存段的边界按 1 MB 对齐,这样即使在小任务场景下也能保持合适的大小,同时还能防止碎片化。#49287Nikita Taranov)。
  • 新增了以下设置:- merge_max_block_size_bytes 用于限制后台操作的内存使用量。- vertical_merge_algorithm_min_bytes_to_activate 用于为激活纵向合并添加另一条条件。 #49313 (Nikita Mikhaylov)。
  • 从本地文件系统读取时的读取缓冲区默认大小调整为更合适的数值。同时引入了两个新的设置项:max_read_buffer_size_local_fsmax_read_buffer_size_remote_fs#49321 (Nikita Taranov)。
  • 改进 SPARSE_HASHED/HASHED 字典的内存占用和性能(例如,SPARSE_HASHED 现在的内存占用减少了 2.6 倍,且速度提升约 2 倍)。 #49380 (Azat Khuzhin)。
  • 在合适的情况下为 system.query_logsystem.query_thread_log 表应用 LowCardinality 以进行优化,从而加快对这些表的查询。#49530Alexey Milovidov)。
  • 通过并行读取提升本地 Parquet 文件的读取性能。#49539Michael Kolupaev)。
  • 在某些场景下,将 RIGHT/FULL JOIN 的性能提升最多 2 倍,尤其是在将一个较小的左表与一个较大的右表进行连接时。#49585 (lgbo)。
  • 通过为 Rust 启用 LTO,将 BLAKE3 性能提升了 11%。#49600 (Azat Khuzhin)。现在它的性能已经与 C++ 相当。
  • 优化 system.opentelemetry_span_log 的结构。在合适的地方使用 LowCardinality。虽然这个表整体设计得有点糟糕(甚至对常见属性也使用 Map 数据类型),但这样会稍微好一些。#49647Alexey Milovidov)。
  • 尝试在 grace_hash join 中预先保留哈希表的容量。 #49816 (lgbo)。
  • uniqExactIf 状态进行并行合并。修复 #49885#50285flynn)。
  • Keeper 改进:向 Keeper 添加 CheckNotExists 请求,可提升 Replicated 表的性能。#48897Antonio Andelic)。
  • Keeper 性能优化:在处理过程中避免对同一请求进行两次序列化,并缓存大型请求的反序列化结果。由新的协调设置 min_request_size_for_cache 控制。#49004 (Antonio Andelic)。
  • 在选择要合并的数据片段时,如果许多分区没有可合并的内容,则减少对 ZooKeeper 发送的 List 请求数量。 #49637 (Alexander Tokmakov).
  • 重构 FS 缓存中的锁机制 #44985 (Kseniia Sumarokova).
  • 当可以进行简单的 count 查询优化时,禁用纯并行副本。#50594Raúl Marín)。
  • 不要在 Iceberg schema 推断中为所有键发送 HEAD 请求,只为用于读取数据的键发送。 #50203 (Kruglov Pavel)。
  • enable_memory_bound_merging_of_aggregation_results 设置项默认启用。#50319Nikita Taranov)。

实验性特性

  • DEFLATE_QPL 编解码器将所需的最低 SIMD 版本降低到 SSE 4.2。qpl 文档变更——Intel® QPL 依赖运行时内核调度器和 CPUID 检查来选择最佳可用实现(SSE/AVX2/AVX512)——在 ClickHouse 中重构了用于构建 qpl 的 CMake 文件,以与上游最新的 qpl 对齐。#49811 (jasperzhu)。
  • 增加了对仅使用纯并行副本执行 JOIN 的初始支持。#49544 (Raúl Marín)。
  • 在使用“零拷贝复制”时,对清理 Outdated 数据部分提供了更高的并行度。#49630 (Alexander Tokmakov)。
  • 并行副本:1)修复了在对非复制存储并禁用了 parallel_replicas_for_non_replicated_merge_tree 设置时使用并行副本会出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。2)现在 allow_experimental_parallel_reading_from_replicas 有 3 个可能值——0、1 和 2。0 - 禁用;1 - 启用,在失败时静默禁用并行副本(在 FINAL 或 JOIN 的情况下);2 - 启用,在失败时抛出异常。3)如果在 SELECT 查询中使用了 FINAL 修饰符并启用了并行副本,当 allow_experimental_parallel_reading_from_replicas 设置为 1 时,ClickHouse 将尝试禁用并行副本,否则将抛出异常。#50195 (Nikita Mikhaylov)。
  • 启用并行副本时,将始终跳过不可用的服务器(该行为由 skip_unavailable_shards 设置控制,默认启用且只能关闭)。修复了此问题:#48565#50293 (Nikita Mikhaylov)。

改进

  • BACKUP 命令在创建备份时不会解密加密磁盘上的数据,而是会将这些数据以加密形式保存在备份中。此类备份只能恢复到具有相同(或扩展)加密密钥列表的加密磁盘上。#48896Vitaly Baranov)。
  • 新增支持在 ATTACH PARTITION FROM 和 REPLACE PARTITION FROM 语句的 FROM 子句中使用临时表。#49436 (Roman Vasin).
  • MergeTree 表新增了 async_insert 设置。它与查询级别设置 async_insert 含义相同,用于为特定表启用异步插入。注意:对通过 clickhouse-client 执行的插入查询无效,在这种情况下请使用查询级别设置。#49122 (Anton Popov).
  • 在创建配额语句的参数中新增对大小后缀的支持。#49087 (Eridanus).
  • 扩展 first_valuelast_value,使其支持 NULL。#46467 (lgbo)。
  • extractKeyValuePairs 添加别名 str_to_mapmapFromString,并关闭 https://github.com/clickhouse/clickhouse/issues/47185#49466flynn)。
  • 为与内存使用和可用情况相关的异步指标添加了对 CGroup version 2 的支持。此更改关闭了 #37983#45999sichenzhao)。
  • Cluster 表函数应始终跳过不可用的分片。关闭 #46314#46765zk_kiger)。
  • 允许 CSV 文件的表头中出现空列名。#47496 (你不要过来啊).
  • 新增 S3 兼容的 Google Cloud Storage 表函数 gcs。与 osscosn 函数类似,它只是 s3 表函数的一个别名,并未引入任何新特性。#47815 (Kuba Kaflik)。
  • 为 S3 新增对严格分块大小的支持(兼容 CloudFlare R2 S3 存储)。 #48492 (Azat Khuzhin).
  • system.clusters 中新增了关于 Replicated 数据库副本信息的新列:database_shard_namedatabase_replica_nameis_active。为 SYSTEM DROP DATABASE REPLICA 查询新增了可选的 FROM SHARD 子句。#48548Alexander Tokmakov)。
  • 在 system.replicas 表中新增列 zookeeper_name,用于指示复制表的元数据存储在哪个(辅助)Zookeeper 集群上。#48549 (cangyin)。
  • IN 运算符现已支持比较 DateDate32。修复 #48736#48806flynn)。
  • HDFS 增加对擦除码的支持,作者:@M1eyu2018、@tomscut。 #48833 (M1eyu)。
  • 实现从辅助 ZooKeeper 集群执行 SYSTEM DROP REPLICA,可能可以关闭 #48931#48932wangxiaobo)。
  • 为 MongoDB 添加对 Array 数据类型的支持。关闭 #48598#48983Nikolay Degterinsky)。
  • 支持在表中存储 Interval 数据类型。 #49085 (larryluogit).
  • 允许在未显式指定窗口框架的情况下使用 ntile 窗口函数:ntile(3) OVER (ORDER BY a),关闭 #46763#49093vdimir)。
  • 新增了设置项(number_of_mutations_to_delaynumber_of_mutations_to_throw),用于在数据表已经存在大量未完成 mutation 时,对会创建 mutation 的 ALTER 查询(ALTER UPDATEALTER DELETEALTER MODIFY COLUMN 等)进行延迟处理或直接抛出异常。 #49117 (Anton Popov).
  • 在 filesystem cache 中捕获由 create_directories 抛出的异常。#49203Kseniia 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)。
  • kolmogorovSmirnovTestasymp 计算方法添加了别名 asymptotic。改进了文档。#49286 (Nikita Mikhaylov).
  • 聚合函数 groupBitAnd/Or/Xor 现在可以处理有符号整数数据,使其与标量函数 bitAnd/Or/Xor 的行为保持一致。#49292 (exmy)。
  • 将函数文档拆分为更细粒度的字段。 #49300 (Robert Schulze)
  • 在服务器内所有表之间共享多个线程,用于加载过期的数据部件。该线程池及其队列的大小由 max_outdated_parts_loading_thread_pool_sizeoutdated_part_loading_thread_pool_queue_size 设置进行控制。#49317Nikita Mikhaylov)。
  • LowCardinality 列在多个数据块之间共享字典时,不要高估处理数据的大小。这个改动关闭了 #49322。另见 #48745#49323Alexey Milovidov)。
  • 通过 OUTFILE 使用时,Parquet 写入器现在会采用合理的行组大小。#49325 (Michael Kolupaev)。
  • 如果为别名加上引号,则允许将 ARRAY 等受限关键字用作别名。关闭 #49324#49360Nikolay Degterinsky)。
  • 数据部件的加载和删除作业已从表级线程池迁移到服务器级共享线程池。线程池大小通过顶层配置中的设置 max_active_parts_loading_thread_pool_sizemax_outdated_parts_loading_thread_pool_sizemax_parts_cleaning_thread_pool_size 进行控制。表级设置 max_part_loading_threadsmax_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 的后续更新。#49561Dmitry Novik)。
  • 函数 "makeDate" 现在提供了一个接受“年份” & “一年中的第几天”参数的、与 MySQL 兼容的重载。#49603 (Robert Schulze)。
  • RegExpTreeDictionary 添加对 dictionary 表函数的支持。 #49666 (Han Fei).
  • 添加了加权公平 IO 调度策略。新增动态资源管理器,允许在运行时更新 IO 调度层级,而无需重启服务器。#49671 (Sergei Trifonov)。
  • 在分片上传到 GCS 完成后添加 compose 请求。这样可以对通过 multipart upload 上传的对象使用复制操作。建议将 s3_strict_upload_part_size 设置为一个明确的值,因为对由不同大小的分片创建的对象执行 compose 请求时可能会失败。#49693 (Antonio Andelic).
  • 对于 extractKeyValuePairs 函数:改进“尽力而为”式的解析逻辑,使其接受 key_value_delimiter 作为值的有效组成部分。这也简化了分支逻辑,并且可能略微提升性能。#49760 (Arthur Passos)。
  • system.processors_profile_log 添加了 initial_query_id 字段 #49777 (helifu).
  • 系统日志表现在可以使用自定义排序键。#49778helifu)。
  • system.query_log 中新增了字段 partitions,用于指示参与计算的分区。#49779helifu)。
  • ReplicatedMergeTree 新增了 enable_the_endpoint_id_with_zookeeper_name_prefix 设置(默认禁用)。启用后,会将 ZooKeeper 集群名称添加到表的服务器间通信端点中。这样在存在具有相同路径但使用不同辅助 ZooKeeper 的复制表时,可以避免出现 Duplicate interserver IO endpoint 错误。#49780 (helifu)。
  • clickhouse-local 添加查询参数。关闭 #46561#49785Nikolay Degterinsky)。
  • 现在默认允许从 YAML 文件加载字典和函数。在之前的版本中,这需要在配置文件中编辑 dictionaries_configuser_defined_executable_functions_config,因为它们只接受 *.xml 文件。#49812Alexey Milovidov)。
  • Kafka 表引擎现在支持使用别名列。#49824Aleksandr Musorin)。
  • 添加一个设置,用于限制 extractKeyValuePairs 生成的键值对最大数量,作为一种防护机制,以避免过度使用内存。#49836 (Arthur Passos).
  • 增加对一种(不常见)情况的支持:IN 运算符中的参数是单元素元组。#49844 (MikhailBurdukov)。
  • bitHammingDistance 函数现在支持 StringFixedString 数据类型。修复了 #48827#49858flynn)。
  • 修复 OS X 客户端中的超时重置错误。 #49863 (alekar).
  • 在函数 bitCount 中添加对大整数类型的支持,例如 UInt128、Int128、UInt256 和 Int256。这样可以在大规模位掩码上计算汉明距离,以支持 AI 应用。#49867 (Alexey Milovidov)。
  • 在加密磁盘中使用指纹替代密钥 ID,从而简化加密磁盘的配置。#49882 (Vitaly Baranov)。
  • 新增 PostgreSQL 的 UUID 数据类型支持。关闭 #49739#49894Nikolay Degterinsky)。
  • 函数 toUnixTimestamp 现在接受 DateDate32 参数。#49989 (Victor Krasnov)。
  • 仅统计字典使用的服务器内存。 #49995 (Azat Khuzhin).
  • 服务器将允许将 SQL_* 设置(例如 SQL_AUTO_IS_NULL)视为无操作(no-op),以实现对 MySQL 的兼容性。此更改解决了 #49927#50013Alexey Milovidov)。
  • 在 ON CLUSTER 查询中保留 initial_query_id,在 distributed_ddl_entry_format_version=5 时有助于进行内部排查。 #50015 (Azat Khuzhin).
  • 通过使用别名(allow_experimental_projection_optimization 对应 optimize_use_projectionsallow_experimental_lightweight_delete 对应 enable_lightweight_delete),保留已重命名设置的向后不兼容性。 #50044 (Azat Khuzhin).
  • 支持通过将 my_hostname 设置为 FQDN,在 keeper 中注册集群节点。新增 invisible 设置以支持多个计算组:一个 compute group 作为一个集群,对其他 compute group 不可见。 #50186 (Yangkuan Liu).
  • 修复 PostgreSQL 即使可以指定 LIMIT n 仍会读取全部数据的问题。#50187Kseniia Sumarokova)。
  • 为包含子查询的查询添加新的 Profile 事件(QueriesWithSubqueries/SelectQueriesWithSubqueries/InsertQueriesWithSubqueries)。#50204Azat Khuzhin)。
  • 在 users.xml 文件中添加 roles 字段,使其能够通过配置文件指定带授权的角色。 #50278 (pufit)。
  • 在 AsynchronousMetrics 中上报 CGroupCpuCfsPeriodCGroupCpuCfsQuota。- 在服务器启动期间遵循 cgroup v2 内存限制。#50379 (alekar)。
  • 为 SIGQUIT 添加一个信号处理程序,使其行为与 SIGINT 相同。关闭问题 #50298#50435Nikolay Degterinsky)。
  • 如果由于对象体积过大导致 JSON 解析失败,输出解析停止的最后位置以便进行调试。 #50474 (Valentin Alexeev).
  • 支持非固定精度的小数。关闭 #49130#50586Kruglov Pavel)。

构建/测试/打包改进

Bug 修复(官方稳定版中用户可见的异常行为)

ClickHouse 版本 23.4,2023-04-26

向后不兼容的变更

  • 函数 formatDateTime() 中的格式说明符 '%M' 现在会输出月份名称而不是分钟,从而使行为与 MySQL 保持一致。可以通过设置 formatdatetime_parsedatetime_m_is_month_name = 0 来恢复之前的行为。#47246Robert Schulze)。
  • 此变更仅在使用虚拟文件系统缓存时才会产生影响。如果虚拟文件系统缓存配置中的 path 不为空且不是绝对路径,则它会被放置在 <clickhouse server data directory>/caches/<path_from_cache_config> 中。#48784Kseniia 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 查询新增了 LIGHTWEIGHTPULL 修饰符。LIGHTWEIGHT 版本仅等待抓取和删除范围操作(忽略合并和变更)。PULL 版本从 ZooKeeper 拉取新条目,但不会等待其完成。修复了 #47794#48085Alexander Tokmakov)。
  • 添加 kafkaMurmurHash 函数,以兼容 Kafka 的默认分区器 DefaultPartitioner。修复 #47834#48185Nikolay Degterinsky)。
  • 允许通过 GRANT CURRENT GRANTS 轻松创建一个与当前用户拥有相同权限的用户。#48262 (pufit)。
  • 添加统计聚合函数 kolmogorovSmirnovTest。关闭 #48228#48325FFFFFFFHHHHHHH)。
  • system.replicas 表中新增了 lost_part_count 列。该列的值表示对应表中丢失数据分片(parts)的总数。该值存储在 ZooKeeper 中,可在监控中替代非持久化的 ReplicatedDataLoss profile event 使用。#48526 (Sergei Trifonov).
  • 添加 soundex 函数以提高兼容性。关闭 #39880#48567FriendLey)。
  • JSONExtract 现已支持 Map 类型。 #48629 (李扬).
  • 添加 PrettyJSONEachRow 格式,用于输出带有换行分隔符和 4 个空格缩进的美化 JSON。#48898Kruglov Pavel)。
  • 添加 ParquetMetadata 输入格式以读取 Parquet 文件的元数据。#48911 (Kruglov Pavel)。
  • 添加 extractKeyValuePairs 函数,用于从字符串中提取键值对。输入字符串可能包含噪声(例如日志文件 / 不必是完全符合键值对格式的内容),算法会根据传递给函数的参数查找匹配的键值对。目前该函数接受以下参数:data_column(必需)、key_value_pair_delimiter(默认为 :)、pair_delimiters(默认为 \space \, \;)以及 quoting_character(默认为双引号)。#43606Arthur Passos)。
  • 现在,函数 replaceOne()、replaceAll()、replaceRegexpOne() 和 replaceRegexpAll() 可以传入非常量的模式和替换参数。#46589 (Robert Schulze)。
  • 新增了用于处理 Map 类型列的函数:mapConcatmapSortmapExists#48071 (Anton Popov)。

性能改进

  • 读取 Parquet 格式文件的速度现在快得多。IO 和解码已并行化(由 max_threads 设置控制),并且只读取所需的数据范围。#47964Michael Kolupaev)。
  • 当我们运行类似这样的带有 IN(子查询)的变更:ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table) 时,如果表 t 有多个 part,那么对于每个 part,都会在内存中为子查询 SELECT id FROM huge_table 构建一个 set。如果 part 很多,就可能消耗大量内存(并导致 OOM)和 CPU。解决方案是为当前正在由 mutation 任务构建的 set 引入一个短生命周期的缓存。如果同一 mutation 的另一个任务并发执行,它可以在缓存中查找该 set,等待其构建完成并重用它。#46835Alexander Gololobov)。
  • 在执行 ALTER TABLE 查询时,仅在必要时检查依赖关系。#48062Raúl Marín)。
  • 优化函数 mapUpdate#48118Anton Popov)。
  • 现在会显式向本地副本发送内部查询,并通过 loopback 接口接收其数据。对于并行副本,不再遵循 prefer_localhost_replica 设置。这样做是为了更好的调度并使代码更简洁:发起方只负责协调读取过程和合并结果,持续响应请求,而所有次级查询负责读取数据。注意:使用 loopback 接口本身性能并不高,但如果不这样做,某些副本可能会出现任务饥饿,从而导致查询执行更慢,且无法充分利用所有可用资源。协调器的初始化现在更加惰性。所有传入请求都包含有关读取算法的信息,我们在第一个请求到达时使用该信息初始化协调器。如果任何副本决定使用不同的算法进行读取,将抛出异常并中止该查询。#48246Nikita Mikhaylov)。
  • IN 子句右侧的子查询仅用于分析跳过索引,并且通过设置禁用了它们(use_skip_indexes=0)时,不再为其构建 set。此前这可能会影响查询性能。#48299Anton Popov)。
  • 在读取 FROM file(...) 之后立即并行化查询处理。与 #38755 相关。#48525Igor Nikonov)。现在在从任意数据源读取之后就会并行化查询处理。受影响的数据源主要是简单或外部存储,例如表函数 urlfile#48727Igor Nikonov)。该行为由设置 parallelize_output_from_storages 控制,默认未开启。
  • 降低了 ThreadPool 互斥锁的争用(对于数量巨大的小任务,可能提升性能)。#48750Sergei Trifonov)。
  • 降低了多个 ALTER DELETE 变更的内存使用。#48522Nikolai Kochetov)。
  • 当启用 skip_unavailable_shards 设置时,移除了多余的连接尝试。#48771Azat Khuzhin)。

实验性功能

改进

  • connect_timeout_with_failover_ms 的默认值提升至 1000 ms(因为在 https://github.com/ClickHouse/ClickHouse/pull/47229 中引入了异步连接)。关闭 #5188#49009Kruglov Pavel)。
  • 围绕数据湖进行了一系列改进:- 让 Iceberg 能够处理非分区数据。- 支持 Iceberg 格式版本 v2(此前仅支持 v1)。- 支持为 DeltaLake/Hudi 读取分区数据。- 通过使用 Delta 的 checkpoint 文件更快地读取 DeltaLake 元数据。- 修复了错误的 Hudi 读取行为:此前会错误地选择要读取的数据,因此只能正确读取小表。- 使这些引擎能够感知并应用数据变更(此前状态在表创建时就被固定)。- 使用 Spark 为 Iceberg/DeltaLake/Hudi 编写并完善了测试。#47307Kseniia Sumarokova)。
  • 为 socket 添加异步连接和异步写入支持。使跨分片创建连接和发送查询/外部表操作变为异步。使用 fibers 重构代码。修复并关闭 #46931。该 PR 合并后,我们将能够默认提高 connect_timeout_with_failover_ms 的取值(https://github.com/ClickHouse/ClickHouse/issues/5188)。#47229Kruglov Pavel)。
  • 支持在配置中使用 keeper/keeper_server 段作为 zookeeper 的替代。关闭 #34766#34767#35113 (李扬)。
  • 现在可以在以 ClickHouse 表作为数据源的字典的 named_collections 中设置 secure 标志。解决了#38450 问题。#46323Ilya Golshtein)。
  • bitCount 函数现在支持 FixedStringString 数据类型。 #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,改进了插入表结构向表函数传播的灵活性。修复了名称映射和使用虚拟列时的问题。不再需要使用 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_insertload_balancing,并将列 volume_type 的类型修改为 Enum8#48167 (lizhuoyu5).
  • 新增对 BACKUP ALL 命令的支持,该命令会备份所有表和数据库,包括临时表和系统表。#48189 (Vitaly Baranov).
  • 函数 mapFromArrays 支持将 Map 类型作为输入。#48207 (李扬)。
  • 某些 SHOW PROCESSLIST 的输出现在已排序。#48241 (Robert Schulze)。
  • 针对远程 IO、本地 IO 及备份操作的按查询/按服务器限流(服务器级设置:max_remote_read_network_bandwidth_for_servermax_remote_write_network_bandwidth_for_servermax_local_read_bandwidth_for_servermax_local_write_bandwidth_for_servermax_backup_bandwidth_for_server,查询级设置:max_remote_read_network_bandwidthmax_remote_write_network_bandwidthmax_local_read_bandwidthmax_local_write_bandwidthmax_backup_bandwidth)。 #48242 (Azat Khuzhin)。
  • CapnProto 格式中支持更多类型:Map、(U)Int(128|256)、Decimal(128|256)。在输入/输出时允许进行整数类型转换。#48257Kruglov Pavel)。
  • 不要在正常情况下抛出 CURRENT_WRITE_BUFFER_IS_EXHAUSTED 错误。 #48288 (Raúl Marín).
  • 添加新设置 keeper_map_strict_mode,为在 KeeperMap 表上执行的操作提供额外的严格保证。#48293Antonio Andelic)。
  • 检查 simple dictionary 的主键类型是否为原生无符号整数类型。为兼容性新增设置 check_dictionary_primary_key(将 check_dictionary_primary_key = false 以禁用检查)。#48335 (lizhuoyu5).
  • 无需为 KeeperMap 复制变更操作,因为没有必要。#48354Antonio Andelic)。
  • 允许在 Protobuf 格式中将未命名的 Tuple 读写为嵌套的 Message。Tuple 元素与 Message 字段按位置匹配。#48390 (Kruglov Pavel)。
  • 在新计划器中支持 additional_table_filtersadditional_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#48438Nikolay Degterinsky)。
  • 使用客户端参数 --user--password 覆盖环境变量 CLICKHOUSE_USERCLICKHOUSE_PASSWORD。修复了 #38909#48440Nikolay Degterinsky)。
  • 在遇到可重试错误时,为 MergeTree 表的数据 part 加载添加了重试机制。 #48442 (Anton Popov).
  • arrayMinarrayMaxarrayDifference 函数新增对 DateDate32DateTimeDateTime64 数据类型的支持。解决了 #21645 中提出的问题。#48445Nikolay Degterinsky)。
  • 添加对 {server_uuid} 宏的支持。它可用于在自动扩缩容集群中标识副本,当运行期间不断有新副本被添加或移除时尤为有用。此更改修复了 #48554#48563Alexey Milovidov)。
  • 安装脚本在可行时会创建硬链接,而不是进行复制。#48578Alexey Milovidov)。
  • 支持 SHOW TABLE 语法,其含义等同于 SHOW CREATE TABLE。关闭 #48580#48591flynn)。
  • HTTP 临时缓冲区现在支持通过从虚拟文件系统缓存中逐出数据来运作。 #48664 (Vladimir C).
  • 使 schema 推断适用于 CREATE AS SELECT。关闭 #47599#48679flynn)。
  • ReplicatedMergeTree 新增了 replicated_max_mutations_in_one_entry 设置项,用于限制每个 MUTATE_PART 记录中的变更命令数量(默认值为 10000)。 #48731 (Alexander Tokmakov).
  • 在 AggregateFunction 类型中,不要将 arena 中未使用的字节计入 read_bytes#48745 (Raúl Marín).
  • 修复了在使用 MySQL 字典源和命名集合时,某些与 MySQL 相关的设置未被处理的问题。解决了 #48402#48759Kseniia Sumarokova)。
  • 如果用户将 max_single_part_upload_size 设置得非常大,可能会因为 AWS S3 SDK 中的一个 Bug 而导致崩溃。此修复解决了 #47679#48816Alexey Milovidov)。
  • 修复 RabbitMQ 中的数据竞争(报告),并重构代码。#48845Kseniia Sumarokova)。
  • system.partssystem.part_log 添加 namepart_name 别名。关闭 #48718#48850 (sichenzhao)。
  • 函数 "arrayDifferenceSupport()"、"arrayCumSum()" 和 "arrayCumSumNonNegative()" 现已支持宽整数类型 (U)Int128/256 的输入数组。#48866 (cluster)。
  • clickhouse-client 中的多行命令历史现在不再添加前导空格。这使得粘贴操作更加自然。#48870Joanna 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#48989Nikolay Degterinsky)。
  • 改进嵌入式仪表板。解决 #46671#49036 (Kevin Zhang)。
  • 为日志消息添加 profile event 统计,以便可以轻松按严重性查看各级日志消息的数量。 #49042 (Alexey Milovidov)。
  • 在之前的版本中,存在 DOS 或 macOS Classic 换行符时,LineAsString 格式在是否启用并行解析的情况下表现不一致。此更改关闭了 #49039#49052Alexey Milovidov)。
  • 关于未解析查询参数的异常消息现在也会包含该参数的名称。重新实现 #48878。关闭 #48772#49061Alexey 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 和索引的压缩方式。#48286 (Alexey Milovidov).
  • 将内部 ZSTD 从 1.5.4 升级到 1.5.5。#46797 (Robert Schulze).
  • 在测试中随机化从 compact parts 到 wide parts 的纵向合并。#48287 (Raúl Marín).
  • 支持 HDFS 中的 CRC32 校验和,并修复性能问题。#48614 (Alexey Milovidov).
  • 移除 GCC 支持的残余代码。#48671 (Robert Schulze).
  • 添加启用新 analyzer 基础设施的 CI 任务。#48719 (Dmitry Novik).

Bug 修复(官方稳定版本中用户可见的异常行为)

ClickHouse 23.3 LTS 版本,2023-03-30

升级说明

  • 轻量级 DELETE 已达到生产可用级别并默认启用。针对 MergeTree 表的 DELETE 查询现在默认可用。
  • *domain*RFCnetloc 函数的行为有轻微变更:放宽了 URL authority 中允许的符号集合,以更好地符合相关规范。#46841Azat Khuzhin)。
  • 禁止基于 KafkaEngine 创建在列上带有 DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED 子句的表。#47138Aleksandr Musorin)。
  • 移除了“异步连接排空(asynchronous connection drain)”功能。相关设置和指标也一并移除。该功能为内部特性,因此移除不应影响那些此前从未使用或了解过该功能的用户。#47486Alexander Tokmakov)。
  • arraySum/Min/Max/Avg/ProductarrayCumSum/CumSumNonNegativearrayDifference、数组构造、IN 运算符、查询参数、groupArrayMovingSum、统计函数、min/max/any/argMin/argMax、PostgreSQL 线协议、MySQL 表引擎和函数、sumMapmapAddmapSubtractarrayIntersect 中支持 256 位 Decimal 数据类型(超过 38 位数字)。在 arrayIntersect 中增加对大整数的支持。涉及矩(moment)的统计聚合函数(例如 corr 或各种 TTest)将使用 Float64 作为其内部表示(此前使用的是 Decimal128,但没有必要),并且在方差为无穷大时,这些函数可以返回 nan 而不是 inf。此前某些函数虽然允许在 Decimal256 数据类型上使用,但会返回 Decimal128——现在这一点已修复。此更改关闭了 #47569。此更改关闭了 #44864。此更改关闭了 #28335#47594Alexey Milovidov)。
  • 将 backup_threads/restore_threads 改为服务器级设置(而非用户级设置)。#47881Azat Khuzhin)。
  • 不再允许常量二级索引和非确定性二级索引。#46839Anton Popov)。

新功能

  • 通过设置 parallel_replicas_custom_keyparallel_replicas_custom_key_filter_type,新增了一种在副本之间划分负载的模式。如果集群由单个分片和多个副本组成,将会随机选择最多 max_parallel_replicas 个副本并将其视作分片。对于每个分片,在请求发送到该分片之前,会在发起端的查询中添加相应的过滤条件。如果集群由多个分片组成,其行为将与 sample_key 相同,但可以定义任意自定义键。#45108 (Antonio Andelic)。
  • 新增在取消时显示部分结果的选项:添加了查询设置 partial_result_on_first_cancel,允许被取消的查询(例如由于 Ctrl-C)返回部分结果。#45689Alexey Perevyshin)。
  • 为临时表添加了对任意表引擎的支持(ReplicatedKeeperMap 引擎除外)。关闭 #31497#46071Roman Vasin)。
  • 通过在 Keeper 中使用集中式存储,为用户定义的 SQL 函数新增复制支持。#46085 (Aleksei Filatov)。
  • 实现 system.server_settings(类似于 system.settings),用于存储服务器配置。#46550 (pufit).
  • 新增对 UNDROP TABLE 查询的支持。关闭 #46811#47241chen)。
  • 允许为具名集合单独授予权限(例如,只为某些集合授予 SHOW/CREATE/ALTER/DROP named collection 访问权限,而不是一次性对所有集合授予)。修复 #40894。新增访问类型 NAMED_COLLECTION_CONTROL,该访问类型不会默认授予用户,除非在用户配置中显式添加(执行 GRANT ALL 时需要该权限),同时,show_named_collections 不再是必须为默认用户手动指定的选项,默认用户仍然可以像在 23.2 中那样拥有完整访问权限。#46241Kseniia Sumarokova)。
  • 允许使用嵌套的自定义磁盘。之前,自定义磁盘仅支持扁平结构。#47106 (Kseniia Sumarokova)。
  • 引入 widthBucket 函数(同时提供兼容性的别名 WIDTH_BUCKET)。#42974#46790avoiderboi)。
  • 根据指定的格式字符串新增函数 parseDateTime / parseDateTimeInJodaSyntaxparseDateTime 按 MySQL 语法将字符串解析为 DateTime,parseDateTimeInJodaSyntax 按 Joda 语法进行解析。#46815 (李扬)。
  • dummy UInt8 用作表函数 null 的默认结构。关闭 #46930#47006flynn)。
  • parseDateTimeBestEffort 函数中增加了对带逗号的日期格式(例如 Dec 15, 2021)的支持。关闭了 #46816#47071chen)。
  • 为 HTTP 接口新增了设置 http_wait_end_of_queryhttp_response_buffer_size,它们分别对应 URL 参数 wait_end_of_querybuffer_size。这使得可以在 profiles 中修改这些设置。#47108 (Vladimir C)。
  • 添加 system.dropped_tables 表,用于显示在 Atomic 数据库中已被删除但尚未彻底移除的表。#47364 (chen)。
  • 添加 INSTR 作为 positionCaseInsensitive 的别名,以实现与 MySQL 的兼容性。解决 #47529#47535flynn)。
  • 新增 toDecimalString 函数,用于将数字转换为具有固定小数位数的字符串。#47838 (Andrey Zvonov)。
  • 新增 MergeTree 设置项 max_number_of_mutations_for_replica。它将每个副本的分片变更(mutation)数量限制为指定值。0 表示对每个副本的变更数量不设上限(执行仍然可能受其他设置约束)。 #48047 (Vladimir C)。
  • 添加了 Map 相关函数 mapFromArrays,用于由一对数组构造 map。 #31125 (李扬)。
  • 允许在 Parquet/ORC/Arrow 输出格式中控制压缩,并新增对更多压缩输入格式的支持。修复了 #13541#47114Kruglov 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 会被设置为当前 CPU 核心数(使用与 max_threads 相同的算法)。这提升了在拥有大量 CPU 的服务器上执行 final 时的并发度。#47915 (Nikita Taranov)。
  • 允许在多线程中为具有 CLICKHOUSE 源的 DIRECT 字典执行读取管线。要启用此功能,请在 CREATE DICTIONARY 语句中为该 source 的 SETTINGS 部分设置 dictionary_use_async_executor=1#47986 (Vladimir C)。
  • 优化包含单个可空键的聚合操作性能。 #45772 (LiuNeng).
  • hasTokenOrNullhasTokenCaseInsensitivehasTokenCaseInsensitiveOrNull 引入了对小写 tokenbf_v1 索引的支持。 #46252 (ltrk2).
  • 通过使用 SIMD 先搜索前两个字符来优化 positionLIKE 函数。#46289 (Jiebin Sun).
  • 优化对 system.detached_parts 的查询,该表可能会非常大。考虑到块大小限制,添加了多个来源;在每个块中都使用 IO 线程池来计算分片大小,即并行执行系统调用。#46624 (Sema Checherinda)。
  • 将 ReplicatedMergeTree 表的 max_replicated_merges_in_queue 默认值从 16 增加到 1000,从而在具有大量副本的集群(例如在 ClickHouse Cloud 中使用共享存储的集群)上可以更快速地执行后台合并操作。#47050Alexey Milovidov)。
  • clickhouse-copier 更新为使用 GROUP BY 而不是 DISTINCT 来获取分区列表。对于大型表,这将查询耗时从 500 多秒降低到不足 1 秒。#47386 (Clayton McClure)。
  • 修复 ASOF JOIN 中的性能退化问题。#47544 (Ongkong)。
  • 在 Keeper 中进一步增加批处理。通过避免在读取请求时打断批次来提升性能。#47978 (Antonio Andelic).
  • 允许对列具有不同 DEFAULT 表达式的 Merge 表使用 PREWHERE。 #46831 (Azat Khuzhin).

实验性功能

  • 并行副本:通过更好地利用本地副本提升整体性能,并且默认禁止对非复制 MergeTree 表使用并行副本读取。#47858 (Nikita Mikhaylov)。
  • 在启用实验性 Analyzer 时,支持对使用 JoinDictionaryEmbeddedRocksDB 表的 JOIN 将过滤条件下推到左表。#47280 (Maksim Kita)。
  • 现在使用零拷贝复制的 ReplicatedMergeTree 对 Keeper 的负载更小。#47676 (alesapin)。
  • 修复了使用 MaterializedPostgreSQL 创建物化视图的问题。#40807 (Maksim Buren)。

改进

  • 默认启用 input_format_json_ignore_unknown_keys_in_named_tuple#46742 (Kruglov Pavel).
  • 允许在向物化视图推送数据时忽略错误(新增设置 materialized_views_ignore_errors,默认值为 false,但在将日志无条件刷新到 system.*_log 表时,该设置为 true)。 #46658 (Azat Khuzhin).
  • 在内存中跟踪分布式发送中的文件队列。#45491 (Azat Khuzhin).
  • 现在,通过 HTTP 协议执行的所有查询,其响应中都会添加 X-ClickHouse-Query-IdX-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)。
  • 此项改进对用户应当是透明的。基于查询计划重新实现投影分析。新增设置项 query_plan_optimize_projection=1,用于在旧版和新版实现之间切换。修复 #44963#46537Nikolai Kochetov)。
  • 在输出格式中默认使用 Parquet v2 格式而不是 v1。新增设置项 output_format_parquet_version 用于控制 Parquet 版本,可选值为 1.02.42.62.latest(默认)。 #46617 (Kruglov Pavel).
  • 现在可以使用新的配置语法来配置名称中包含点号(.)的 Kafka 主题。 #46752 (Robert Schulze)。
  • 修复用于检查 Hyperscan 模式中有问题重复的启发式算法。 #46819 (Robert Schulze).
  • 当由不同副本并发创建块时,不要因 ZK 节点已存在而向 system.errors 报错。 #46820 (Raúl Marín).
  • 提高 clickhouse-local 的已打开文件数量上限。这样它就能够在拥有大量 CPU 核心的服务器上读取 web 表。在已打开文件过多的情况下,也不要因为这个原因而停止从 URL 表引擎读取数据。此更改关闭了 #46852#46853Alexey Milovidov)。
  • 当无法解析数字时抛出的异常,现在具有更易读的异常消息。#46917Robert Schulze)。
  • 在每处理完一个任务后更新 system.backups,以跟踪备份进度。 #46989 (Aleksandr Musorin).
  • 在 Native 输入格式中允许类型转换。新增 input_format_native_allow_types_conversion 设置用于控制该行为(默认启用)。#46990Kruglov Pavel)。
  • range 函数中支持使用 IPv4 来生成 IP 范围。#46995 (Yakov Olkhovskiy)。
  • 当无法将某个 part 从一个卷/磁盘移动到另一个卷/磁盘时,改进异常消息。#47032 (alesapin).
  • JSONType 函数中支持 Bool 类型。此前对于 bool 值会错误地返回 Null 类型。#47046 (Anton Popov)。
  • 使用 _request_body 参数配置预定义的 HTTP 查询。#47086 (Constantine Peresypkin)。
  • 在内置 UI 的 SQL 编辑器中,按下 Enter 键时会自动缩进。#47113Alexey Korepanov)。
  • 使用 'sudo' 进行自解压时,将尝试把解压出的文件的 uid 和 gid 设为当前执行用户的值。#47116 (Yakov Olkhovskiy)。
  • 此前,repeat 函数的第二个参数只接受无符号整数类型,这意味着它无法接受诸如 -1 之类的值,其行为与 Spark 中的同名函数不一致。此次更新中,repeat 函数已调整为与 Spark 函数的行为保持一致,现在可以接受相同类型的输入,包括负整数。我们已进行了大量测试,以验证更新后实现的正确性。#47134KevinyhZou)。注意:此变更日志条目由 ChatGPT 重写。
  • 从堆栈跟踪中移除 ::__1 部分。在堆栈跟踪中将 std::basic_string<char, ... 显示为 String#47171Mike Kot)。
  • 重新实现 interserver 模式以避免重放攻击(注意,此更改与旧版服务器向后兼容)。#47213 (Azat Khuzhin)。
  • 改进对正则表达式分组的识别,并优化 regexp_tree 字典。#47218 (Han Fei)。
  • Keeper 改进:新增 4LW 命令 clrs,用于清理 Keeper 使用的资源(例如释放未使用的内存)。#47256Antonio Andelic)。
  • 为编解码器 DoubleDelta(bytes_size)Gorilla(bytes_size)FPC(level, float_size) 添加可选参数,这样可以在 clickhouse-compressor 中在不指定列类型的情况下使用这些编解码器。修复在 clickhouse-compressor 中使用这些编解码器时可能出现的进程中止和算术错误。修复:(https://github.com/ClickHouse/ClickHouse/discussions/47262)#47271Kruglov Pavel)。
  • runningDifference 函数添加对 bigint 类型的支持。修复 #47194#47322Nikolay Degterinsky)。
  • 为具有过期时间的 S3 凭证添加一个过期缓冲窗口,以避免在某些边界情况下出现 ExpiredToken 错误。可以通过 expiration_window_seconds 配置进行控制,默认值为 120 秒。#47423Antonio Andelic)。
  • Avro 格式中支持 Decimal 和 Date32。#47434Kruglov Pavel)。
  • 如果检测到从 OrdinaryAtomic 的转换被中断,则不要启动服务器,并输出更清晰的错误信息,其中包含故障排查说明。#47487Alexander Tokmakov)。
  • system.opentelemetry_span_log 新增一列 kind。该列存储 OpenTelemetry 中定义的 SpanKind 的值。#47499Frank 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 之前的行为相同)。#47659Alexander Tokmakov)。
  • 改进了一些 OpenTelemetry Span 日志的命名。#47667 (Frank Chen).
  • 避免使用过长的聚合函数组合器链(在分析阶段可能导致查询变慢)。修复了 #47715#47716Alexey Milovidov)。
  • 支持在参数化视图中使用子查询;解决了 #46741 #47725SmitaRKulkarni)。
  • 修复 MySQL 集成中的内存泄漏(当 connection_auto_close=1 时可复现)。#47732 (Kseniia Sumarokova).
  • 改进了与 Decimal 参数相关代码中的错误处理,使错误消息更加详尽。此前,当传入不正确的 Decimal 参数时,生成的错误消息不够清晰或帮助不大。通过此次更新,已修正为打印出更详细且更有用的错误信息,从而更容易识别并纠正与 Decimal 参数相关的问题。#47812Yu Feng)。注意:此变更日志条目由 ChatGPT 重写。
  • 参数 exact_rows_before_limit 用于让 rows_before_limit_at_least 能够准确反映在达到 limit 之前返回的行数。该 pull request 解决了当查询涉及跨多个分片的分布式处理或排序操作时遇到的问题。在此更新之前,这些场景未按预期工作。#47874Amos Bird)。
  • ThreadPools 指标自检。#47880 (Azat Khuzhin).
  • 添加 WriteBufferFromS3MicrosecondsWriteBufferFromS3RequestsErrors profile 事件。#47885Antonio Andelic)。
  • 在 ClickHouse 安装中添加 --link--noninteractive (-y) 选项。修复 #47750#47887Nikolay Degterinsky)。
  • 修复了在附加到其依赖表不可用的物化视图时出现的 UNKNOWN_TABLE 异常。这在尝试从备份恢复状态时可能会很有用。#47975 (MikhailBurdukov)。
  • 修复在加密磁盘配置中未添加可选 path 字段时出现的问题。#47981Kseniia Sumarokova)。
  • 实现参数化视图对 CTE 的支持:已更新以便在评估标量子查询时允许使用查询参数。#48065SmitaRKulkarni)。
  • 支持大整数 (U)Int128/(U)Int256、任意键类型的 Map 以及任意精度(不限于 3 和 6)的 DateTime64#48119 (Kruglov Pavel)。
  • 允许在行输入格式中忽略因未知枚举值导致的错误。#48133 (Alexey Milovidov).

构建/测试/打包改进

  • ClickHouse 现在使用 C++23 进行构建。#47424Robert Schulze)。
  • 在 AST Fuzzer 中对 EXPLAIN 查询进行模糊测试。#47803 #47852flynn)。
  • 将压力测试与自动化的向后兼容性检查(现称为升级检查)拆分开来。#44879Kruglov Pavel)。
  • 更新 Docker 使用的 Ubuntu 镜像,以减少一些虚假的安全报告。#46784Julio Jimenez)。请注意,ClickHouse 没有依赖项,也不需要 Docker。
  • 在使用 "curl | sh" 下载 ClickHouse 时,新增一个提示,用于在已存在 clickhouse 可执行文件时允许删除。提示为 "ClickHouse binary clickhouse already exists. Overwrite? [y/N]"。#46859Dan Roscigno)。
  • 修复在旧发行版(例如 Amazon Linux 2)以及 ARM 平台上,服务器启动期间出现的找不到 glibc 2.28 符号的错误。#47008Robert Schulze)。
  • 为 clang 16 做准备。#47027Amos Bird)。
  • 新增一个 CI 检查,以确保 ClickHouse 能在 ARM 上配合旧版本 glibc 运行。#47063Robert Schulze)。
  • 增加样式检查,以防止错误使用 NDEBUG 宏。#47699Alexey Milovidov)。
  • 略微加快了构建速度。#47714Alexey Milovidov)。
  • vectorscan 升级到 5.4.9。#47955Robert Schulze)。
  • 添加单元测试,以断言 Apache Arrow 的致命日志不会导致进程中止。该测试覆盖了 ClickHouse/arrow#16 中的更改。#47958Arthur Passos)。
  • 恢复原生 macOS 调试服务器构建版本的可启动性。#48050Robert Schulze)。注意:此更改仅与开发相关,因为 ClickHouse 官方构建是通过交叉编译完成的。

错误修复(官方稳定版本中用户可见的异常行为)

ClickHouse 版本 23.2,2023-02-23

向后不兼容的变更

  • 为函数 "toDayOfWeek()"(别名:"DAYOFWEEK")扩展了一个 mode 参数,用于表示一周是从星期一还是星期日开始,以及计数是从 0 还是从 1 开始。为与其他日期时间函数保持一致,mode 参数被插入到时间参数和时区参数之间。这会破坏当前对(此前未在文档中说明的)双参数语法 "toDayOfWeek(time, time_zone)" 的使用。修复方法是将函数改写为 "toDayOfWeek(time, 0, time_zone)"。#45233Robert Schulze)。
  • 将设置项 max_query_cache_size 重命名为 filesystem_cache_max_download_size#45614Kseniia Sumarokova)。
  • default 用户默认将不再拥有访问类型 SHOW NAMED COLLECTION 的权限(例如,default 用户将不再能够像之前那样向其他用户授予 ALL,因此该 PR 为向后不兼容)。#46010Kseniia Sumarokova)。
  • 如果在 FORMAT 子句之前指定 SETTINGS 子句,这些设置也会应用于格式化。#46003Azat Khuzhin)。
  • 移除对设置 materialized_postgresql_allow_automatic_update 的支持(该设置默认是关闭的)。#46106Kseniia Sumarokova)。
  • 略微提升了 countDigits 在真实数据集上的性能。这解决了 #44518。在以前的版本中,countDigits(0) 返回 0;现在返回 1,这更加正确,也与现有文档保持一致。#46187Alexey Milovidov)。
  • 禁止创建使用 "Delta" 或 "DoubleDelta" 编解码器与 "Gorilla" 或 "FPC" 编解码器组合压缩的新列。可以通过设置 "allow_suspicious_codecs = true" 来绕过该限制。#45652Robert 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 计数器。#38614Bharat Nallan)。
  • 对现有的 ReplacingMergeTree 引擎进行增强,以允许插入重复数据。它在一个 MergeTree 引擎中同时利用 ReplacingMergeTreeCollapsingMergeTree 的特性。被删除的数据在查询时不会返回,但也不会从磁盘上移除。#41005 (youennL-cs)。
  • 添加 generateULID 函数。修复 #36536#44662Nikolay Degterinsky)。
  • 添加 corrMatrix 聚合函数,用于计算每一对列之间的相关性。此外,由于聚合函数 covarSampcovarPopcorr 类似,顺便也添加了 covarSampMatrixcovarPopMatrix。@alexey-milovidov 关闭了 #44587#44680FFFFFFFHHHHHHH)。
  • 引入 arrayShuffle 函数,用于对数组进行随机排列。 #45271 (Joanna Hulboj).
  • 支持 Arrow 中的 FIXED_SIZE_BINARY 类型和 Parquet 中的 FIXED_LENGTH_BYTE_ARRAY 类型,并将它们映射为 FixedString。新增设置项 output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array,用于控制 FixedString 的默认输出类型。关闭 #45326#45340Kruglov Pavel)。
  • 在 system.replication_queue 中添加新列 last_exception_time#45457 (Frank Chen).
  • 新增两个函数,使 SipHash128 支持使用用户自定义密钥/种子。 #45513 (Salvatore Mesoraca).
  • 允许表函数 format 使用三参数版本。关闭 #45808#45873 (FFFFFFFHHHHHHH)。
  • xwS 增加对 JodaTime 格式的支持。参见 https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html#46073zk_kiger)。
  • 新增对窗口函数 ntile 的支持。(lgbo)
  • 新增设置 final,用于将 FINAL 修饰符隐式应用于每个表。#40945 (Arthur Passos)。
  • 新增 arrayPartialSortarrayPartialReverseSort 函数。#46296Joanna Hulboj)。
  • 新的 HTTP 参数 client_protocol_version 允许在使用 Native 格式时为 HTTP 响应设置客户端协议版本。#40397#46360Geoff Genz)。
  • 新增函数 regexpExtract,用于兼容 Spark 函数 REGEXP_EXTRACT。它与现有函数 extract 类似。#46469 (李扬)。
  • 新增函数 JSONArrayLength,用于返回最外层 JSON 数组中的元素个数。如果输入的 JSON 字符串无效,则返回 NULL。 #46631 (李扬)。

性能优化

  • 如果 PREWHERE 条件是由多个条件构成的合取(cond1 AND cond2 AND ...),上述逻辑就会生效。它会将那些需要读取相同列的条件分组成多个步骤。在每个步骤之后,会计算完整条件中对应的那一部分,并可能对结果行进行过滤。这样可以在后续步骤中读取更少的行,从而节省 IO 带宽并减少计算量。该逻辑目前默认是禁用的。一旦确认不会带来任何回归问题,在未来的某个版本中会默认启用,因此强烈建议在测试中使用。它可以通过两个设置进行控制:"enable_multiple_prewhere_read_steps" 和 "move_all_conditions_to_prewhere"。 #46140 (Alexander Gololobov)。
  • 新增了一个选项,可在表的分区键与 GROUP BY 的分组键兼容时独立聚合各分区。通过设置 allow_aggregate_partitions_independently 进行控制。由于适用范围有限(请参阅文档),该选项默认处于禁用状态。 #45364 (Nikita Taranov).
  • 允许对 Compact 格式的分片(part)使用 Vertical merge 算法。这将使 ClickHouse 服务器在执行后台操作时显著减少内存占用。由此关闭了 #46084#45681 #46282Anton 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 (李扬)。
  • 当 needle 为空时,为 position 函数添加快速路径。 #45382 (李扬).
  • 默认启用 query_plan_remove_redundant_sorting 优化功能。该优化最初在 #45420 中实现。#45567Igor Nikonov)。
  • 增大 HTTP 分块传输编码的块大小,以提升通过 HTTP 接口执行大查询时的性能。#45593 (Geoff Genz)。
  • 优化了在包含大量 Array/Map/Nested 列的表上执行短 SELECT 查询时的性能。 #45630 (Anton Popov).
  • 提升大整数和 Decimal 类型过滤时的性能。#45949 (李扬)。
  • 这一改动可以有效降低从 ColumnNullable(UInt8) 获取过滤器的开销,并提升整体查询性能。为评估该改动的影响,我们采用了 TPC-H 基准测试,同时将列类型从非可空修改为可空,并以其查询的 QPS 作为性能指标进行测量。#45962Zhiguo Zhou)。
  • 将虚拟列 _part_partition_id 的类型更改为 LowCardinality(String)。修复了 #45964#45975flynn)。
  • 在小数位数不变时提升 Decimal 转换的性能。#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 导致的性能退化问题。#46309Alexey Milovidov)。
  • 即使在复制队列很大的情况下,replicas_status 接口也会快速响应。#46310 (Alexey Milovidov)。
  • 为聚合函数 sum、一元算术函数和比较函数添加 AVX-512 支持。#37870 (zhao zhou)。
  • 重写了与 marks 分布及整体读取协调相关的代码,以获得尽可能大的性能提升。关闭了 #34527#43772Nikita Mikhaylov)。
  • 在查询(子查询)中移除多余的 DISTINCT 子句。在查询计划层实现。它对 DISTINCT 子句进行了与 optimize_duplicate_order_by_and_distinct 类似的优化。可通过 query_plan_remove_redundant_distinct 设置启用。相关内容:#42648#44176Igor Nikonov)。
  • 一些查询改写优化:sumIf(123, cond) -> 123 * countIf(1, cond)sum(if(cond, 123, 0)) -> 123 * countIf(cond)sum(if(cond, 0, 123)) -> 123 * countIf(not(cond)) #44728李扬)。
  • 改进了在顶层查询计划中,受内存限制的合并与有序聚合(AIO)之间的交互方式。此前,在某些其实不需要的场景下,我们在 AIO 中会回退到显式排序。#45892 (Nikita Taranov)。
  • 并发合并现在默认使用轮询(round-robin)方式进行调度,以确保公平且避免饥饿现象。此前在负载很高的分片上,由于使用严格优先级调度策略,大型合并任务可能会被小型合并任务“饿死”。新增 background_merges_mutations_scheduling_policy 服务器配置选项,用于选择调度算法(round_robinshortest_task_first)。#46247 (Sergei Trifonov)。

改进

  • 在 ZooKeeper 会话丢失时,默认启用 INSERT 的重试机制。该功能已在生产环境中使用。#46308 (Alexey Milovidov)。
  • 为命名元组在 JSON 对象中添加忽略未知键的支持(input_format_json_ignore_unknown_keys_in_named_tuple)。#45678Azat Khuzhin)。
  • 支持将带有 final 的查询中使用排序键表达式的 where 子句下推到 prewhere 以进行优化。#38893#38950 (hexiaoting)。
  • 为备份新增监控指标:num_processed_filesprocessed_files_size,用于描述实际处理的文件数量和大小。#42244 (Aleksandr)。
  • 在服务器间出现 DNS 错误时增加了重试机制。#43179Anton Kozlov)。
  • Keeper 改进:尝试在磁盘上预分配空间,以避免出现不可预期的磁盘空间耗尽问题。新增设置 max_log_file_size,用于指定 Keeper 的 Raft 日志文件的最大大小。#44370 (Antonio Andelic)。
  • 在副本为只读时,优化副本延迟 API 的处理逻辑。#45148 (mateng915).
  • clickhouse-client 中,如果空密码不正确,则以交互方式提示输入密码。关闭 #46702#46730Nikolay 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 兼容。#45631Han 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 所必需的。#45661Alexey 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 中引入的、使用 GetObjectAttributes 请求替代 HeadObject 的做法改为可选(且默认禁用)。#45701Vitaly Baranov)。
  • 新增基于连接名称覆盖连接设置的功能(这意味着你现在无需为每个连接单独存储密码,只需将所有内容放入 ~/.clickhouse-client/config.xml,甚至可以为不同连接使用不同的历史记录文件,这也很实用)。#45715 (Azat Khuzhin)。
  • Arrow 格式:支持 duration 类型。解决 #45669 问题。#45750 (flynn)。
  • 增强查询缓存的日志记录,以便更好地排查和分析缓存行为。 #45751 (Robert Schulze).
  • 查询缓存的服务器级设置现在支持在运行时重新配置。#45758Robert Schulze)。
  • 当表函数的参数使用命名集合指定时,在日志中隐藏密码。 #45774 (Vitaly Baranov).
  • 改进内部 S3 客户端,使其能够针对不同类型的 URL 正确识别区域和重定向。#45783 (Antonio Andelic)。
  • 在 generateRandom 中新增对 Map、IPv4 和 IPv6 类型的支持,主要用于测试。#45785 (Raúl Marín)。
  • 在 IP 类型上支持使用 empty/notEmpty。#45799Yakov Olkhovskiy)。
  • num_processed_files 被拆分成两列:num_files(用于 BACKUP)和 files_read(用于 RESTORE)。列 processed_files_size 被拆分成两列:total_size(用于 BACKUP)和 bytes_read(用于 RESTORE)。#45800Vitaly 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#45936Vitaly Baranov)。
  • 修复 tupleElement,使其在参数为 Null 时返回 Null。关闭 #45894#45952flynn)。
  • 当没有任何文件匹配 S3 通配符时抛出错误。关闭 #45587#45957chen)。
  • 使用集群状态数据检查备份/恢复的并发情况。#45982 (SmitaRKulkarni).
  • ClickHouse Client:在模糊搜索中使用“exact”匹配,它能正确实现大小写不敏感,并采用更适合匹配 SQL 查询的算法。 #46000 (Azat Khuzhin).
  • 禁止使用错误的视图创建语法 CREATE View X TO Y AS SELECT。关闭 #4331#46043flynn)。
  • Log 系列存储支持设置 storage_policy。修复了 #43421#46044flynn)。
  • 改进结果为空时的 JSONColumns 格式。关闭 #46024#46053flynn)。
  • 为 SipHash128 添加参考实现。 #46065 (Salvatore Mesoraca).
  • 新增一个新指标,用于记录通过 mmap 进行内存分配的耗时和字节数。#46068 (李扬)。
  • 当前,对于 leftPadrightPadleftPadUTF8rightPadUTF8 这类函数,第二个参数 length 必须为 UInt8|16|32|64|128|256 之一。对于 ClickHouse 用户来说,这个限制过于严格,而且也与 arrayResizesubstring 等其他类似函数的行为不一致。#46103李扬)。
  • 在 debug 构建中,当 welchTTest 函数计算得到的统计量为 NaN 时,修复其断言问题,并将其行为与其他类似函数统一。将 studentTTest 的行为改为返回 NaN 而不是抛出异常,因为之前的行为在使用中不够方便。关闭 #41176#42162#46141Alexey Milovidov)。
  • 更方便地使用大整数以及带 WITH FILL 的 ORDER BY。在对大(128 位和 256 位)整数使用 ORDER BY 且配合 WITH FILL 时,允许使用普通整数作为 WITH FILL 的起始和结束点。修复了对于起始或结束点为负数的大整数范围会产生错误结果的问题。关联问题 #16733 已关闭。参见 #46152Alexey Milovidov)。
  • issue 中,为 system.tables 表添加了 partsactive_partstotal_marks 列。#46161attack204)。
  • 函数 "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" 现在会拒绝那些在 vectorscan 中极有可能被非常缓慢地执行的正则表达式。#46167 (Robert Schulze)。
  • 当启用 insert_null_as_default 且列未定义默认值时,将使用该列类型的默认值。本 PR 还修复了在 LowCardinality 列中针对 null 使用默认值的情况。#46171Kruglov Pavel)。
  • 对于 S3 客户端,建议优先显式定义访问密钥。如果将 use_environment_credentials 设置为 true,并且用户通过查询或配置提供了访问密钥,则会优先使用用户提供的密钥,而不是环境变量中的密钥。#46191Antonio Andelic)。
  • 为函数 formatDateTime() 添加别名 DATE_FORMAT(),以提高与 MySQL SQL 方言的兼容性,并为函数 formatDateTime 扩展格式替代符 "a""b""c""h""i""k""l""r""s""W"
  • 添加与并行副本(s3ClusterMergeTree 表)回调任务相关的 ProfileEventsCurrentMetrics#46313 (Alexey Milovidov).
  • 为使用 KeeperMap 存储引擎的表添加对 DELETEUPDATE 操作的支持。#46330 (Antonio Andelic)。
  • 支持在 RENAME 查询中使用查询参数。修复了 #45778#46407Nikolay Degterinsky)。
  • 使用 REPLACE 转换器修复参数化 SELECT 查询。解决了 #33002#46420Nikolay Degterinsky)。
  • 在计算异步指标 "NumberOfDatabases" 时,将用于临时/外部表的内部数据库排除在外。这样可使其行为与系统表 "system.databases" 保持一致。#46435 (Robert Schulze)。
  • distribution_queue 表中新增了 last_exception_time 列。#46564 (Aleksandr).
  • 在参数化视图中支持在 IN 子句中使用参数。 #46583 (SmitaRKulkarni).
  • 不要在服务器启动时加载命名集合(改为在首次访问时再加载)。 #46607 (Kseniia Sumarokova).

构建/测试/打包改进

  • 引入由 LLVM 运行时实现的 GWP-ASan。此更改关闭了 #27039#45226Han Fei)。
  • 为了让我们的测试变得不那么稳定、更容易随机失败:在测试中为 MergeTree 设置添加随机化。#38983Anton Popov)。
  • 在 PowerPC 上启用 HDFS 支持,从而修复以下功能测试:02113_hdfs_assert.sh、02244_hdfs_cluster.sql 和 02368_cancel_write_into_hdfs.sh。#44949MeenaRenganathan22)。
  • 为 clickhouse-keeper 添加 systemd.service 文件。修复 #44293#45568Mikhail f. Shiryaev)。
  • ClickHouse 的 poco fork 从 "contrib/" 移动到了 "base/poco/"。#46075Robert Schulze)。
  • clickhouse-watchdog 添加一个用于重启子进程的选项。但这一选项并不是特别有用。#46312Alexey Milovidov)。
  • 如果环境变量 CLICKHOUSE_DOCKER_RESTART_ON_EXIT 被设置为 1,Docker 容器将以子进程的方式运行 clickhouse-server 而不是作为第一个进程运行,并在其退出时重新启动它。#46391Alexey Milovidov)。
  • 修复 Systemd 服务文件。#46461SuperDJY)。
  • 将构建 ClickHouse 所需的最低 Clang 版本从 12 提升到 15。#46710Robert Schulze)。
  • 将 Intel QPL 从 v0.3.0 升级到 v1.0.0,并构建 libaccel-config,将其静态链接到 QPL 库(而不是动态链接)。#45809jasperzhu)。

Bug 修复(官方稳定版本中用户可见的异常行为)

  • StorageRabbitMQ 中精确按照 rabbitmq_flush_interval_msrabbitmq_max_block_size 刷新数据。修复 #42389。修复 #45160#44404Kseniia Sumarokova)。
  • sparkBar 函数中使用 PODArray 进行渲染,以便更好地控制内存使用。关闭 #44467#44489 (Duc Canh Le)。
  • 修复 quantilesExactExclusive 和 quantilesExactInclusive 函数返回未排序数组元素的问题。 #45379 (wujunfu).
  • 修复在启用 OpenTelemetry 时 HTTPHandler 中的未捕获的异常。#45456 (Frank Chen)。
  • 不要将 8 位数字推断为日期。这可能导致读取到错误的数据。 #45581 (Kruglov Pavel)。
  • 修复了对 odbc_bridge_use_connection_pooling 设置的使用方式,使其能够被正确使用。#45591 (Bharat Nallan)。
  • 当缓存中的回调被调用时,缓存对象本身可能已经被销毁。为保证安全,我们按值捕获成员。对任务调度来说这同样是安全的,因为任务调度会在存储被销毁之前被停用。解决 #45548#45601Han Fei)。
  • 修复在将 Delta 或 DoubleDelta 编解码器与 Gorilla 编解码器组合使用时出现的数据损坏。#45615 (Robert Schulze)。
  • 在使用 N-gram 布隆过滤器索引时正确进行类型检查,以避免无效读取。#45617 (Antonio Andelic).
  • 有人报告了几起与 c-ares 相关的段错误。它们是在我之前的 Pull Request 中引入的。在 Alexander Tokmakov 的帮助下,我已经修复了这些问题。#45629Arthur Passos)。
  • 在遇到重复主键时修正键描述。这种情况可能会出现在投影(projection)中。详情参见 #45590#45686Amos Bird)。
  • 为备份设置压缩方法和级别。关闭了 #45690#45737Pradeep Chhetri)。
  • 应使用 select_query_typed.limitByOffset 而不是 select_query_typed.limitOffset#45817刘陶峰)。
  • 在使用 experimental analyzer 时,像 SELECT number FROM numbers(100) LIMIT 10 OFFSET 10; 这样的查询会得到错误结果(该 SQL 返回空结果集)。这是由于查询规划器额外添加了一个不必要的 offset 步骤所致。#45822刘陶峰)。
  • 向后兼容 —— 允许从 UInt64 到 IPv4 的隐式类型收窄转换,这是 INSERT ... VALUES ... 表达式所必需的。 #45865 (Yakov Olkhovskiy)。
  • 修复 IPv6 解析器在处理缺失首个八位组的混合 IPv4 地址时的错误(例如 ::.1.2.3)。 #45871 (Yakov Olkhovskiy).
  • system.processes 表和 SHOW PROCESSLIST 查询中添加 query_kind 列,并移除重复代码。此更改修复了一个问题:全局配置参数 max_concurrent_select_queries 在带有 INTERSECTEXCEPT 链的查询中未被正确应用。#45872 (Alexey Milovidov)。
  • 修复函数 stochasticLinearRegression 中的崩溃问题。该问题由 WingFuzz 发现。#45985 (Nikolai Kochetov)。
  • 修复带有 INTERSECTEXCEPT 修饰符的 SELECT 查询在从启用了稀疏列(由设置 ratio_of_defaults_for_sparse_serialization 控制)的表中读取数据时发生崩溃的问题。 #45987 (Anton Popov).
  • 修复在带有 FINAL 的 DESC 排序中顺序读取(read in order)优化的问题,关闭 #45815#46009Vladimir C)。
  • 修复在紧凑数据片段中读取多级不存在的嵌套列的问题。 #46045 (Azat Khuzhin).
  • 修复 system.processeselapsed 列存在 10 倍误差的问题。 #46047 (Azat Khuzhin).
  • 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”的后续修复 https://github.com/ClickHouse/ClickHouse/pull/43221#46087Yakov Olkhovskiy)。
  • 修复在参数已具有值时配置中的环境变量替换问题。关闭了 #46131。关闭了 #9547#46144pufit)。
  • 修复在 grouping sets 中不正确的谓词下推。关闭 #45947#46151 (flynn)。
  • 修复在使用常量键的 fulls_sorting_join 中可能导致处理管道卡住的问题。#46175Vladimir C)。
  • 不要在格式化时将 tuple 函数改写为字面量,否则可能导致结果不正确。 #46232 (Salvatore Mesoraca).
  • 修复在以 Arrow 格式读取 LowCardinality(Nullable) 数据时可能出现的越界错误。#46270Kruglov Pavel)。
  • 修复 SYSTEM UNFREEZE 查询因抛出异常 CANNOT_PARSE_INPUT_ASSERTION_FAILED 而失败的问题。#46325 (Aleksei Filatov)。
  • 修复在反序列化由存储 HashTable 的函数产生的聚合状态时,因整数溢出而可能发生的崩溃问题。 #46349 (Nikolai Kochetov)。
  • 修复在使用 VALUES 格式异步插入无效数据时可能出现的 LOGICAL_ERROR#46350Anton Popov)。
  • 修复了在尝试执行 ALTER ... MOVE PART ... TO TABLE 时出现的 LOGICAL_ERROR。此类查询实际上从未真正被支持过。#46359 (Alexander Tokmakov)。
  • 在启用 parallel_distributed_insert_select 时,修复并行分布式 INSERT SELECT 中 s3Cluster 的 schema 推断。#46381 (Kruglov Pavel)。
  • 修复类似 ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ... 的查询,其中 arr1arr2 是同一 Nested 列中的字段。 #46387 (Anton Popov).
  • 调度器可能无法调度某个任务。如果发生这种情况,应中止整个 MulityPartUpload 过程,并且 UploadHelper 必须等待已调度的任务完成。#46451 (Dmitry Novik)。
  • 修复在列默认类型不同的 Merge 引擎表上的 PREWHERE 行为(修复当列的默认类型不同时出现的一些 NOT_FOUND_COLUMN_IN_BLOCK 错误;并在跨表列类型相同时允许使用 PREWHERE,仅在类型不同时加以禁止)。#46454Azat Khuzhin)。
  • 修复在 ORDER BY 中使用常量值时可能出现的崩溃。修复了 #46466#46493Nikolai Kochetov)。
  • 如果在查询级别指定了 disk 设置,而在合并树(MergeTree)配置的设置部分中指定了 storage_policy,则不再抛出异常。disk 将覆盖配置中的设置。 #46533 (Kseniia Sumarokova).
  • 修复函数 arrayMap 中对常量 LowCardinality 参数的不正确处理。此错误在发行版中可能导致段错误,在调试版本中会导致逻辑错误 Bad cast#46569Alexey Milovidov)。
  • 修复 #46557#46611Alexander Gololobov)。
  • 修复当服务器无法在 1 分 30 秒内启动时,clickhouse-server systemd 单元无限重启的问题(禁用 systemd 服务在启动 clickhouse-server 时的超时逻辑)。#46613Azat Khuzhin)。
  • 在异步插入过程中分配的内存缓冲区在全局上下文中被释放,但对应用户和查询的 MemoryTracker 计数器未被正确更新,从而导致误报的内存不足(OOM)异常。#46622 (Dmitry Novik)。
  • 已更新为不再从 table_join 中清除 on_expression,因为后续的 analyze 运行仍会使用它,从而修复了 #45185#46487SmitaRKulkarni)。

ClickHouse 版本 23.1,2023-01-26

ClickHouse 版本 23.1

升级说明

  • SYSTEM RESTART DISK 查询现在变为 no-op(无操作)。#44647 (alesapin)。
  • HASHED/SPARSE_HASHED 字典的 PREALLOCATE 选项现在变为 no-op(无操作)。#45388 (Azat Khuzhin)。它不再带来显著优势。
  • 禁止在非 Float32 或非 Float64 类型的列上使用 Gorilla 编解码器。#45252 (Robert Schulze)。这原本就没有意义,并且会导致结果不一致。
  • 使用已废弃语法创建的 *MergeTree 表在并行 quorum 插入时可能工作不正确。因此,对此类表完全禁用了并行 quorum 插入的支持。这不会影响使用新语法创建的表。#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 表引擎指定查询参数。已解决 #40907#41687 (SmitaRKulkarni)。
  • 新增 quantileInterpolatedWeighted/quantilesInterpolatedWeighted 函数。#38252 (Bharat Nallan).
  • Map 类型提供 array join 支持,类似于 Spark 中的 explode 函数。#43239 (李扬)。
  • 支持 SQL 标准的二进制和十六进制字符串字面量。#43785 (Mo Xuan)。
  • 允许使用 Joda-Time 风格格式化 DateTime。详见 Joda-Time 文档#43818李扬)。
  • formatDateTime 实现了用于格式化秒的小数部分的格式化符(%f)。#44060 (ltrk2)。#44497 (Alexander Gololobov)。
  • 添加了 age 函数,用于计算两个日期或日期时间值之间的差值,并以完整时间单位的数量表示。关闭 #41115#44421Robert Schulze)。
  • 为字典添加 Null 源。关闭了 #44240#44502mayamika)。
  • 允许通过 s3_storage_class 配置项来设置 S3 存储类,例如 <s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>。已关闭 #44443#44707 (chen)。
  • 在解析命名元组时,如果 JSON 对象中缺少元素,则插入默认值。新增设置项 input_format_json_defaults_for_missing_elements_in_named_tuple 来控制此行为。修复 #45142#issuecomment-1380153217。 #45231Kruglov Pavel)。
  • 在 ProfileEvents 中记录服务器启动时间(ServerStartupMilliseconds)。修复 #43188#45250SmitaRKulkarni)。
  • 重构并改进 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 函数添加正确的实现(格式重构带来的额外收益)。#42777Kruglov Pavel)。
  • 支持在 CapnProto 格式中将 Nested 表读写为由 Struct 组成的 List。将 Decimal32/64 读写为 Int32/64。修复了 #43319#43379Kruglov Pavel)。
  • system.text_log 添加了 message_format_string 列。该列包含用于格式化日志消息的模板。#44543Alexander Tokmakov)。从而可以对 ClickHouse 日志进行多种分析。
  • 尝试在 CSV/TSV/CustomSeparated 输入格式中自动检测包含列名(以及可能包含类型)的表头行。 新增设置 input_format_tsv/csv/custom_detect_header 以启用该行为(默认启用)。修复并关闭 #44640#44953Kruglov Pavel)。

实验性功能

  • 添加了一种实验性的倒排索引,作为新的二级索引类型,用于高效文本搜索。#38667larryluogit)。
  • 添加了实验性的查询结果缓存。#43797Robert Schulze)。
  • 添加了用于 IO 请求的可扩展且可配置的调度子系统(尚未与 IO 代码本身集成)。#41840Sergei Trifonov)。该功能目前完全没有任何作用,敬请欣赏。
  • 添加了 SYSTEM DROP DATABASE REPLICA,用于移除 Replicated 数据库中失效副本的元数据。解决了 #41794#42807Alexander Tokmakov)。

性能优化

  • 启动时不再加载 MergeTree 表中的非活跃数据部分。#42181 (Anton Popov)。
  • 在包含大量小文件的场景下,降低了从存储 S3 和表函数 s3 读取时的延迟。现在,从存储 S3 读取时,配置项 remote_filesystem_read_methodremote_filesystem_read_prefetch 会生效。#43726 (Anton Popov).
  • 针对在 Parquet/ORC 文件中读取结构体字段的优化。仅加载所需字段。#44484 (lgbo).
  • 此前,通过 HTTP 接口执行查询时,两级聚合算法被错误地禁用了。现已重新启用,从而带来了显著的性能改进。 #45450 (Nikolai Kochetov).
  • 为 StorageFile 新增了 mmap 支持,有望提升 clickhouse-local 的性能。#43927 (pufit)。
  • 在 HashedDictionary 中添加了对分片(sharding)的支持,以实现并行加载(可随分片数量几乎线性扩展)。 #40003 (Azat Khuzhin).
  • 提升查询解析速度。#42284 (Raúl Marín)。
  • exprLowCardinality 列时,始终将类似 expr = x1 OR ... OR expr = xN 的 OR 链替换为 expr IN (x1, ..., xN)。在这种情况下,将忽略 optimize_min_equality_disjunction_chain_length 设置。#42889 (Guo Wangyang)。
  • 通过优化与 ThreadStatus 相关的代码,略微提升了性能。#43586 (Zhiguo Zhou).
  • 通过实现自动向量化来优化按列的三值逻辑求值。在该微基准测试的性能测试中,我们在 ICX 设备(Intel Xeon Platinum 8380 CPU)上观测到最高可达 21 倍性能提升#43669Zhiguo Zhou)。
  • 尽量避免在 system.tables 表上获取读锁。#43840 (Raúl Marín)。
  • 优化 ThreadPool。基于在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核心,160 线程)上进行的 SSB(Star Schema Benchmark)性能实验表明,此更改可以将对 ThreadPoolImpl::mutex 的锁争用有效减少 75%,提高 CPU 利用率,并将整体性能提升 2.4%#44308 (Zhiguo Zhou).
  • 现在,只有当缓存的哈希表大小足够大时(阈值是基于经验确定并硬编码在代码中的),才会启用用于预测哈希表大小的优化。#44455Nikita Taranov)。
  • 对从远程文件系统进行异步读取进行了小幅性能提升。#44868 (Kseniia Sumarokova).
  • 为以下表达式添加快速路径:- col like '%%'; - col like '%'; - col not like '%'; - col not like '%'; - match(col, '.*')#45244李扬)。
  • 对过滤(WHERE 子句)的正常执行路径进行了小幅优化。#45289 (Nikita Taranov).
  • toUnixTimestamp64* 提供单调性信息,以便在索引分析中进行更多代数优化。#44116 (Nikita Taranov)。
  • 允许配置用于查询处理的临时数据(溢写到磁盘),使其能够与文件系统缓存协同工作(占用缓存磁盘空间)#43972Vladimir C)。这主要提升了 ClickHouse Cloud 的表现,但如果你清楚如何配置,也可以用于自主管理的部署。
  • system.replicas 表支持并行获取副本状态。解决了 #43918#43998Nikolay 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_parsingsupports_parallel_formatting,以改进自检能力。 #45499 (Anton Popov)。
  • 改进对 CustomSeparated/Template 格式中 CSV 字段的读取,并关闭 #42352#39620#43332Kruglov Pavel)。
  • 统一查询耗时的度量方式。 #43455 (Raúl Marín).
  • SELECT 查询中存在虚拟列时,改进在表函数 file/hdfs/s3 中自动使用插入表结构的机制,以避免可能出现的 Block structure mismatchnumber of columns mismatch 错误。 #43695 (Kruglov Pavel).
  • 为函数 range 增加对有符号参数的支持。修复了 #43333#43733sanyu)。
  • 移除冗余排序,例如去除子查询中与 ORDER BY 子句相关的排序步骤。该功能基于查询计划实现。它对 ORDER BY 子句的优化与 optimize_duplicate_order_by_and_distinct 类似,但更加通用,因为它适用于任意冗余的排序步骤(不仅限于由 ORDER BY 子句引起的排序),并且可应用于任意深度的子查询。相关问题:#42648#43905Igor Nikonov)。
  • 为 BACKUP 新增可禁用文件去重的选项(对于不启用去重的备份,可以使用 ATTACH 来替代完整的 RESTORE)。例如:BACKUP foo TO S3(...) SETTINGS deduplicate_files=0(默认值为 deduplicate_files=1)。#43947Azat Khuzhin)。
  • 重构并改进文本格式的 schema 推断。新增设置 schema_inference_make_columns_nullable,用于控制是否将结果类型设为 Nullable(默认启用);#44019 (Kruglov Pavel)。
  • PROXYv1 协议提供了更好的支持。#44135 (Yakov Olkhovskiy)。
  • 将清理线程最近一次对 part 的检查信息添加到 system.parts 表中。#44244 (Dmitry Novik)。
  • 在只读模式下禁止使用表函数进行插入。 #44290 (SmitaRKulkarni).
  • 添加配置项 simultaneous_parts_removal_limit,用于限制 CleanupThread 单次迭代可处理的 part 数量。#44461 (Dmitry Novik)。
  • 当查询中只需要虚拟列时,不要初始化 ReadBufferFromS3。这可能有助于解决 #44246 中的问题。#44493chen)。
  • 防止列名提示中出现重复的列名。关闭 #44130#44519Joanna Hulboj)。
  • 允许在磁盘 endpoint 中使用宏替换。修复 #40951#44533SmitaRKulkarni)。
  • 在启用 input_format_json_read_object_as_string 时改进了模式推断。#44546Kruglov Pavel)。
  • 添加一个用户级设置 database_replicated_allow_replicated_engine_arguments,用于禁止在 DatabaseReplicated 中创建带参数的 ReplicatedMergeTree 表。#44566alesapin)。
  • 防止用户误将 index_granularity 设置为零(无效值)。修复了 #44536#44578Alexey 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 输入/输出格式会将 bool 类型解析为 ClickHouse 的 bool 类型。#44684 (Kruglov Pavel)。
  • 在 Arrow/Parquet/ORC 中支持布尔类型。修复 #43970#44698Kruglov Pavel)。
  • 读取 UUID 时不要贪婪地解析超出引号的内容——这可能会导致错误数据被误判为解析成功。#44686 (Raúl Marín).
  • 在 Int64 溢出时推断为 UInt64,并修复 schema 推断中的部分转换。#44696 (Kruglov Pavel)。
  • 以前在 Replicated 数据库中解析依赖关系是通过一种比较取巧的方式实现的,现在改为使用显式图来正确处理。#44697 (Nikita Mikhaylov)。
  • 修复 output_format_pretty_row_numbers 在跨数据块时无法保持计数器连续的问题。关闭 #44815#44832flynn)。
  • 不要在 system.errors 中报告因在后台清理进程中并发合并数据片段而产生的错误。#44874 (Raúl Marín)。
  • 优化并修复 Distributed async INSERT 的指标。#44922Azat Khuzhin)。
  • 新增用于禁止并发备份和恢复的设置,解决了 #43891 问题。实现:* 新增服务器级别设置以禁止并发备份和恢复,这些设置会在 Context 中创建 BackupWorker 时读取并应用。* 设置默认值为 true。* 在开始备份或恢复之前,增加检查以确认是否有其他备份/恢复正在运行。对于内部请求,会通过 backup_uuid 检查其是否来自本节点。#45072 (SmitaRKulkarni)。
  • 为系统日志新增 <storage_policy> 配置参数。#45320 (Stig Bakken)。

构建/测试/打包改进

  • 为 ClickHouse 客户端/本地历史记录中的模糊搜索,对用 Rust 编写的 skim 库进行静态链接。#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).
  • 自动合并处于 green 状态的 backport PR 和已批准且为 green 状态的 PR。#41110 (Mikhail f. Shiryaev).
  • 推出一个用于查看 ClickHouse CI 状态的网站源码

Bug 修复

  • 将域 IP 类型(IPv4、IPv6)替换为原生类型。#43221Yakov Olkhovskiy)。这会自动补齐代码中部分缺失的实现。
  • 修复在备份过程中 mutation 操作被终止时的备份流程。#45351Vitaly Baranov)。
  • 修复 Invalid number of rows in Chunk 异常信息。#41404#42126Alexander Gololobov)。
  • 修复在排序后执行表达式时可能会使用未初始化的值的问题。关闭 #43386 #43635Kruglov Pavel)。
  • 改进在聚合组合器中对 NULL 的处理,修复在使用冷门优化 optimize_rewrite_sum_if_to_count_if 时可能出现的段错误或逻辑错误。关闭 #43758#43813Kruglov Pavel)。
  • 修复 CREATE USER/ROLE 查询的 SETTINGS 相关约束。#43993 (Nikolay Degterinsky)。
  • 修复了表元数据中 EPHEMERAL 列默认值无法解析的问题。#44026Yakov Olkhovskiy)。
  • 修复从兼容性设置中解析到错误版本的问题。#44224Kruglov Pavel)。
  • 使对 datetime 执行 interval 减法的行为与加法保持一致。#44241 (ltrk2)。
  • 取消视图结果大小的上限。 #44261 (lizhuoyu5).
  • do_not_evict_index_and_mrk_files=1 时,修复缓存中可能出现的逻辑错误。修复了 #42142#44268Kseniia Sumarokova)。
  • 修复写穿缓存中可能出现的缓存写入过早中断问题(在本不应停止缓存时,错误假设可能导致缓存被停止)。#44289 (Kseniia Sumarokova).
  • 修复在将带有常量参数的 IN 函数作为常量参数并与 LowCardinality 一起使用时可能发生的崩溃。修复了 #44221#44346Nikolai Kochetov)。
  • 修复了参数化聚合函数对复杂参数(如数组)的支持问题。此更改解决了 #30975。在此更改之前,聚合函数 sumMapFiltered 无法在分布式查询中使用。#44358Alexey Milovidov)。
  • 修复 BSON schema 推断中读取 ObjectId 的问题。#44382 (Kruglov Pavel)。
  • 修复 ReplicatedMergeTree 中的竞争条件,该问题可能导致在合并完成前过早删除临时 part。此问题可能会导致出现 No such file or directory: xxx 之类的错误。修复了 #43983#44383alesapin)。
  • 如果未指定集群名称,一些无效的 SYSTEM ... ON CLUSTER 查询会产生意外的行为。现已修复,现在无效查询会按预期抛出 SYNTAX_ERROR。修复 #44264#44387Alexander Tokmakov)。
  • 修复在 ORC 格式下读取 Map 类型的问题。 #44400 (Kruglov Pavel).
  • 修复了在 Parquet/ORC 格式中读取输入数据时访问不存在列的问题。此前这种情况可能会导致 INCORRECT_NUMBER_OF_COLUMNS 错误。相关问题 #44333#44405Kruglov Pavel)。
  • 此前,bar 函数使用相同的 '▋'(U+258B "Left five eighths block")字符来显示 5/8 和 6/8 的条形。此更改通过在显示 6/8 条形时改用 '▊'(U+258A "Left three quarters block")来纠正这一行为。#44410Alexander Gololobov)。
  • 在配置文件中将 profile 设置放在 profile 设置约束之后会导致这些约束失效。#44411Konstantin Bogdanov)。
  • 修复在运行包含数据的 EXPLAIN AST INSERT 查询时出现的 SYNTAX_ERROR。修复 #44207#44413save-my-heart)。
  • 修复在 CSV 格式中读取带有 CRLF 的 bool 值的问题。修复 #44401#44442Kruglov Pavel)。
  • 不要对 LowCardinality 字典执行 and/or/if/multiIf 函数,因此结果类型不能为 LowCardinality,否则在某些情况下可能会触发 Illegal column ColumnLowCardinality 错误。修复了 #43603#44469Kruglov Pavel)。
  • 通过设置项 max_streams_for_merge_tree_reading 修复 mutation 相关问题。#44472 (Anton Popov)。
  • 修复在 ASTSelectQuery::formatImpl 中使用 GROUPING SETS 时可能出现的空指针解引用问题(#43049)。#44479Robert Schulze)。
  • 按照设置,对表函数参数、CAST 函数参数以及 JSONAsObject 的 schema 推断进行类型校验。 #44501 (Kruglov Pavel).
  • 修复在 LowCardinality 与常量列配合使用时的 IN 函数问题,关闭 #44503#44506Duc Canh Le)。
  • 修复了在 CREATE TABLE 语句中对 DEFAULT 表达式进行规范化时的一个错误。函数 in 的第二个参数(或运算符 IN 的右侧参数)在执行 CREATE 查询时可能会被替换为其求值结果。修复了 #44496#44547Alexander Tokmakov)。
  • 在包含 WITH ROLLUP、WITH CUBE 或 WITH TOTALS 的查询中,Projections 不会生效。在先前的版本中,此类查询会抛出异常,而不是直接跳过对 Projections 的使用。该更改关闭了 #44614。同时关闭了 #42772#44615Alexey 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#44673Nikolai Kochetov)。
  • 避免在 Executable 表引擎中抛出 std::out_of_range 异常。#44681 (Kruglov Pavel)。
  • 不要对 AST 中的分位数应用 optimize_syntax_fuse_functions,关闭 #44712#44713Vladimir C)。
  • 修复 Merge 表与 PREWHERE 中类型错误的 bug,关闭 #43324#44716Vladimir C)。
  • 修复了在关闭过程中(销毁 TraceCollector 时)可能发生的崩溃问题。修复 #44757#44758Nikolai Kochetov)。
  • 修复了分布式查询处理中的一个潜在崩溃问题。当带有 totals 或 extremes 的查询返回空结果且 Distributed 表与本地表之间存在类型不匹配时,可能会导致崩溃。修复了 #44738#44760Nikolai Kochetov)。
  • 修复在抓取(min_compressed_bytes_to_fsync_after_fetch)和变更(min_rows_to_fsync_after_merge / min_compressed_bytes_to_fsync_after_merge)操作中,对小文件(ttl.txt、columns.txt)执行 fsync 的问题。 #44781 (Azat Khuzhin).
  • 在数据片段在磁盘之间移动的情况下,当查询 system.partssystem.parts_columns 表时,可能会出现一种罕见的竞态条件。此问题在 #41145 中被引入,并在 #44809 中修复(Alexey Milovidov)。
  • 修复在启用投影优化时可能出现的 Context has expired 错误。该问题可在包含特定函数(例如在运行时使用上下文的 dictHas/dictGet)的查询中重现。修复了 #44844#44850Nikolai Kochetov)。
  • 修复了在从远程文件系统读取 LowCardinality 字典时可能出现的 Cannot read all data 错误,对应修复了 #44709#44875Nikolai Kochetov)。
  • 当无法读取硬件监控传感器时,忽略这些情况,而不是在日志中输出完整的异常信息。#44895 (Raúl Marín)。
  • 如果计算出的 INSERT 延迟时间超过该设置值,则改用 max_delay_to_insert 的值。相关问题见 #44902#44916Igor Nikonov)。
  • 修复在包含 UNION 的查询中出现的错误 Different order of columns in UNION subquery。修复了 #44866#44920Nikolai Kochetov)。
  • INSERT 操作的延迟可能被错误计算,这会导致始终使用 max_delay_to_insert 作为延迟值,而不是正确计算出的数值。应使用简单公式 max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold),即延迟会随着超过阈值的 part 数量成比例增长。修复了 #44902#44954Igor Nikonov)。
  • 修复在宽 part 带有轻量级删除掩码时的 ALTER TABLE TTL 错误。 #44959 (Mingliang Pan).
  • 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”的后续修复 #43221#45024Yakov Olkhovskiy)。
  • 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”更改的后续修复 https://github.com/ClickHouse/ClickHouse/pull/43221#45043Yakov Olkhovskiy)。
  • 在解析器中存在可能的缓冲区溢出漏洞。通过模糊测试发现。#45047Alexey Milovidov)。
  • 修复 FileLog 存储引擎中可能出现的 cannot-read-all-data 错误。关闭 #45051#38257#45057Kseniia Sumarokova)。
  • 当查询中存在 grouping sets 时,将禁用内存高效聚合(distributed_aggregation_memory_efficient 设置)。#45058Nikita Taranov)。
  • 修复 RANGE_HASHED 字典,使在指定 update_field 时,更新过程中将范围列计入主键的一部分。关闭 #44588#45061Maksim Kita)。
  • 修复在嵌套 lambda 中捕获 LowCardinality 参数时出现的 Cannot capture column 错误。修复了 #45028#45065Nikolai Kochetov)。
  • 在使用 minmax/count 投影时,修复 additional_table_filters 导致的错误查询结果问题(未应用附加表过滤条件)。#45133Nikolai Kochetov)。
  • 修复了 histogram 函数接受负值的错误。#45147 (simpleton).
  • 修复 StorageJoin 中列可空性错误,关闭 #44940#45184Vladimir C)。
  • 修复 background_fetches_pool_size 设置在运行时增大时的重新加载问题。#45189Raúl Marín)。
  • 在 KV 引擎(例如 KeeperMap、EmbeddedRocksDB)上,当对键使用带有生成不同类型子查询的 IN 时,正确处理 SELECT 查询。#45215Antonio Andelic)。
  • 在某些情况下修复了 SEMI JOIN 与 join_use_nulls 的逻辑错误,关闭 #45163,关闭 #45209#45230 (Vladimir C)。
  • 修复从 S3 读取时出现的 heap-use-after-free 问题。 #45253 (Kruglov Pavel).
  • 修复当 Avro Union 类型为 ['null', Nested type] 时出现的错误,关闭 #45275。修复将 bytes 类型错误推断为 Float 的问题。#45276 (flynn)。
  • 当无法将显式 PREWHERE 与使用 Merge 存储引擎的表一起使用时,抛出正确的异常。#45319 (Antonio Andelic).
  • 在 WSL1 Ubuntu 下,自解压的 ClickHouse 因不一致导致解压失败——/proc/self/maps 报告的是 32 位文件的 inode,而 stat 报告的是 64 位 inode。#45339Yakov Olkhovskiy)。
  • 修复 Distributed 表启动过程中的竞态条件(可能导致异步 INSERT 文件被处理多次)。 #45360 (Azat Khuzhin).
  • 修复在从 S3 存储和表函数 s3 读取时,当 ListObject 请求失败可能导致的崩溃问题。#45371 (Anton Popov)。
  • 修复在存在结构不正确的字典(例如 XML 配置中类型不正确)时执行 SELECT ... FROM system.dictionaries 会抛出异常的问题。#45399Aleksei Filatov)。
  • 修复在 INSERT INTO ... SELECT * FROM s3Cluster 查询中基于插入表结构进行 s3Cluster 架构推断时的问题。 #45422 (Kruglov Pavel).
  • 修复了在通过 HTTP 解析 JSON/BSONEachRow 时可能导致某些列使用默认值而不是数据中值的一个 bug。#45424Kruglov Pavel)。
  • 修复了从文本源按类型解析 IP 类型数据时出现的错误(代码:632. DB::Exception: Unexpected data ... after parsed IPv6 value ...)。#45425Yakov Olkhovskiy)。
  • 关闭 #45297,添加对空正则表达式的检查。#45428 (Han Fei)。
  • 修复可能导致(尤其是在分布式场景下)查询挂起的问题。#45448 (Azat Khuzhin).
  • 修复在启用 allow_asynchronous_read_from_io_pool_for_merge_treeThreadPool::schedule 抛出异常时可能发生的死锁问题。#45481 (Nikolai Kochetov)。
  • 修复执行 DETACH 后表仍可能正在使用的问题。 #45493 (Azat Khuzhin).
  • 修复在查询被取消且执行过程中启用并行解析时会发生的罕见中止问题。 #45498 (Anton Popov).
  • 修复 Distributed 表创建与对其执行 INSERT 之间的竞争条件(可能会在向该表执行 INSERT 时导致 CANNOT_LINK 错误)。 #45502 (Azat Khuzhin).
  • 为缓存策略 getter 添加合理的默认值(SLRU)。修复 #45514#45524Kseniia Sumarokova)。
  • 禁止在变更(mutation)中使用 ARRAY JOIN,解决了 #42637 #44447SmitaRKulkarni)。
  • 修复了在使用表别名和列转换器时限定星号的处理问题。解决了问题 #44736#44755SmitaRKulkarni)。

2022 年变更日志

  • 目录
  • ClickHouse release 23.12, 2023-12-28
  • ClickHouse 版本 23.11,2023-12-06
  • ClickHouse 版本 23.10,2023-11-02
  • ClickHouse 发布 23.9,2023-09-28
  • ClickHouse 发行版 23.8 LTS,2023-08-31
  • ClickHouse 23.7 版本发布,2023-07-27
  • ClickHouse 发布 23.6,2023-06-29
  • ClickHouse 版本 23.5,2023-06-08
  • ClickHouse 版本 23.4,2023-04-26
  • ClickHouse 23.3 LTS 版本,2023-03-30
  • ClickHouse 版本 23.2,2023-02-23
  • ClickHouse 版本 23.1,2023-01-26
  • ClickHouse 版本 23.1
  • 2022 年变更日志