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

2023 年变更日志

目录

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

ClickHouse 23.12 版本(2023-12-28)

向后不兼容的变更

  • 修复对生存时间 (TTL) 表达式中非确定性函数的检查。此前,在某些情况下可以创建包含非确定性函数的 TTL 表达式,这在之后可能会导致未定义行为。本变更修复了 #37250。默认情况下,禁止不依赖表中任意列的 TTL 表达式。可以通过 SET allow_suspicious_ttl_expressions = 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)。

新功能

  • 实现了可刷新materialized view 功能,需求来源于 #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#57875zhongyuankai)。
  • 新增了一个变更命令 ALTER TABLE <table> APPLY DELETED MASK,用于强制执行由轻量级删除写入的掩码,并从磁盘中删除被标记为已删除的行。 #57433 (Anton Popov)。
  • 处理器 /binary 会打开一个可视化界面,用于查看 ClickHouse 二进制文件中的符号。#58211 (Alexey Milovidov)。
  • 新增了一个 SQL 函数 sqid,用于生成 Sqids(https://sqids.org/),示例:SELECT sqid(125, 126)#57512Robert Schulze)。
  • 新增函数 seriesPeriodDetectFFT,用于通过 FFT 检测序列周期。#57574 (Bhavna Jindal)。
  • 添加一个用于检查 Keeper 是否已就绪以接受流量的 HTTP 端点。#55876 (Konstantin Bogdanov)。
  • 为 schema 推断新增 'union' 模式。在该模式下,最终的表 schema 是所有文件 schema 的并集(即从每个文件分别推断 schema 并合并)。schema 推断模式由设置项 schema_inference_mode 控制,该设置项有两个可选值——defaultunion。关闭 #55428#55892 (Kruglov 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 FUNCTION。#57645 (Bharat Nallan)。
  • 添加 FORMAT_BYTES 作为 formatReadableSize 的别名。 #57592 (Bharat Nallan).
  • 允许向 s3 表函数传递可选的会话令牌。#57850 (Shani Elharrar).
  • 引入了一个新的设置项 http_make_head_request。如果将其关闭,URL 表引擎将不会执行 HEAD 请求来确定文件大小。这是为了支持那些低效、配置不当或不具备该功能的 HTTP 服务器。#54602Fionera)。
  • 现在可以在索引(非主键索引)定义中引用 ALIAS 列(issue #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)。

性能优化

  • 在执行 FINAL 处理期间,从 MergeTree 表中提取互不相交的分区片段范围,这样我们就可以避免对这些互不相交的分区片段范围执行额外的 FINAL 逻辑。在具有相同主键的重复值数量较少的情况下,性能几乎与不使用 FINAL 时相同。在启用 do_not_merge_across_partitions_select_final 设置时,提高 MergeTree 使用 FINAL 时的读取性能。#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 设置。#58218 (Maksim 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 已移至服务器级别。- 将设置 keep_alive_timeout 添加到服务器级别设置列表中。#57523Nikita Mikhaylov)。
  • 降低查询 system.filesystem_cache 时的内存占用。#57687 (Kseniia Sumarokova).
  • 降低字符串反序列化过程中的内存占用。 #57787 (Maksim Kita).
  • Enum 提供了更高效的构造函数,在 Enum 拥有大量枚举值时尤为有效。 #57887 (Duc Canh Le)。
  • 对从文件系统缓存读取的性能进行了改进:始终使用 pread 方法。#57970 (Nikita Taranov).
  • 在逻辑表达式优化器中为 AND notEquals 条件链添加优化。该优化仅在启用实验性 Analyzer 时可用。 #58214 (Kevin Mingtarja)。

改进

  • 在 Keeper 中支持内存软限制。当内存使用接近上限时,将拒绝新的请求。#57271Han Fei)。#57699Han Fei)。
  • 使对分布式表的插入能够正确处理更新后的集群配置。当集群节点列表被动态更新时,分布式表的 Directory Monitor 会相应更新该列表。#42826 (zhongyuankai)。
  • 禁止在合并参数不一致时创建副本表。 #56833 (Duc Canh Le).
  • system.tables 中显示未压缩的数据大小。#56618#57186Chen Lixiang)。
  • Distributed 表新增 skip_unavailable_shards 设置,其行为类似于对应的查询级设置。修复 #43666#57218Gagan Goel)。
  • 函数 substring(别名:substrmid)现在可以用于 Enum 类型。此前,第一个函数参数必须是 StringFixedString 类型的值。这提升了通过 MySQL 接口与 Tableau 等第三方工具的兼容性。#57277Serge Klochkov)。
  • format FUNCTION 现在支持任意类型的参数(而不仅仅是 StringFixedString 类型的参数)。这使得可以计算 SELECT format('The {0} to all questions is {1}', 'answer', 42)#57549Robert Schulze)。
  • 允许在使用 date_trunc 函数时,第一个参数不区分大小写。现在同时支持以下两种写法:SELECT date_trunc('day', now())SELECT date_trunc('DAY', now())#57624 (Yarik Briukhovetskyi)。
  • 当表不存在时提供更好的提示信息。#57342 (Bharat Nallan).
  • 允许在查询执行期间覆盖服务器设置 max_partition_size_to_dropmax_table_size_to_drop#57452 (Jordi Villar)。
  • 在 JSON 格式中,对未命名元组的类型推断进行了小幅改进。#57751 (Kruglov Pavel)。
  • 在连接 Keeper 时添加对只读标志的支持(修复 #53749)。#57479Mikhail Koviazin)。
  • 修复在从磁盘恢复批次期间因 “No such file or directory” 导致的分布式发送可能卡住的问题。修复当 distributed_directory_monitor_max_sleep_time_ms > 5 分钟时 system.distribution_queue 中的 error_count 可能出现的问题。引入用于跟踪异步 INSERT 失败的 profile 事件 DistributedAsyncInsertionFailures#57480 (Azat Khuzhin).
  • MaterializedPostgreSQL(实验性特性)中支持 PostgreSQL 的生成列和默认列值。解决 #40449#57568Kseniia Sumarokova)。
  • 允许在无需重启服务器的情况下应用部分文件系统缓存配置的更改。 #57578 (Kseniia Sumarokova).
  • 正确处理包含空数组的 PostgreSQL 表结构。#57618 (Mike Kot).
  • 将自上次服务器重启以来发生的错误总数暴露为 ClickHouseErrorMetric_ALL 指标。#57627 (Nikita Mikhaylov)。
  • 允许在配置文件中使用包含 from_env/from_zk 引用且在 replace=1 时元素非空的节点。#57628Azat Khuzhin)。
  • 一个表函数 fuzzJSON,用于为模糊测试生成大量畸形 JSON 数据。 #57646 (Julia Kartseva)。
  • 支持 IPv6 到 UInt128 的转换以及二进制算术运算。 #57707 (Yakov Olkhovskiy).
  • async inserts deduplication cache 添加一个设置项,用于控制等待缓存更新的时长。弃用设置项 async_block_ids_cache_min_update_interval_ms。现在缓存仅在发生冲突时才会更新。#57743 (alesapin).
  • 现在可以使用 KILL QUERY 取消 sleep() 函数。#57746 (Vitaly Baranov)。
  • 在实验性 Replicated 数据库中,禁止对 Replicated 表引擎使用 CREATE TABLE ... AS SELECT 查询,因为尚不支持该用法。参见 #35408#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)。
  • 在仲裁插入检查过程中容忍 Keeper 故障。#57986 (Raúl Marín).
  • 将最大/峰值 RSS(MemoryResidentMax)添加到 system.asynchronous_metrics 中。#58095Azat Khuzhin)。
  • 此 PR 允许你在区域不是默认值时,也可以使用 S3 风格链接(https://s3://)而无需显式指定区域;同时,如果用户指定了错误的区域,将自动找到正确的区域。#58148 (Yarik Briukhovetskyi)。
  • clickhouse-format --obfuscate 将识别到 Settings、MergeTreeSettings 和时区,并保留其名称不变。#58179 (Alexey Milovidov)。
  • ZipArchiveWriter 中新增显式的 finalize() 函数,并简化了其中过于复杂的代码。修复了 #58074#58202 (Vitaly Baranov)。
  • 使具有相同路径的缓存使用相同的缓存对象。此前一直是这样工作的,但在 23.4 版本中这一行为被破坏。如果此类缓存在相同路径下配置了不同的缓存设置,将会抛出异常,表明这是不被允许的。#58264 (Kseniia Sumarokova)。
  • 并行副本(实验性功能):更友好的配置 #57542 (Igor Nikonov)。
  • Parallel replicas(实验性功能):改进 announcement 响应的处理 #57749 (Igor Nikonov)。
  • 并行副本(实验性功能):使 ParallelReplicasReadingCoordinator 更加尊重 min_number_of_marks #57763 (Nikita Taranov)。
  • 并行副本(实验性功能):针对 IN (subquery) 禁用并行副本 #58133 (Igor Nikonov)。
  • 并行副本(实验性功能):添加 profile 事件 'ParallelReplicasUsedCount' #58173 (Igor Nikonov)。
  • 非 POST 请求(例如 HEAD)将与 GET 类似,为只读。 #58060 (San)。
  • system.part_log 添加 bytes_uncompressed#58167 (Jordi Villar).
  • 将基础备份名称添加到 system.backupssystem.backup_log 表中 #58178Pradeep Chhetri)。
  • 为 clickhouse-local 添加通过命令行指定查询参数的支持 #58210 (Pradeep Chhetri)。

构建/测试/打包改进

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

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)。
  • 不再允许将聚合函数 avgWeightedDecimal 类型的参数一起使用。变通方法:将参数转换为 Float64。这解决了 #43928#31768#56435。如果你在 materialized views 或 PROJECTION 中使用了带 Decimal 参数的该函数,请联系 [email protected]。修复了聚合函数 sumMap 中的错误,但使其变慢了约 1.5–2 倍。影响不大,因为这个函数本身就基本不可用。这解决了 #54955#53134#55148。修复了函数 groupArraySample 中的一个问题——当在一个查询中生成多个聚合状态时,它使用了相同的随机种子。#56350Alexey Milovidov)。

新功能

  • 新增服务器端设置 async_load_databases,用于异步加载数据库和表,从而加快服务器启动时间。适用于使用 OrdinaryAtomicReplicated 引擎的数据库,这些数据库中的表会异步加载其元数据。对某个表发起查询时,会提高该表加载任务的优先级,并等待其完成。新增用于自省的表 system.asynchronous_loader#49351 (Sergei Trifonov).
  • 新增 system 表 blob_storage_log,用于审计写入 S3 和其他对象存储的所有数据。#52918 (vdimir)。
  • 利用统计信息对 prewhere 条件进行更优排序。#53240 (Han Fei)。
  • 在 Keeper 协议中新增了对压缩的支持。可以在 ClickHouse 端通过在 zookeeper 段中启用 use_compression 标志来打开该功能。请注意,只有 ClickHouse Keeper 支持压缩,而 Apache ZooKeeper 并不支持。解决了 #49507#54957SmitaRKulkarni)。
  • 引入功能 storage_metadata_write_full_object_key。如果将其设置为 true,则元数据文件将以新格式写入。使用该格式时,ClickHouse 会在元数据文件中存储完整的远程对象键,从而提供更高的灵活性并便于优化。 #55566 (Sema Checherinda).
  • 添加了新的 settings 和语法,用于保护命名集合中的字段不被覆盖。其目的是防止恶意用户未经授权获取机密信息。 #55782 (Salvatore Mesoraca)。
  • 为所有系统日志表添加 hostname 列——在将系统表配置为副本、共享或分布式时非常有用。#55894 (Bharat Nallan)。
  • 新增 CHECK ALL TABLES 查询。#56022vdimir)。
  • 新增了函数 fromDaysSinceYearZero,其与 MySQL 的 FROM_DAYS 类似。例如,SELECT fromDaysSinceYearZero(739136) 返回 2023-09-08#56088 (Joanna Hulboj)。
  • 新增一个外部 Python 工具,可在不使用 ClickHouse 的情况下查看备份并从中提取信息。 #56268 (Vitaly Baranov)。
  • 实现一个名为 preferred_optimize_projection_name 的新设置项。如果将其设置为非空字符串,在可能的情况下会优先使用该指定的投影,而不是从所有候选项中选择。 #56309 (Yarik Briukhovetskyi).
  • 新增用于让出/辞去 leader 身份的 4 字母命令(https://github.com/ClickHouse/ClickHouse/issues/56352)。#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 设置项现在会遵循指定的顺序 #51745 (vdimir)。
  • 为 Protobuf 格式增加对 well-known Protobuf 类型 的支持。#56741János Benjamin Antal)。

性能优化

  • 与 S3 交互时采用自适应超时机制。第一次尝试时使用较短的发送和接收超时时间。#56314 (Sema Checherinda).
  • max_concurrent_queries 的默认值从 100 提高到 1000。在存在大量客户端连接、且它们缓慢发送或接收数据从而使服务器并非受 CPU 限制,或者 CPU 核心数大于 100 的情况下,这样设置是合理的。同时,默认启用并发控制,并将总的查询处理线程数设置为 CPU 核心数的两倍。在存在大量并发查询的场景下,这可以提升性能。 #46927 (Alexey Milovidov)。
  • 支持窗口函数的并行执行。修复了 #34688#39631 (Dmitry Novik)。
  • Numbers 表引擎(system.numbers 表的引擎)现在会分析条件,以类似表索引的方式生成所需的数据子集。#50909 (JackyWoo)。
  • 改进了 Merge 表引擎在使用 IN (...) 条件进行过滤时的性能。#54905Nikita Taranov)。
  • 在文件系统缓存已满且存在大量读取的情况下生效的优化。#55158Kseniia Sumarokova)。
  • 新增支持禁用 S3 校验和,以避免对文件进行不必要的多次遍历(由 s3_disable_checksum 设置控制)。 #55559 (Azat Khuzhin)。
  • 现在,当数据在页面缓存中时,我们会以同步方式从远程表读取数据(就像对本地表所做的一样)。这样速度更快,不需要在线程池内部进行同步,也可以放心地在本地文件系统上执行 seek 操作,从而减少 CPU 等待时间。 #55841 (Nikita 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% 的提升,同时对其他查询没有影响。 #56079 (Zhiguo Zhou).
  • 限制查询分析器中处于忙碌状态的线程数量。若有更多线程,它们将跳过分析。#56105 (Alexey Milovidov).
  • 减少窗口函数中的虚函数调用次数。#56120Maksim Kita)。
  • 允许在 ORC 数据格式中递归裁剪 Tuple 字段,以提升扫描性能。#56122李扬)。
  • Npy 数据格式进行了简单的 count 优化:像 select count() from 'data.npy' 这样的查询由于结果被缓存,现在将运行得更快得多。 #56304 (Yarik Briukhovetskyi)。
  • 带有聚合且包含大量数据流的查询在构建计划时将占用更少内存。 #57074 (Alexey Milovidov).
  • 通过优化对 ProcessList 的访问,在多用户且查询高度并发(>2000 QPS)的场景下提升查询执行性能。#57106Andrej Hoos)。
  • ARRAY JOIN 做了小幅优化,通过复用部分中间结果。 #57183 (李扬).
  • 在某些情况下,栈展开曾经较慢,现在已经不再如此。#57221 (Alexey Milovidov)。
  • 现在,当 max_streams = 1 时,我们会使用默认读池从外部存储中读取数据。在启用读取预取时,这样做更有利。 #57334 (Nikita Taranov)。
  • Keeper 改进:通过延迟日志预处理来降低启动期间的内存占用。#55660 (Antonio Andelic)。
  • 提升了 FileHDFS 存储的 glob 通配符匹配性能。 #56141 (Andrey Zvonov).
  • 实验性全文索引中的 posting list 现已被压缩,可将其大小减少 10-30%。 #56226 (Harry Lee).
  • 在备份中对 BackupEntriesCollector 进行并行化处理。 #56312 (Kseniia Sumarokova).

改进

  • 新增一个 MergeTree 设置 add_implicit_sign_column_constraint_for_collapsing_engine(默认禁用)。启用后,会为 CollapsingMergeTree 表添加一个隐式 CHECK 约束,将 Sign 列的取值限制为只能为 -1 或 1。#56701#56986 (Kevin Mingtarja)。
  • 支持在无需重启的情况下向存储配置中添加新磁盘。 #56367 (Duc Canh Le).
  • 支持在同一条 ALTER 查询中创建并物化索引,也支持在同一条查询中同时执行 "modify TTL" 和 "materialize TTL"。解决了 #55651 中的问题。#56331 (flynn)。
  • 添加一个名为 fuzzJSON 的新表函数,其返回的行包含对源 JSON 字符串进行随机扰动后得到的变体。 #56490 (Julia Kartseva).
  • Merge 引擎会根据其底层表的行级策略过滤记录,因此你不必另外在 Merge 表上创建行级策略。 #50209 (Ilya Golshtein).
  • 添加 max_execution_time_leaf 设置,用于限制分布式查询在分片上的执行时间,以及 timeout_overflow_mode_leaf 设置,用于控制发生超时时的处理行为。 #51823 (Duc Canh Le).
  • 新增 ClickHouse 设置,用于在通过 HTTP 代理转发 HTTPS 请求时禁用隧道。#55033Arthur 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 查询的性能。#54909Duc Canh Le)。
  • 修正了在线程关联到查询或USER之前分配的内存记账方式。 #56089 (Nikita Taranov).
  • 在 Apache Arrow 格式中新增对 LARGE_LIST 的支持。#56118 (edef)。
  • 允许通过 OPTIMIZE 查询对 EmbeddedRocksDB 手动执行 compaction 操作。#56225 (Azat Khuzhin).
  • 新增支持为 EmbeddedRocksDB 表指定 BlockBasedTableOptions。#56264Azat Khuzhin)。
  • SHOW COLUMNS 现在在通过 MySQL 协议建立连接时,会显示对应的 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,而不是抛出异常。#56327 (Robert Schulze)。
  • 允许对内部表已被删除的 materialized view 进行备份,而不是使备份失败。#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)。
  • #46550 中,dns_max_consecutive_failures 的值被误改——现已回滚并调整为更合适的值。同时,将 HTTP keep-alive 超时时间调高为在生产环境中验证为合理的数值。#56485 (Alexey Milovidov)。
  • 延迟加载基础备份(仅在需要时才加载基础备份)。同时为备份增加一些日志消息和 ProfileEvents 事件。#56516 (Vitaly Baranov).
  • query_cache_store_results_of_queries_with_nondeterministic_functions 这个 SETTING(取值为 falsetrue)已被标记为弃用。它被新的 SETTING query_cache_nondeterministic_function_handling 所取代,这是一个三值枚举,用于控制查询缓存如何处理包含非确定性函数的查询:a) 抛出异常(默认行为),b) 仍然保存该非确定性查询的结果,或 c) 忽略,即既不抛出异常也不缓存结果。 #56519 (Robert Schulze)。
  • 在 JOIN ON 子句中,将相等判断重写为 is null 检查。实验性功能,仅适用于 Analyzer#56538 (vdimir)。
  • concat FUNCTION 现在支持任意参数类型(而不仅仅是 String 和 FixedString 参数)。这使得其行为更加接近 MySQL 的 concat 实现。例如,SELECT concat('ab', 42) 现在返回 ab42#56540Serge Klochkov)。
  • 允许从配置文件中的 'named_collection' 部分,或从通过 SQL 创建的 named collection 中获取缓存配置。#56541 (Kseniia Sumarokova)。
  • PostgreSQL 数据库引擎:在未能成功连接 PostgreSQL 时,降低删除过期表的激进程度。 #56609 (jsc0218).
  • 当连接 URL 不正确时,连接 PG 会耗费过多时间,导致相关查询一直挂起并最终被取消。#56648 (jsc0218).
  • Keeper 改进:在 Keeper 中默认禁用压缩日志。 #56763 (Antonio Andelic).
  • 新增配置项 wait_dictionaries_load_at_startup#56782 (Vitaly Baranov)。
  • 在此前的 ClickHouse 版本中存在一个潜在安全漏洞:如果某个用户已建立连接,并尝试使用 “interserver secret” 方法进行身份验证但失败,服务器不会立刻终止连接,而是继续接收并忽略来自客户端的剩余数据包。虽然这些数据包会被忽略,但仍会被解析,如果它们使用了带有另一个已知漏洞的压缩方法,就可能在未通过身份验证的情况下被利用,从而触发该漏洞。此问题由 ClickHouse Bug Bounty Program 发现,报告者为 https://twitter.com/malacupa#56794Alexey Milovidov)。
  • 获取分片时会等待,直到该分片在远程副本上完全提交。不应发送处于 PreActive 状态的分片。在零拷贝的情况下,这是一项强制性限制。#56808 (Sema Checherinda).
  • 修复在使用实验性 MaterializedPostgreSQL 时可能出现的 PostgreSQL 逻辑复制转换错误。#53721 (takakawa)。
  • 实现用户级别设置 alter_move_to_space_execute_async,允许异步执行 ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME 查询。用于后台执行的线程池大小由 background_move_pool_size 控制。默认行为是同步执行。修复 #47643#56809alesapin)。
  • 在扫描 system.tables 时可以按引擎进行过滤,避免不必要(且可能耗时)的连接尝试。#56813 (jsc0218).
  • 为 RocksDB 存储在 system 表中显示 total_bytestotal_rows#56816 (Aleksandr Musorin)。
  • 允许在 TEMPORARY 表上执行 ALTER 的基本命令。 #56892 (Sergey).
  • LZ4 压缩。在极少数情况下,当输出缓冲区容量不足以直接写入压缩块时,对压缩块进行缓冲处理。 #56938 (Sema Checherinda).
  • 添加用于监控队列中任务数量的指标,对 IO 线程池很有帮助。 #56958 (Alexey Milovidov)。
  • 在配置文件中为 PostgreSQL 表引擎新增了一个设置项,添加了对该设置项的检查,并补充了相关文档说明。#56959 (Peignon Melvyn)。
  • 现在可以使用单个参数调用函数 concat,例如:SELECT concat('abc')。这使得其行为与 MySQL 的 concat 实现更加一致。#57000Serge Klochkov)。
  • 按 AWS S3 文档要求,对所有 x-amz-* 请求头进行签名。 #57001 (Arthur Passos).
  • 函数 fromDaysSinceYearZero(别名:FROM_DAYS)现在也可以用于无符号和有符号整数类型(之前仅支持无符号整数类型)。这提高了与 Tableau Online 等第三方工具的兼容性。#57002 (Serge Klochkov)。
  • 在默认配置中新增 system.s3queue_log#57036 (Kseniia Sumarokova).
  • wait_dictionaries_load_at_startup 的默认值更改为 true,并且仅当 dictionaries_lazy_load 为 false 时才使用此设置。#57133Vitaly Baranov)。
  • 即使启用了 dictionaries_lazy_load,在创建时仍会检查字典源类型。#57134 (Vitaly Baranov).
  • 现在可以单独启用或禁用计划级优化。此前只能一次性禁用所有优化。之前用于实现这一点的配置项(query_plan_enable_optimizations)仍然保留,仍可用于禁用所有优化。#57152Robert Schulze)。
  • 服务器的退出码将对应于异常代码。例如,如果服务器因内存限制无法启动,将以代码 241 = MEMORY_LIMIT_EXCEEDED 退出。在此前的版本中,异常的退出码始终是 70 = Poco::Util::ExitCode::EXIT_SOFTWARE。 #57153 (Alexey Milovidov)。
  • 不要对来自 functional C++ 头文件的栈帧执行 demangle 和符号化处理。#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 情况下的一个 bug,改为通过回退到 SW 路径来处理页错误。#57291 (jasperzhu)。
  • 将 MergeTree 设置中的 replicated_deduplication_window 默认值从 100 提高到 1000。 #57335 (sichenzhao)。
  • 尽量减少使用 INCONSISTENT_METADATA_FOR_BACKUP。如果可能,应优先选择继续扫描,而不是停止扫描并从头重新开始备份扫描。 #57385 (Vitaly Baranov).

构建/测试/打包改进

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

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

ClickHouse 23.10 发布版本,2023-11-02

向后不兼容的变更

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

新功能

  • 新增函数 arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn),该函数将一个 lambda 函数应用于多个长度相同的数组,并将结果累积到累加器中。 #49794 (Lirikl).
  • 支持 Npy 格式。SELECT * FROM file('example_array.npy', Npy)#55982 (Yarik Briukhovetskyi)。
  • 如果一张表在其键中使用了空间填充曲线,例如 ORDER BY mortonEncode(x, y),那么对其参数的条件(例如 x >= 10 AND x <= 20 AND y >= 20 AND y <= 30)可以用于索引分析。新增了一个名为 analyze_index_with_space_filling_curves 的设置项,用于启用或禁用此类分析。修复了 #41195。延续自 #4538。延续自 #6286。延续自 #28130。延续自 #41753#55642Alexey Milovidov)。
  • 一个名为 force_optimize_projection_name 的新设置项,它接收某个 projection 的名称作为参数。如果该设置被赋值为非空字符串,ClickHouse 会检查在查询中是否至少使用过一次该 projection。修复了 #55331#56134Yarik Briukhovetskyi)。
  • 通过原生协议支持带外部数据的异步插入。此前仅在将数据内联到查询中时才可用。#54730 (Anton Popov).
  • 新增了聚合函数 lttb,使用 Largest-Triangle-Three-Buckets 算法对用于可视化的数据进行降采样。#53145 (Sinan)。
  • CHECK TABLE 查询现在具有更好的性能和可用性(会发送进度更新,可取消)。同时支持使用 CHECK TABLE ... PART 'part_name' 检查特定的 part。#53404 (vdimir).
  • 新增了函数 jsonMergePatch。在以字符串形式处理 JSON 数据时,它提供了一种方式,将这些 JSON 对象的字符串合并在一起,生成一个仅包含单个 JSON 对象的字符串。#54364 (Memo)。
  • Kusto 查询语言方言支持的第二部分。第 1 阶段实现 已经合并。#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 引擎中保存未解析的记录和错误。为 NATS 和 RabbitMQ 添加虚拟列 _error_raw_message,为 FileLog 添加虚拟列 _raw_record,这些列会在 ClickHouse 无法解析新记录时被填充。该行为通过存储设置 nats_handle_error_mode(用于 NATS)、rabbitmq_handle_error_mode(用于 RabbitMQ)、handle_error_mode(用于 FileLog,类似于 kafka_handle_error_mode)进行控制。当设置为 default 时,ClickHouse 在无法解析记录时会抛出异常;当设置为 stream 时,错误和原始记录会被保存到虚拟列中。修复了 #36035#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 查询的支持。#55815 (megao)。
  • 引入 create_table_empty_primary_key_by_default 设置,用于将 ORDER BY () 作为默认值。 #55899 (Srikanth Chekuri).

性能优化

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

改进项

  • toDayOfWeek(MySQL 别名:DAYOFWEEK)、toYearWeekYEARWEEK)和 toWeekWEEK)函数现在支持 String 参数。这样使其行为与 MySQL 保持一致。 #55589 (Robert 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。 #48852 (Vlad Seliverstov).
  • 在创建 direct 字典时,如果指定了 lifetime 字段,将会被拒绝(因为 lifetime 对于 direct 字典没有意义)。修复:#27861#49043Rory Crispin)。
  • 允许在带有 PARTITION 子句的查询中使用参数,例如 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).
  • 目前 PROJECTION 分析仅在查询计划层面执行。query_plan_optimize_projection 设置已废弃(很久以前就默认启用)。#55112 (Nikita Mikhaylov).
  • 当在具有命名元素的 tuple 上调用 untuple 函数且该函数本身带有别名时(例如 select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias),结果列名现在将由 untuple 的别名和 tuple 元素的别名拼接生成(在示例中为:“untuple_alias.element_alias”)。 #55123 (garcher22).
  • 添加了 describe_include_virtual_columns 设置,用于在 DESCRIBE 查询的结果中包含表的虚拟列。添加了 describe_compact_output 设置。如果将其设为 trueDESCRIBE 查询将仅返回列的名称和类型,而不包含额外信息。 #55129 (Anton Popov).
  • 有时在设置 optimize_throw_if_noop=1 时执行 OPTIMIZE 可能会以错误 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#55377Konstantin 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 之间切换。#55617 (Serge Klochkov).
  • 在启动 ReplicatedMergeTree 表时,ClickHouse 服务器会检查分区片段集合中是否存在异常分区片段(本地存在但不在 ZooKeeper 中)。所有异常分区片段都会被移动到 detached 目录,服务器则会尝试通过其某个上层(覆盖它们的)分区片段来进行恢复。现在服务器会优先尝试恢复最近的上层分区片段,而不是随机选择任意覆盖分区片段。#55645 (alesapin).
  • 高级仪表板现在在触控设备上支持拖拽图表功能。已关闭 #54206#55649Alexey Milovidov)。
  • 在使用 http_write_exception_in_output_format 输出异常时,如果已声明默认查询格式,则使用该默认查询格式。#55739 (Raúl Marín)。
  • 为常见的 MATERIALIZED VIEW 使用陷阱提供更清晰的提示信息。#55826 (Raú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 所必需的。#55869 (Robert Schulze)。
  • apply_deleted_mask 设置为禁用时,可以读取由轻量级删除(lightweight DELETE)查询标记为已删除的行。这对于调试非常有用。 #55952 (Alexander Gololobov).
  • 允许在将 Tuple 序列化为 JSON 对象时跳过 null 值,从而与 Spark 的 to_json 函数保持兼容,这对 gluten 也很有用。 #55956 (李扬).
  • (add|sub)Date 函数现在支持字符串形式的日期参数,例如 SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE)。同样也为加号和减号运算符增加了对字符串形式日期参数的支持,例如 SELECT '2023-10-23' + INTERVAL 1 DAY。这提高了与 MySQL 的兼容性,并且是 Tableau Online 所必需的。#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 次尝试内无法加载时导致容器无限重启的问题(与非常大的数据库和多节点部署相关)。#50724 (Alexander Nikolaev).
  • 在 Darwin 的特殊构建任务中,会构建包含子模块的源代码资源。它可用于在不单独检出子模块的情况下构建 ClickHouse。#51435 (Ilya Yatsishin).
  • 当在全局启用 AVX 指令集系列(不推荐这样做)时构建 ClickHouse 会出现错误。原因是 snappy 未启用 SNAPPY_HAVE_X86_CRC32#55049 (monchickey).
  • 解决了从 clickhouse-server 包中启动独立 clickhouse-keeper 的问题。#55226 (Mikhail f. Shiryaev).
  • 在测试中,将 RabbitMQ 版本更新为 3.12.6,并改进了 RabbitMQ 测试的日志采集。#55424 (Ilya Yatsishin).
  • 调整了 openssl 和 boringssl 之间错误信息的差异,以修复功能测试。#55975 (MeenaRenganathan22).
  • 对 apache datasketches 使用上游仓库。#55787 (Nikita Taranov).

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

ClickHouse 23.9 版本发布,2023-09-28

向后不兼容的变更

  • 从默认的 Prometheus 处理器中移除 status_info 配置选项以及字典的状态信息。 #54090 (Alexey Milovidov).
  • 从代码库中移除实验性的分区片段元数据缓存。 #54215 (Alexey Milovidov).
  • 默认禁用 input_format_json_try_infer_numbers_from_strings 设置,因此在 JSON 格式中默认不再尝试从字符串推断数字,以避免当样例数据包含看起来像数字的字符串时可能出现的解析错误。 #55099 (Kruglov Pavel).

新功能

  • 改进从 JSON 格式推断 schema 的能力:1)现在在 JSON 格式下,通过设置 input_format_json_try_infer_named_tuples_from_objects,可以在不启用实验性 JSON 类型的情况下,从 JSON 对象推断出具名 Tuple。之前在未启用实验性 JSON 类型时,我们只能将 JSON 对象推断为 String 或 Map,现在可以推断为具名 Tuple。最终得到的 Tuple 类型将包含在 schema 推断期间数据样本中读取到的所有对象键。这对于在没有稀疏对象的情况下读取结构化 JSON 数据非常有用。该设置默认启用。2)在设置 input_format_json_read_arrays_as_strings 下,允许将 JSON 数组解析到类型为 String 的列中。这有助于读取包含不同类型值的数组。3)在设置 input_format_json_infer_incomplete_types_as_strings 下,允许对样本数据中类型未知(null/[]/{})的 JSON 键使用 String 类型。现在在 JSON 格式中,我们可以将任意值读取到 String 类型的列中,并且通过对未知类型使用 String 类型,可以避免在 schema 推断过程中出现 Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps 错误,从而成功完成数据读取。#54427 (Kruglov Pavel).
  • 为远程磁盘添加了 IO 调度支持。磁盘类型 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#47532 (SmitaRKulkarni)。
  • 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”,即最大公约数)作为新的数据压缩编解码器。该编解码器会计算所有列值的 GCD,然后将每个值除以该 GCD。GCD 编解码器是数据预处理编解码器(类似 Delta 和 DoubleDelta),不能单独使用。它适用于整数型、十进制数以及日期/时间类型的数据。GCD 编解码器的一个适用场景是列值按 GCD 的倍数变化(递增或递减),例如 24 - 28 - 16 - 24 - 8 - 24(假定 GCD = 4)。#53149Alexander Nam)。
  • 新增了两个类型别名:DECIMAL(P)(是 DECIMAL(P, 0) 的简写)和 DECIMAL(是 DECIMAL(10, 0) 的简写)。这使得 ClickHouse 与 MySQL 的 SQL 方言更加兼容。#53328Val Doroshchuk)。
  • 新增了一个系统日志表 backup_log,用于跟踪所有 BACKUPRESTORE 操作。 #53638 (Victor Krasnov)。
  • 新增了一个格式设置项 output_format_markdown_escape_special_characters(默认值:false)。该设置控制在 Markdown 输出格式中,是否对 !#$ 等特殊字符进行转义(即在前面加上反斜杠)。#53860irenjj)。
  • 新增函数 decodeHTMLComponent#54097 (Bharat Nallan)。
  • query_log 表中新增了 peak_threads_usage 列。 #54335Alexey Gerasimchuck)。
  • 为 clickhouse-client 添加对 SHOW FUNCTIONS 的支持。#54337 (Julia Kartseva)。
  • 新增函数 toDaysSinceYearZero 及其别名 TO_DAYS(用于兼容 MySQL),返回自 0001-01-01 起经过的天数(基于前推公历)。#54479Robert Schulze)。函数 toDaysSinceYearZero 现在支持 DateTimeDateTime64 类型的参数。#54856Serge Klochkov)。
  • 新增了函数 YYYYMMDDtoDateYYYYMMDDtoDate32YYYYMMDDhhmmssToDateTimeYYYYMMDDhhmmssToDateTime64。它们将以整数编码的日期或日期时间(例如 20230911)转换为原生日期或日期时间。因此,它们提供了与现有函数 YYYYMMDDToDateYYYYMMDDToDateTimeYYYYMMDDhhmmddToDateTimeYYYYMMDDhhmmddToDateTime64 相反方向的转换功能。#54509Quanfa Fu)(Robert Schulze)。
  • 添加了若干字符串距离函数,包括 byteHammingDistanceeditDistance#54935 (flynn)
  • 允许使用 VALID UNTIL datetime 子句为用户凭证指定到期日期,并可选地指定具体时间。#51261Nikolay 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 的查询,如非必要,不要在单独的分区片段中隐式读取主键和版本列。 #53919 (Duc Canh Le).
  • 优化对常量键的 GROUP BY。将在 https://github.com/ClickHouse/ClickHouse/pull/53529 之后优化按 _file/_path 分组的查询。 #53549Kruglov Pavel)。
  • 提升 Decimal 列的排序性能。当 ORDER BY 子句包含 Decimal 列时,提升插入到 MergeTree 的性能。提升在数据已经排序或几乎已排序情况下的排序性能。#35961Maksim Kita)。
  • 改进大规模查询分析的性能。修复 #51224#51469frinkr)。
  • COUNT(DISTINCT ...) 以及多种 uniq 变体进行优化:当它们从带有 GROUP BY 的子查询中选取时,将其重写为 count#52082 #52645 (JackyWoo)。
  • 移除对 mmap/mremap/munmap 的手动调用,将这类工作全部交由 jemalloc 处理——略微提升了性能。 #52792 (Nikita Taranov).
  • 修复了在使用 NATS 时 CPU 使用率过高的问题。 #54399 (Vasilev Pyotr).
  • 由于我们针对带有 datetime 参数的 toString 执行使用了单独的实现,因此在处理非 datetime 参数时可以略微提升性能,并让部分代码更加简洁。此更改是对 #53680 的后续跟进。#54443Yarik Briukhovetskyi)。
  • 该 PR 不再将 JSON 元素序列化到 std::stringstream 中,而是尝试将序列化结果直接写入 ColumnString#54613 (lgbo).
  • 当 MergeTree 表位于 VIEW 后面(通过视图访问该表)时,启用 ORDER BY 优化,以按相应顺序从该表中读取数据。#54628Vitaly Baranov)。
  • 通过复用 GeneratorJSONPath 并移除若干 shared_ptr 改进 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)。
  • 在 array join 中遵循 max_block_size 限制,以避免可能的 OOM。关闭 #54290#54664李扬)。
  • s3 表函数中复用 HTTP 连接。#54812Michael Kolupaev)。
  • MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules 中的线性查找替换为二分查找。 #54869 (usurai).

实验特性

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

改进

  • 允许将 MergeTree 数据分区片段中列文件过长的文件名替换为其名称的哈希值。这有助于在某些情况下避免出现 File name too long 错误。#50612 (Anton Popov)。
  • 如果解析元数据失败,则将 JSON 格式的数据按 JSONEachRow 格式进行解析。这样即使实际格式是 JSONEachRow,也可以读取扩展名为 .json 的文件。修复 #45740#54405Kruglov Pavel)。
  • 在通过 HTTP 执行查询时,如果发生异常,则输出有效的 JSON/XML。新增名为 http_write_exception_in_output_format 的设置项,用于启用或禁用此行为(默认启用)。#52853 (Kruglov Pavel)。
  • information_schema.tables VIEW 现在新增了字段 data_length,用于显示磁盘上数据的大致大小。该字段是运行由 Amazon QuickSight 生成的查询所必需的。 #55037 (Robert Schulze).
  • MySQL 接口增加了对预处理语句的简易实现,恰好足以通过 MySQL 连接器让 Tableau Online 能够连接到 ClickHouse。#54115Serge Klochkov)。请注意:当前预处理语句的实现非常精简,我们尚未支持参数绑定;在这个特定的 Tableau Online 使用场景中并不需要该功能。如果在对 Tableau Online 进行广泛测试的过程中发现问题,我们会在后续视需要补充实现该功能。
  • regexp_tree 字典中支持大小写不敏感和 dot-all 匹配模式。#50906 (Johann Gan)。
  • Keeper 改进:为 Keeper 添加 createIfNotExists 命令。 #48855 (Konstantin Bogdanov).
  • 实现更精确的整数类型推断,修复 #51236#53003Chen768959)。
  • 在 MaterializedMySQL 中引入了对字符串字面量字符集解析的支持。#53220Val Doroshchuk)。
  • 修复了在极其罕见场景下、很少使用的 EmbeddedRocksDB 表引擎中出现的一个细微问题:在执行 DROP TABLE 之后,EmbeddedRocksDB 表引擎有时不会在 NFS 上正确关闭文件。 #53502 (Mingliang Pan).
  • RESTORE TABLE ON CLUSTER 必须在各个节点上创建具有匹配 UUID 的复制表。否则,ZooKeeper 路径中的宏 {uuid} 在执行 RESTORE 之后将无法正常工作。此 PR 实现了这一点。#53765 (Vitaly Baranov)。
  • 新增恢复设置项 restore_broken_parts_as_detached:如果为 true,RESTORE 过程在恢复时不会因为损坏的分区片段而中止,而是将所有损坏的分区片段复制到带有前缀 broken-from-backupdetached 目录中。如果为 false,RESTORE 过程会在遇到第一个损坏的分区片段时中止(如果存在)。默认值为 false。#53877Vitaly 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)。
  • 修复使用缓存中的 count 统计时的问题,并改进从归档读取时的进度条。 #54271 (Kruglov Pavel).
  • 为通过 SSO 使用的 S3 凭证添加支持。要定义用于 SSO 的配置文件,请设置 AWS_PROFILE 环境变量。#54347 (Antonio Andelic)。
  • 为输入格式中的嵌套类型 Array/Tuple/Map 增加对将 NULL 作为默认值的支持。解决了 #51100#54351Kruglov Pavel)。
  • 允许从 Arrow/Parquet 格式读取某些非常规的分块配置。#54370 (Arthur Passos)。
  • 为实现与 MySQL 的兼容性,向 stddevPop 函数添加 STD 别名。修复 #54274#54382Nikolay Degterinsky)。
  • 添加 addDate 函数以兼容 MySQL,并添加 subDate 函数以保持一致性。参考 #54275#54400Nikolay Degterinsky)。
  • system.detached_parts 中新增了 modification_time#54506 (Azat Khuzhin).
  • 添加了一个设置项 splitby_max_substrings_includes_remaining_string,用于控制当函数 "splitBy*()" 的参数 "max_substring" > 0 时,结果数组中是否包含剩余字符串(如果有)(Python/Spark 语义),或不包含。默认行为不变。 #54518 (Robert Schulze).
  • 改进了对 Int64/UInt64 字段的整数类型推断,是对 #53003 的延续。现在它也适用于诸如数组的数组等嵌套类型,以及 map/tuple 等函数。Issue:#51236#54553Kruglov Pavel)。
  • 为标量与数组的乘法、除法和取模添加了运算支持。运算支持任意一侧为标量,例如 5 * [5, 5][5, 5] * 5 均可使用。 #54608 (Yarik Briukhovetskyi).
  • keeper-client 中的 rm 命令添加可选的 version 参数,以支持更安全的删除。#54708 (János Benjamin Antal)。
  • 禁止 systemd 强行终止服务器(在使用 Buffer 表时可能导致数据丢失)。 #54744 (Azat Khuzhin).
  • 在系统表 system.functions 中新增了字段 is_deterministic,用于指示某个函数在给定完全相同的输入时,两次调用之间的结果是否保持不变。 #54766 #55035 (Robert Schulze)。
  • 使 information_schema 模式中的视图与 MySQL 中的等效视图更加兼容(即对其进行了修改和扩展),从而使 Tableau Online 能够连接到 ClickHouse。更具体地说:1. 将字段 information_schema.tables.table_type 的类型从 Enum8 更改为 String。2. 在视图 information_schema.table 中添加了字段 table_commenttable_collation。3. 添加了视图 information_schema.key_column_usagereferential_constraints。4. 将 information_schema 视图中的大写别名替换为对应的大写列名。#54773Serge Klochkov)。
  • 现在,当你尝试缓存包含非确定性函数(例如 nowrandomStringdictGet)的查询结果时,查询缓存会返回错误。与之前的行为(在不提示的情况下不缓存结果)相比,这减少了困惑和意外。#54801Robert Schulze)。
  • 禁止在 file/s3/url/... 存储中使用物化列、临时列和别名列等特殊列,并修复了从文件向临时列插入数据的问题。关闭 #53477#54803Kruglov Pavel)。
  • 备份元数据收集变得更加可配置。 #54804 (Vitaly Baranov).
  • clickhouse-local 的日志文件(如果通过 --server_logs_file 参数启用)现在会像 clickhouse-server 一样,在每一行前加上时间戳、线程 ID 等前缀信息。 #54807 (Michael Kolupaev)。
  • system.merge_tree_settings 表中的字段 is_obsolete:对于已废弃的 MergeTree 设置,其值现在为 1。此前,仅在描述中标明该设置已废弃。#54837 (Robert Schulze)。
  • 在使用 INTERVAL 字面量时支持复数形式。INTERVAL 2 HOURS 应当等同于 INTERVAL 2 HOUR#54860 (Jordi Villar).
  • 始终允许创建带 Nullable 主键的 PROJECTION。修复了 #54814#54895Amos Bird)。
  • 在因连接重置导致失败后重试备份的 S3 操作。#54900 (Vitaly Baranov)。
  • 在某个设置的最大值小于其最小值时,使抛出的异常消息更加精确。 #54925 (János Benjamin Antal).
  • LIKEmatch 以及其他正则表达式匹配函数现在在遇到包含非 UTF-8 子串的模式时,会回退到二进制匹配,从而仍然能够完成匹配。示例:可以使用 string LIKE '\xFE\xFF%' 来检测 BOM。此改动关闭了 #54486#54942Alexey Milovidov)。
  • 新增 ContextLockWaitMicroseconds profile 事件。 #55029 (Maksim Kita).
  • Keeper 现可动态调整日志级别。#50372 (helifu).
  • 新增 timestamp FUNCTION,以实现与 MySQL 的兼容性。关闭了 #54275#54639Nikolay Degterinsky)。

构建/测试/打包改进

  • 将 ClickHouse 官方发布版和持续集成构建所使用的编译器从 Clang 16 升级到 17。#53831Robert Schulze)。
  • 为查找功能重新生成 tld 数据(tldLookup.generated.cpp)。#54269Bharat Nallan)。
  • 移除冗余的 clickhouse-keeper-client 符号链接。#54587Tomas Barton)。
  • 使用 /usr/bin/env 来定位 bash,现在也支持 Nix OS。#54603Fionera)。
  • 在 CMake 中添加了 PROFILE_CPU 选项,以便在不使用 DWARF 调用图的情况下执行 perf record#54917Maksim Kita)。
  • 如果链接器不是 LLD,则以致命错误终止构建。#55036Alexey Milovidov)。
  • 将处理(编码/解码)Base64 值的库从 Turbo-Base64 替换为 aklomp-base64。二者在 x86 和 ARM 上都使用 SIMD 加速,但:1. 后者的许可证(BSD-2)对 ClickHouse 更有利,而 Turbo-Base64 已经改为 GPL-3;2. aklomp-base64 在 GitHub 上的 star 更多,看起来更具前景;3. aklomp-base64 拥有略好一些的 API(虽然这在一定程度上是主观的);4. aklomp-base64 不需要我们通过 hack 方式绕过 bug(例如非线程安全的初始化)。注意:aklomp-base64 会拒绝未填充(unpadded)的 Base64 值,而 Turbo-Base64 会尽力对其进行解码。RFC-4648 并未规定是否必须使用 padding,但在具体场景中,这可能会成为需要注意的行为变更。#54119Mikhail Koviazin)。

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

  • 修复在使用 REPLACE/MOVE PARTITION 时 zero-copy replication 的问题(注意:zero-copy replication 是一项实验性功能) #54193 (Alexander Tokmakov).
  • 修复使用硬链接的零拷贝锁(注意:“zero-copy replication” 是一项实验性功能)#54859Alexander Tokmakov)。
  • 修复零拷贝产生的垃圾(注意:“zero-copy replication” 是一项实验性功能)#54550 (Alexander Tokmakov).
  • 以毫秒为单位传递 HTTP 重试超时时间(此前的行为不正确)。 #54438 (Duc Canh Le)。
  • 修复了 OUTFILE 在使用 CapnProto/Protobuf 时产生的误导性错误信息 #52870 (Kruglov Pavel).
  • 修复在启用并行副本并使用 LIMIT 时的汇总统计问题 #53050Raúl Marín)。
  • 修复在未使用原生拷贝时从/到 S3 执行 BACKUP 操作的限流问题,以及在其他一些场景中的类似问题 #53336 (Azat Khuzhin)。
  • 修复在复制整个目录时的 IO 限速问题 #53338 (Azat Khuzhin).
  • 修复:当操作被移动到 PREWHERE 条件时,可能会导致列丢失 #53492 (Yakov Olkhovskiy).
  • 修复了在使用字节级相等的分区片段进行替换时出现的内部错误 #53735Pedro Riera)。
  • 修复:在 interpolate 表达式中强制要求指定参与的列 #53754 (Yakov Olkhovskiy)。
  • 修复集群发现初始化以及在配置中设置故障注入点 #54113 (vdimir)。
  • 修复 accurateCastOrNull 的问题 #54136Salvatore Mesoraca)。
  • 修复使用 FINAL 修饰符时 Nullable 主键的问题 #54164 (Amos Bird).
  • 修复了在存在重复数据时,导致无法向 replicated materialized view 插入新数据的错误。 #54184 (Pedro Riera).
  • 修复:允许布隆过滤器支持 IPv6 #54200Yakov Olkhovskiy)。
  • 修复 IPv4 可能出现的类型不匹配问题 #54212Bharat Nallan)。
  • 为重新创建的索引修复 system.data_skipping_indices #54225Artur Malchanau)。
  • 修复 multiple join rewriter v2 的名称冲突问题 #54240 (Tao Wang)。
  • 修复在执行 JOIN 后出现在 system.errors 中的异常错误 #54306 (vdimir)。
  • 修复 isZeroOrNull(NULL) #54316flynn)。
  • 修复:在 Distributed 表上结合并行副本使用且 prefer_localhost_replica = 1 时的行为 #54334 (Igor Nikonov)。
  • 修复在垂直合并 + ReplacingMergeTree + OPTIMIZE CLEANUP 过程中的逻辑错误 #54368 (alesapin)。
  • 修复 s3 表函数中可能出现的 URI contains invalid characters 错误 #54373Kruglov Pavel)。
  • 修复在对 arrayExists FUNCTION 进行 AST 优化时发生的段错误 #54379Nikolay Degterinsky)。
  • analysisOfVariance 函数中在执行加法前检查是否溢出 #54385 (Antonio Andelic).
  • 复现并修复 removeSharedRecursive 函数中的 bug #54430Sema Checherinda)。
  • 修复在 PREWHERE 和 FINAL 中使用 SimpleAggregateFunction 时可能导致结果不正确的问题 #54436 (Azat Khuzhin)。
  • 修复在非 analyzer 模式下使用 indexHint 过滤分区片段的问题 #54449 (Azat Khuzhin)。
  • 修复带标准化状态的聚合投影的问题 #54480 (Amos Bird)。
  • clickhouse-local: 修复 multiquery 参数相关问题 #54498 (CuiShuoGuo).
  • clickhouse-local 支持 --database 命令行参数 #54503 (vdimir)。
  • 修复在禁用 input_format_with_names_use_header-WithNames 格式中可能出现的解析错误 #54513 (Kruglov Pavel)。
  • 修复在罕见情况下出现的 CHECKSUM_DOESNT_MATCH 错误 #54549 (alesapin)。
  • 修复在对已排序结果执行 UNION ALL 时的排序问题 #54564 (Vitaly Baranov)。
  • 修复 Keeper 中的快照安装 #54572Antonio Andelic)。
  • 修复 ColumnUnique 中的竞态条件 #54575Nikita Taranov)。
  • Annoy/Usearch 索引:修复在使用默认值构建时触发的 LOGICAL_ERROR #54600Robert Schulze)。
  • 修复 ColumnDecimal 的序列化问题 #54601Nikita Taranov)。
  • 修复 *Cluster 函数在处理包含空格的列名时的模式推断问题 #54635 (Kruglov Pavel)。
  • 修复在存在默认值并显式指定插入列时使用插入表结构的错误 #54655 (Kruglov Pavel).
  • 修复:避免将可能包含“|”的正则表达式匹配用作键条件。 #54696 (Yakov Olkhovskiy).
  • 修复 ReplacingMergeTree 在垂直合并和清理时的问题 #54706 (SmitaRKulkarni).
  • 修复在使用 ORDER BY 时虚拟列值不正确的问题 #54811Michael Kolupaev)。
  • 修复在非 analyzer 模式下使用 indexHint 过滤分区片段的问题 #54825 #54449 (Azat Khuzhin)。
  • 修复 Keeper 在关闭时发生的段错误 #54841 (Antonio Andelic)。
  • 修复 MaterializedPostgreSQL 中的 Invalid number of rows in Chunk 错误 #54844Kseniia Sumarokova)。
  • 将已废弃的格式设置移到单独的小节 #54855 (Kruglov Pavel)。
  • 当分区键被修改时,重建 minmax_count_projection #54943 (Amos Bird)。
  • 修复函数 if 中对 ColumnVector<Int128> 的错误类型转换 #55019Kruglov Pavel)。
  • 防止附加来自具有不同 PROJECTION 或索引的表的分区片段 #55062János Benjamin Antal)。
  • 在标量结果映射中,为空子查询的结果存储 NULL #52240 (vdimir)。
  • 修复 FINAL 在极少数情况下会生成无效读取范围的问题 #54934 (Nikita Taranov)。
  • 修复:在不进行 Keeper 重试的情况下执行 INSERT QUORUM #55026 (Igor Nikonov).
  • 修复在 simple state 中使用 Nullable 的问题 #55030 (Pedro Riera).

ClickHouse 23.8 LTS 版本发布,2023-08-31

向后不兼容变更

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

新特性

  • 支持直接从 zip/7z/tar 压缩包中导入。例如:file('*.zip :: *.csv')#50321nikitakeba)。
  • trace_type = 'MemorySample'system.trace_log 新增列 ptr。该列包含一次内存分配的地址。新增函数 flameGraph,可用于构建包含已分配但尚未释放内存的 flamegraph。对 #38391 的重新实现。#45322 (Nikolai Kochetov)。
  • 新增表函数 azureBlobStorageCluster。其支持的功能集与表函数 s3Cluster 非常相似。#50795 (SmitaRKulkarni)。
  • 允许在不指定表名的情况下使用 clusterclusterAllReplicasremoteremoteSecure,参见 issue #50808#50848Yangkuan Liu)。
  • 新增用于监控 Kafka 消费者的系统表。#50999 (Ilya Golshtein)。
  • 新增 max_sessions_for_user 设置项。 #51724 (Alexey Gerasimchuck).
  • 新增函数 toUTCTimestamp/fromUTCTimestamp,其行为与 Spark 的 to_utc_timestamp/from_utc_timestamp 相同。#52117 (KevinyhZou)。
  • 新增函数 structureToCapnProtoSchema / structureToProtobufSchema,用于将 ClickHouse 表结构转换为 CapnProto/Protobuf 格式的 schema。支持在没有外部格式 schema 的情况下,基于表结构自动生成的 schema(由设置 format_capn_proto_use_autogenerated_schema / format_protobuf_use_autogenerated_schema 控制)以 CapnProto/Protobuf 格式读写数据。并可在读写时通过设置 output_format_schema 导出自动生成的 schema。 #52278 (Kruglov Pavel).
  • system.query_log 中新增字段 query_cache_usage,用于指示是否使用了查询缓存以及具体的使用方式。#52384 (Robert Schulze).
  • 新增函数 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)。#52881Alexander Tokmakov)。
  • 允许在发起端的 mutation 中执行常量非确定性函数。#53129 (Anton Popov)。
  • 添加输入格式 One,它不会读取任何数据,而始终返回一行,包含名为 dummy、类型为 UInt8、值为 0 的列,类似于 system.one。它可以与 _file/_path 虚拟列一起使用,在不读取任何数据的情况下,列出 file/s3/url/hdfs 等表函数中的文件。 #53209 (Kruglov 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)。
  • system.clusters 中添加列 name,作为 cluster 的别名。 #53605 (irenjj)。
  • 高级仪表板现在支持批量编辑(保存/加载)。 #53608 (Alexey Milovidov).
  • 高级仪表盘现在支持最大化图表并调整它们的位置。#53622Alexey Milovidov)。
  • 添加了对数组相加和相减的支持:[5,2] + [1,7]。由于逐元素乘法与参数的标量积之间容易混淆,因此未实现除法和乘法。关闭了 #49939#52625Yarik Briukhovetskyi)。
  • 支持将字符串字面量用作表名。解决 #52178#52635hendrik-m)。

实验性特性

  • 新增表引擎 S3Queue,用于从 S3 流式导入数据。关闭 #37012#49086s-kat)。目前尚未可用,请不要使用。
  • 启用通过分布式表从副本并行读取。关联的任务:#49708#53005Igor Nikonov)。
  • 为 HNSW 添加实验性支持,用作近似近邻搜索方法。#53447Davit Vardanyan)。目前仅供继续完善该实现的开发者使用,请不要使用。

性能优化

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

改进

  • 添加 stderr_reaction 配置/设置项,用于控制在外部命令向 stderr 输出数据时的处理方式(none、log 或 throw)。这有助于更轻松地调试外部命令。#43210 (Amos Bird)。
  • system part_log 和合并表中新增 partition 列。#48990 (Jianfei Hu)。
  • 现在可以在运行时(无需重启服务器)动态配置(索引)uncompressed/mark、mmap 和 query 缓存的大小。#51446Robert Schulze)。
  • 当使用复合键创建字典时,会自动选择 "complex key" 布局变体。#49587 (xiebin)。
  • 新增设置项 use_concurrency_control,以便更好地测试新的并发控制功能。 #49618 (Alexey Milovidov).
  • 为误拼的数据库和表名添加了名称建议提示。 #49801 (Yarik Briukhovetskyi).
  • 在通过 Gluten 从 HDFS 读取小文件时,我们发现相比直接使用 Spark 进行查询,这种方式会耗费更多时间。对此我们进行了改进。 #50063 (KevinyhZou).
  • 会话过期后会产生过多无用的错误日志,这是我们不希望看到的。#50171 (helifu).
  • 引入具有时间限制的备用 ZooKeeper 会话。修复了 system.zookeeper_connection 中针对 DNS 地址的 index 列。#50424 (Anton Kozlov)。
  • 新增在达到 max_partitions_per_insert_block 限制时记录日志的功能。 #50948 (Sean Haynes)。
  • 向 clickhouse-keeper-client 添加了一批自定义命令(主要是为了简化 ClickHouse 的调试)。#51117 (pufit).
  • 更新了 azureBlobStorage 表函数中对连接字符串的检查,因为带有 sas 的连接字符串并不总是以默认 endpoint 开头;同时在将 Azure 容器添加到 URL 后,更新了连接 URL,使其包含 sas token。#51141 (SmitaRKulkarni)。
  • 修正 full_sorting_merge JOIN 算法中关于过滤 Set 的说明。#51329 (Tanay Tummalapalli)。
  • 修复了当 max_block_size 非常大时 Aggregator 的内存占用问题。#51566Nikita Taranov)。
  • 添加了 SYSTEM SYNC FILESYSTEM CACHE 命令。它会将内存中的文件系统缓存状态与磁盘上的状态进行比较,并在需要时修复内存状态。只有在你手动修改磁盘上的数据时才需要这样做,而这是一种强烈不建议的做法。#51622Kseniia Sumarokova)。
  • 尝试为 ClickHouse 创建通用代理解析器,同时保持对现有 S3 存储配置代理解析器的向后兼容性。 #51749 (Arthur Passos)。
  • 支持从 file/s3/hdfs/url/azureBlobStorage 表函数中读取元组子列。 #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#52315chen)。
  • 在解析器中添加了对语法 CREATE UNIQUE INDEX 的支持,作为空操作以提高 SQL 兼容性。UNIQUE 索引本身不受支持。将 create_index_ignore_unique 设为 1 可在查询中忽略 UNIQUE 关键字。 #52320 (Ilya Yatsishin).
  • 在 Kafka 引擎的某些设置(如 topic、consumer、client_id 等)中新增对预定义宏({database}{table})的支持。#52386Yury Bogomolov)。
  • 在备份/恢复期间禁用更新文件系统缓存。备份/恢复过程中不应更新文件系统缓存,因为看起来这只会拖慢过程而没有任何收益(因为 BACKUP 命令可能会读取大量数据,把所有数据放入文件系统缓存然后立刻将其逐出并没有意义)。 #52402 (Vitaly Baranov)。
  • S3 endpoint 的配置允许从根路径开始使用它,并在需要时自动追加 '/'。 #47809. #52600 (xiaolei565).
  • 对于 clickhouse-local,允许使用位置参数选项,并填充全局 UDF 配置(user_scripts_path 和 user_defined_executable_functions_config)。 #52643 (Yakov Olkhovskiy).
  • system.asynchronous_metrics 现在新增了指标 “QueryCacheEntries” 和 “QueryCacheBytes”,用于检查查询缓存。 #52650 (Robert Schulze).
  • 新增支持在执行针对 S3 的备份时,在 BACKUP 语句的 SETTINGS 子句中使用 s3_storage_class 参数。 #52658 (Roman Vasin).
  • 添加实用脚本 print-backup-info.py,用于解析备份元数据文件并输出备份相关信息。 #52690 (Vitaly Baranov).
  • 关闭了 #49510。目前,我们的数据库名和表名是区分大小写的,但 BI 工具在查询 information_schema 时,有时使用小写,有时使用大写。基于这个原因,我们提供了 information_schema 数据库,其中包含小写表,例如 information_schema.tables,以及 INFORMATION_SCHEMA 数据库,其中包含大写表,例如 INFORMATION_SCHEMA.TABLES。但是,有些工具会查询 INFORMATION_SCHEMA.tablesinformation_schema.TABLES。为了解决这个问题,提出的方案是在小写和大写的 information_schema 数据库中,同时提供一份小写和大写版本的表。#52695Yarik Briukhovetskyi)。
  • CHECK TABLE 查询具有更好的性能和易用性(支持进度更新,且可取消)。 #52745 (vdimir).
  • 通过将运算分布到元组的各个元素上,添加对元组的 modulointDivintDivOrZero 的支持。#52758 (Yakov Olkhovskiy)。
  • 在 clickhouse-client 中在 xml 之后查找默认的 yamlyml 配置文件。#52767 (Alexey Milovidov).
  • 在合并到以非 'clickhouse' 为根的配置时,根节点名称不同的配置将被直接忽略,而不会抛出异常。#52770 (Yakov Olkhovskiy)。
  • 现在可以为需要由采样型内存分析器跟踪的内存分配指定最小(memory_profiler_sample_min_allocation_size)和最大(memory_profiler_sample_max_allocation_size)大小。#52779 (alesapin)。
  • 新增 precise_float_parsing 设置项,用于在快速/精确两种浮点解析方法之间切换。 #52791 (Andrey Zvonov).
  • clickhouse-keeper(符号链接)使用与 clickhouse-keeper(可执行文件)相同的默认路径。 #52861 (Vitaly Baranov).
  • 改进表函数 remote 的错误信息。关闭 #40220#52959jiyoungyoooo)。
  • 现在可以在 RESTORE 查询的 SETTINGS 子句中指定自定义存储策略。 #52970 (Victor Krasnov).
  • 为备份操作新增了对 S3 请求进行限流的功能(现在 BACKUPRESTORE 命令会遵守 s3_max_[get/put]_[rps/burst])。#52974Daniel Pozo Escalona)。
  • 添加设置,以便在管理带副本的用户定义函数或具有副本存储的访问控制实体时,忽略查询中的 ON CLUSTER 子句。 #52975 (Aleksei Filatov).
  • 支持在 JOIN 步骤中使用 EXPLAIN actions。 #53006 (Maksim Kita).
  • 使 hasTokenOrNullhasTokenCaseInsensitiveOrNull 在 needle 为空时返回 null。#53059 (ltrk2).
  • 允许限定文件系统缓存可使用的路径,主要用于动态磁盘。如果在服务器配置中指定了 filesystem_caches_path,则所有文件系统缓存的路径都将被限制在该目录内。例如,如果缓存配置中的 path 是相对路径,则会被放入 filesystem_caches_path 中;如果缓存配置中的 path 是绝对路径,则要求其位于 filesystem_caches_path 之内。如果在配置中未指定 filesystem_caches_path,则行为将与早期版本保持一致。 #53124 (Kseniia Sumarokova).
  • 添加了一批自定义命令(主要用于简化 ClickHouse 调试)。 #53127 (pufit)。
  • 在进行 schema 推断时,添加包含文件名的诊断信息——在使用通配符(globs)处理多个文件时会有所帮助。#53135Alexey Milovidov)。
  • 如果不允许第二个连接创建会话,客户端将使用主连接加载补全建议(suggestions)。 #53177 (Alexey Gerasimchuck).
  • SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM] 查询新增 EXCEPT 子句支持,例如 SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP#53280 (Nikolay Degterinsky)。
  • max_concurrent_queries 的默认值从 100 调整为 1000。如果查询本身不重、主要是在等待网络,那么允许大量并发查询是可以的。注意:不要把并发查询数和 QPS 混淆,例如,ClickHouse 服务器在并发查询少于 100 的情况下,就可以达到每秒数万次查询(QPS)。#53285 (Alexey Milovidov)。
  • 限制后台分区优化合并任务的并发数量。#53405 (Duc Canh Le)。
  • 新增了名为 allow_moving_table_directory_to_trash 的设置,用于在复制或恢复 Replicated 数据库时忽略 Directory for table data already exists 错误。 #53425 (Alexander Tokmakov)。
  • 如果将服务器设置 asynchronous_metrics_update_period_sasynchronous_heavy_metrics_update_period_s 错误配置为 0,现在会优雅地失败,而不是直接终止应用程序。#53428Robert Schulze)。
  • 在重新加载配置时,ClickHouse 服务器现在会遵从通过 cgroups 调整的内存限制。#53455Robert Schulze)。
  • 新增:支持在执行 DETACHDROP 或服务器关闭时禁用对分布式表的 flush 操作。 #53501 (Azat Khuzhin)。
  • domainRFC 函数现在支持方括号中的 IPv6 地址。#53506 (Chen768959)。
  • 为用于备份的 S3 CopyObject 请求设置更长的超时时间。#53533Michael Kolupaev)。
  • 新增了服务器设置项 aggregate_function_group_array_max_element_size。该设置用于在序列化时限制 groupArray 函数生成的数组大小。默认值为 16777215#53550 (Nikolai Kochetov).
  • 添加了 SCHEMA 作为 DATABASE 的别名,以提高与 MySQL 的兼容性。#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 中为查询数据包增加客户端信息校验。 #53673 (Alexey Gerasimchuck).
  • 在与 Microsoft Azure 交互时,如遇网络错误,将重试加载分区片段。#53750 (SmitaRKulkarni)。
  • 为异常提供堆栈追踪,并且物化视图(Materialized View)的异常会被向上传播。 #53766 (Ilya Golshtein).
  • 如果未指定主机名或端口,Keeper 客户端将尝试在 ClickHouse 的 config.xml 中查找连接字符串。 #53769 (pufit)。
  • 新增 profile 事件 PartsLockMicroseconds,用于显示在 MergeTree 表引擎系列中持有数据分区片段锁的时间(微秒数)。#53797 (alesapin)。
  • 使 Keeper 中 RAFT 的重连次数限制可配置。通过该配置,如果当前连接中断,可以帮助 Keeper 更快地与其他节点重新建立连接。#53817 (Pengyuan Bian)。
  • 在表定义中忽略外键约束,以提高与 MySQL 的兼容性,这样用户就无需重写其 SQL 中与外键相关的部分,参见 #53380#53864jsc0218)。

构建/测试/打包方面的改进

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

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 的表,此更改可能会阻止服务器启动。例如,一个在主键中创建按位置引用列的 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 中新增对外部磁盘的支持,用于存储快照和日志。#50098Antonio Andelic)。
  • 为多目录选择({})glob 模式添加支持。#50559 (Andrey Zvonov)。
  • Kafka 连接器支持使用 URL 编码的凭据进行基本身份验证,从 schema registry 获取 Avro schema。 #49664 (Ilya 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#51016Nikolay Degterinsky)。
  • 添加 input_format_csv_allow_variable_number_of_columns 选项。 #51273 (Dmitry Kardymon)。
  • 又一个无聊的功能:新增函数 substring_index,与 Spark 或 MySQL 中的一样。#51472 (李扬).
  • 系统表 jemalloc_bins,用于显示 jemalloc bin 的统计信息。查询示例:SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10#51674Alexander Gololobov)。
  • 新增 RowBinaryWithDefaults 格式:在每个列前增加一个字节,作为是否使用该列默认值的标志位。关闭 #50854#51695 (Kruglov 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)指定。#51945Victor Krasnov)。
  • 在 HTTP 头部中新增了峰值内存使用统计信息。#51946 (Dmitry Kardymon)。
  • 新增 hasSubsequence 函数(及其 CaseInsensitiveUTF8 版本),用于在字符串中匹配子序列。#52050Dmitry Kardymon)。
  • 为 PostgreSQL 兼容性添加 array_agg 作为 groupArray 的别名。关闭了 #52100。### 面向用户可见变更的文档条目。#52135 (flynn)。
  • any_value 添加为聚合函数 any 的兼容别名。修复 #52140#52147 (flynn)。
  • 添加聚合函数 array_concat_agg 以提高与 BigQuery 的兼容性,该函数是 groupArrayArray 的别名。修复 #52139#52149 (flynn)。
  • OCTET_LENGTH 添加为 length 的别名。修复了 #52153 中的问题。#52176 (FFFFFFFHHHHHHH)。
  • 新增 firstLine 函数,用于从多行字符串中提取第一行。修复了 #51172#52209Mikhail Koviazin)。
  • Interval 数据类型实现 KQL 风格的格式化。此功能仅用于兼容 Kusto 查询语言。#45671 (ltrk2).
  • 新增了查询 SYSTEM FLUSH ASYNC INSERT QUEUE,用于将所有待处理的异步插入刷新到目标表中。新增了服务端设置 async_insert_queue_flush_on_shutdown(默认值为 true),用于控制在正常关闭时是否刷新异步插入队列。设置项 async_insert_threads 现在是一个服务端设置。#49160 (Anton Popov)。
  • 为兼容 PostgreSQL,新增了 current_database 的别名以及新的函数 current_schemas#51076 (Pedro Riera).
  • 为函数 todaynow 添加别名:today 现在也可以使用名称 curdate/current_datenow 则可以使用 current_timestamp#52106 (Lloyd-Pottiger).
  • 在异步插入中支持 async_deduplication_token#52136 (Han Fei).
  • 新增设置项 disable_url_encoding,允许在 URL 引擎中禁用对 URI 路径的编码/解码。#52337 (Kruglov Pavel)。

性能优化

  • 默认启用自动选择稀疏序列化格式,以提升性能。该格式从 22.1 版本开始支持。此变更后,可能无法再降级到早于 22.1 的版本。若需降级,可能需要将 ratio_of_defaults_for_sparse_serialization 设置为 0.9375 55153。你可以通过在 MergeTree 表上将 ratio_of_defaults_for_sparse_serialization = 1 SETTING 来关闭稀疏序列化格式的使用。#49631 (Alexey 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 中等待锁有时会带来明显的延迟。我们将其拆分为多个子映射(每个都有各自的锁),以避免锁竞争。#51341Nikita Taranov)。
  • 将包含主键列的条件移动到 PREWHERE 条件链的末尾。这样做的原因是,包含主键列的条件很可能会在主键分析阶段被使用,对 PREWHERE 过滤本身不会有太多额外贡献。 #51958 (Alexander Gololobov).
  • 通过对 SipHash 进行内联优化,加速对 String 类型执行的 COUNT(DISTINCT)。在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核心,160 线程)上对 OnTime 进行的性能实验表明,此更改在不影响其他查询的前提下,可将查询 Q8 的 QPS 提升 11.6%#52036 (Zhiguo Zhou).
  • 默认启用 allow_vertical_merges_from_compact_to_wide_parts。这可以在合并过程中节省内存开销。#52295 (Alexey Milovidov)。
  • 修复错误的 PROJECTION 分析导致主键失效的问题。该问题仅在 query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1 时存在。修复了 #48823。修复了 #51173#52308Amos Bird)。
  • 减少在 FileCache::loadMetadata 中的系统调用次数——如果配置了文件系统缓存,这将加快服务器启动速度。#52435Raúl Marín)。
  • 通过在后台下载剩余数据,可以为文件段大小设置严格的下边界。文件段的最小大小(如果实际文件大小更大)通过缓存配置项 boundary_alignment 进行配置,默认值为 4Mi。后台线程数量通过缓存配置项 background_download_threads 进行配置,默认值为 2。此外,在此 PR 中将 max_file_segment_size8Mi 增加到了 32Mi#51000Kseniia Sumarokova)。
  • 将 S3 的默认超时时间从 30 秒缩短为 3 秒,将其他 HTTP 的默认超时时间从 180 秒缩短为 30 秒。#51171Michael Kolupaev)。
  • 新增 merge_tree_determine_task_size_by_prewhere_columns 设置项。若设为 true,则仅会根据 PREWHERE 部分中的列大小来确定读取任务大小;否则会根据查询中所有列的大小来确定。#52606Nikita Taranov)。

改进

  • 在 s3/file/url/... 表函数中使用 read_bytes/total_bytes_to_read 作为进度条指标,以更好地展示进度。#51286Kruglov 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 头部进行过滤。支持精确匹配和正则表达式过滤。#51038 (Nikolay 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: a Plugin to Double Spark SQL's Performance)存在一个缺陷。该修复在从 HDFS 读取时避免了该第三方产品中的堆溢出。 #51386 (李扬).
  • 新增可禁用 S3 原生复制的能力(用于 BACKUP/RESTORE 的 allow_s3_native_copy 设置,以及用于 s3/s3_plain 磁盘的 s3_allow_native_copy)。 #51448 (Azat Khuzhin).
  • system.parts 表中新增列 primary_key_size,用于显示磁盘上压缩后的主键大小。关闭 #51400#51496Yarik Briukhovetskyi)。
  • 允许在不存在 procfs、主目录以及 glibc 名称解析插件的情况下运行 clickhouse-local#51518 (Alexey Milovidov)。
  • rename_files_after_processing 设置中添加占位符 %a,用于表示完整文件名。 #51603 (Kruglov Pavel).
  • system.parts_columns 新增列 modification_time#51685 (Azat Khuzhin).
  • 为 CSV 格式新增了设置 input_format_csv_use_default_on_bad_values,在解析单个字段失败时允许插入默认值。#51716 (KevinyhZou)。
  • 添加了在意外崩溃后将崩溃日志刷新到磁盘的机制。 #51720 (Alexey Gerasimchuck)。
  • 修复仪表盘页面中未显示与身份验证无关错误的问题,同时修复图表“重叠”显示的问题。 #51744 (Zach Naimon).
  • 支持 UUID 到 UInt128 的转换。 #51765 (Dmitry Kardymon)。
  • range FUNCTION 新增对 Nullable 参数的支持。 #51767 (Dmitry Kardymon).
  • 将类似 toyear(x) = c 形式的条件改写为 c1 <= x < c2#51795 (Han Fei).
  • 提升 SHOW INDEX 语句的 MySQL 兼容性。 #51796 (Robert Schulze).
  • 修复 use_structure_from_insertion_table_in_table_functionsMATERIALIZEDALIAS 列上不起作用的问题。关闭 #51817。关闭 #51019#51825flynn)。
  • 缓存字典现在仅从源端请求去重后的键。修复了 #51762#51853Maksim Kita)。
  • 修复了在指定 FORMAT 时,EXPLAIN 查询未应用设置的问题。 #51859 (Nikita Taranov).
  • 允许在 DESCRIBE TABLE 查询中在 FORMAT 之前使用 SETTINGS,以保持与 SELECT 查询的兼容性。修复问题 #51544#51899Nikolay Degterinsky)。
  • Var-Int 编码整数(例如原生协议中使用的整数)现在可以使用完整的 64 位取值范围。建议第三方客户端相应更新其 Var-Int 编码实现。#51905 (Robert Schulze).
  • 在证书发生变更时自动更新证书,而无需手动执行 SYSTEM RELOAD CONFIG。#52030 (Mike Kot)。
  • 新增了 allow_create_index_without_type SETTING,用于忽略未指定 TYPEADD INDEX 查询。标准 SQL 查询将在不更改表结构的情况下直接执行成功。#52056Ilya Yatsishin)。
  • 自服务器启动时起,日志消息就会被写入 system.text_log#52113 (Dmitry Kardymon).
  • 在 HTTP 端点具有多个 IP 地址且第一个 IP 地址不可达的情况下,会抛出超时异常。现已在会话创建时尝试连接所有解析出的端点。 #52116 (Aleksei Filatov).
  • Avro 输入格式现在也支持仅包含单一类型的 Union。修复 #52131#52137flynn)。
  • 新增设置项 optimize_use_implicit_projections,用于禁用隐式投影(目前仅会影响 min_max_count 投影)。 #52152 (Amos Bird)。
  • 以前可以利用函数 hasToken 触发无限循环。现已消除这种情况。修复了 #52156#52160Alexey Milovidov)。
  • 以乐观方式创建 ZK 祖先节点。 #52195 (Raúl Marín).
  • 修复 #50582。在某些按顺序读取以及读取常量的场景下,避免出现 Not found column ... in block 错误。#52259Chen768959)。
  • 在 ClickHouse 端尽早检查 S2 geo primitives 的有效性。关闭了:#27090#52260 (Nikita Mikhaylov)。
  • query_plan_optimize_projection = 1 时补充缺失的 projection 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)。
  • 将在 23.6 版本中新引入的 session_timezone 设置降级为实验性。 #52445 (Alexey Milovidov)。
  • 为 ClickHouse Keeper 增加对 ZooKeeper reconfig 命令的支持,使用可通过 keeper_server.enable_reconfiguration 设置启用的增量重配置方式。支持添加服务器、移除服务器以及修改服务器优先级。 #49450 (Mike Kot)。据推测该功能尚未完全实现。

构建/测试/打包改进

缺陷修复(官方稳定版中对用户可见的错误行为)

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)。
  • 编解码器 DEFLATE_QPL 现在通过服务器设置 enable_deflate_qpl_codec(默认:false)进行控制,而不是通过 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#50107Alexander Tokmakov)。
  • 允许将过滤条件下推到 cross join。#50605Han Fei)。
  • 在启用 QueryProfiler 时,通过使用线程本地的 timer_id 替代全局对象来提升性能。#48778Jiebin Sun)。
  • 重写 CapnProto 输入/输出格式以提升性能。使列名与 CapnProto 字段之间的映射不区分大小写,并修复嵌套结构字段的读写。#49752Kruglov Pavel)。
  • 为并行线程场景优化 Parquet 写入性能。#50102Hongbin Ma)。
  • 对仅包含一个 block 的 MATERIALIZED VIEW 和存储禁用 parallelize_output_from_storages#50214Azat Khuzhin)。
  • 合并 PR #46558。如果 block 已经排序,则在排序时避免对 block 进行重排。#50697Alexey MilovidovMaksim Kita)。
  • 对 ZooKeeper 发起多个并行的 list 请求,以加快从 system.zookeeper 表读取数据的速度。#51042Alexander Gololobov)。
  • 加速时区相关 DateTime 查找表的初始化。这应当会减少 clickhouse-client 的启动和连接时间,特别是在调试构建版本中,因为该过程相对较重。#51347Alexander Gololobov)。
  • 修复由于同步 HEAD 请求导致的数据湖访问变慢问题(与大量文件场景下 Iceberg/Deltalake/Hudi 访问缓慢相关)。#50976Kseniia Sumarokova)。
  • 不再从右侧 GLOBAL JOIN 表中读取所有列。#50721Nikolai Kochetov)。

实验功能

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

改进

  • 将 “too many parts” 的阈值放宽,使其更符合当前需求。恢复对长时间运行的插入查询的背压机制。 #50856 (Alexey Milovidov).
  • 允许将 IPv6 地址在 CIDR ::ffff:0:0/96 范围内转换为 IPv4 地址(IPv4 映射地址)。 #49759 (Yakov Olkhovskiy).
  • 更新 MongoDB 协议,以支持 MongoDB 5.1 及更新版本。保留对旧协议版本(<3.6)的支持。修复 #45621#49879#50061Nikolay Degterinsky)。
  • 新增 input_format_max_bytes_to_read_for_schema_inference 设置项,用于限制用于 schema 推断的最大读取字节数。修复了 #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#50635 (Kruglov 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 现在只能指定一次。#50966Alexey Gerasimchuck)。
  • 在集群备份期间使用 system.parts 中的 hash_of_all_files 来校验分区片段的一致性。 #50997 (Vitaly Baranov)。
  • 系统表 zookeeper_connection 中的 connected_time 字段用于记录建立连接的时间(标准格式),并新增了 session_uptime_elapsed_seconds 字段,用于标记该连接会话已持续的时间(以秒为单位)。 #51026 (郭小龙).
  • 通过使用源数据的分块大小,并在每个线程中按增量统计总大小,改进 file/s3/hdfs/url 表函数的进度条。修复 *Cluster 表函数的进度条。此更改关闭了 #47250#51088Kruglov Pavel)。
  • 在 TCP 协议的 Progress 数据包中新增 total_bytes_to_read 字段,以改进进度条显示。 #51158 (Kruglov Pavel).
  • 在启用文件系统缓存的磁盘上,对数据分区片段进行更完善的检查。#51164 (Anton Popov).
  • 修复文件系统缓存中 current&#95;elements&#95;num 值有时不正确的问题。#51242 (Kseniia Sumarokova).

构建/测试/打包改进

  • 为独立 keeper 可执行文件添加嵌入式 keeper-client。#50964 (pufit).
  • 现在使用正确的 LZ4 版本。#50621 (Nikita Taranov).
  • ClickHouse 服务器现在会在发生致命错误时打印已更改设置的列表。此更改关闭了 #51137#51138 (Alexey Milovidov).
  • 允许使用 clang-17 构建 ClickHouse。#51300 (Alexey Milovidov).
  • SQLancer 检查现已被认为是稳定的,因为其触发的 bug 已经修复。现在,SQLancer 检查失败会被报告为检查失败状态。#51340 (Ilya Yatsishin).
  • 将 Dockerfile 中体量很大的 RUN 指令拆分为多个较小的条件块。在同一 RUN 层中按需安装必要工具,并在之后将其移除。仅在开始时执行一次操作系统升级。使用更现代的方式验证已签名的仓库。将基础镜像降级为 ubuntu:20.04,以解决旧版 docker 上的问题。升级 golang 版本以修复相关安全漏洞。#51504 (Mikhail f. Shiryaev).

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

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。#42587Alexey Milovidov)。
  • 使本地对象存储与 S3 对象存储行为一致,修复追加写入的问题(关闭 #48465),并使其可配置为独立存储。该变更不向后兼容,因为本地对象存储之上的缓存与之前版本不兼容。#48791Kseniia Sumarokova)。
  • 移除实验特性 “in-memory data parts”。数据格式仍然受支持,但相关设置不再生效,将改为使用 compact 或 wide 分区片段。这解决了 #45409#49429Alexey Milovidov)。
  • 更改 parallelize_output_from_storagesinput_format_parquet_preserve_order 设置的默认值。这允许 ClickHouse 在从文件(例如 CSV 或 Parquet)读取时重新排序行,在很多情况下极大提升性能。若要恢复保持顺序的旧行为,请使用 parallelize_output_from_storages = 0input_format_parquet_preserve_order = 1#49479Michael Kolupaev)。
  • 使 PROJECTION 达到生产可用。新增 optimize_use_projections 设置,用于控制是否在 SELECT 查询中选择 PROJECTION。设置 allow_experimental_projection_optimization 已过时且不再起作用。#49719Alexey Milovidov)。
  • joinGet 标记为非确定性函数(dictGet 也是如此)。这允许在 mutation 中使用它们而无需额外的设置。#49843Azat Khuzhin)。
  • 回滚 “groupArray 返回值不能为 Nullable” 的变更(因为这会导致对 Nullable 类型的 groupArray / groupArrayLast / groupArraySample 的二进制兼容性破坏,很可能会导致 TOO_LARGE_ARRAY_SIZECANNOT_READ_ALL_DATA)。#49971Azat Khuzhin)。
  • 设置 enable_memory_bound_merging_of_aggregation_results 现在默认启用。如果你从 22.12 之前的版本更新,我们建议在完成更新之前将该标志设置为 false#50319Nikita Taranov)。

新特性

  • 新增存储引擎 AzureBlobStorage 和 azureBlobStorage 表函数。其支持的功能集与 S3 存储引擎/表函数非常相似 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) (alesapin) (SmitaRKulkarni.
  • 新增了原生 ClickHouse Keeper CLI 客户端,可通过 clickhouse keeper-client 命令使用 #47414 (pufit)。
  • 添加 urlCluster 表函数。重构所有 *Cluster 表函数以减少代码重复。使模式推断适用于所有可能的 *Cluster 函数签名以及命名集合。关闭了 #38499#45427 (attack204), Pavel Kruglov。
  • 查询缓存现在可以用于生产环境中的工作负载。#47977Robert Schulze)。查询缓存现在支持带有 totals 和 extremes 修饰符的查询。#48853Robert Schulze)。将 allow_experimental_query_cache 设置标记为已废弃以保持向后兼容性。它已在 https://github.com/ClickHouse/ClickHouse/pull/47977 中移除。#49934Timur Solodovnikov)。
  • 地理数据类型(PointRingPolygonMultiPolygon)已可用于生产环境。 #50022 (Alexey Milovidov).
  • 为 PostgreSQL、MySQL、MeiliSearch 和 SQLite 表引擎添加模式推断支持。解决了 #49972#50000Nikolay Degterinsky)。
  • 在诸如 CREATE USER u IDENTIFIED BY 'p' 这样的查询中,密码类型将会根据服务端 config.xml 中的 default_password_type 设置自动确定。关闭了 #42915#44674Nikolay Degterinsky)。
  • 新增 bcrypt 密码身份验证类型。关闭了 #34599#44905 (Nikolay Degterinsky)。
  • 新增关键字 INTO OUTFILE 'file.txt' APPEND#48880 (alekar).
  • 新增 system.zookeeper_connection 表,用于显示 Keeper 连接信息。 #45245 (mateng915).
  • 新增了函数 generateRandomStructure,用于生成随机表结构。它可以与表函数 generateRandom 配合使用。#47409 (Kruglov Pavel)。
  • 允许在不包含 ELSE 分支的情况下使用 CASE,并扩展 transform 以支持更多类型。同时修复了一些问题,这些问题在小数类型与其他数值类型混用时会导致 transform() 返回错误结果。#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 字段,以便为用户指定权限。 #49381 (pufit)。
  • 通过使用 Grace Hash Join 算法来支持 FULL/RIGHT JOIN。 #49483 (lgbo).
  • WITH FILL 修饰符按排序前缀进行分组填充。由 use_with_fill_by_sorting_prefix 设置控制(默认启用)。相关讨论参见 #33203#issuecomment-1418736794。 #49503 (Igor Nikonov)。
  • 当未指定 "--query"(或 "-q")时,clickhouse-client 现在也会接受紧跟在 "--multiquery" 后面的查询。例如:clickhouse-client --multiquery "select 1; select 2;"。#49870 (Alexey Gerasimchuk)。
  • 为从副本接收 Hello 数据包新增独立的 handshake_timeout。关闭 #48854#49948 (Kruglov Pavel)。
  • 添加了函数 "space",用于按指定次数重复输出空格。 #50103 (Robert Schulze)。
  • 新增了 --input_format_csv_trim_whitespaces 选项。#50215 (Alexey Gerasimchuk)。
  • 使针对正则表达式树字典的 dictGetAll 函数能够以数组形式返回来自多个匹配的值。关闭 #50254#50255Johann Gan)。
  • 新增 toLastDayOfWeek 函数,用于将日期或带时间的日期向上取整到下一个星期六或星期日。#50315 (Victor Krasnov)。
  • 通过指定 ignore_data_skipping_indices 可以忽略 skip index。#50329 (Boris Kuschel)。
  • 添加 system.user_processes 表和 SHOW USER PROCESSES 查询,用于在用户级别显示内存信息和 ProfileEvents。 #50492 (János Benjamin Antal).
  • 新增服务器和格式设置 display_secrets_in_show_and_select,用于显示表、数据库、表函数和字典的机密信息。新增权限 displaySecretsInShowAndSelect,用于控制哪些用户可以查看这些机密信息。#46528 (Mike Kot).
  • 允许为某个 DATABASE 下的所有表设置 ROW POLICY。 #47640 (Ilya Golshtein).

性能优化

  • 默认对 marks 和主键进行压缩。这可以显著减少冷查询时间。升级说明:对压缩 marks 和主键的支持是在 22.9 版本中添加的。如果你开启了压缩 marks 或主键,或者安装了 23.5 或更新版本(这些版本默认开启压缩 marks 和主键),将无法降级到 22.8 或更早的版本。你也可以在服务器配置文件的 <merge_tree> 部分通过设置 compress_markscompress_primary_key,显式禁用 marks 或主键压缩。 #42587 (Alexey Milovidov).
  • 新增 s3&#95;max&#95;inflight&#95;parts&#95;for&#95;one&#95;file SETTING,用于限制在单个文件内,通过 multipart 上传请求并发加载的分区片段数量上限。#49961 (Sema Checherinda)。
  • 从多个文件读取时,降低每个文件的并行解析线程数。修复了 #42192#46661SmitaRKulkarni)。
  • 仅当通过聚合 projection 读取的 granule 数量少于常规读取时,才使用聚合 projection。这在查询命中表的主键但未命中 projection 时应有所帮助。修复了 #49150#49417Nikolai Kochetov)。
  • 在未插入任何数据时,不再在 ANY 哈希连接中存储数据块。 #48633 (vdimir).
  • 修复了在使用 JIT 编译时聚合组合器 -If 的问题,并为聚合函数启用 JIT 编译。关闭了 #48120#49083Igor Nikonov)。
  • 在从远程表读取数据时,我们使用更小的任务(而不是读取整个 part),以便任务窃取机制能够发挥作用:* 任务大小由要读取的列的数据量决定 * 从 S3 读取时始终使用 1MB 缓冲区 * 缓存段的边界按 1MB 对齐,这样即使在小任务下它们的大小也足够合理,同时还能避免碎片化。#49287 (Nikita Taranov)。
  • 引入了以下设置:- merge_max_block_size_bytes 用于限制后台操作使用的内存量。- vertical_merge_algorithm_min_bytes_to_activate 用于在触发垂直合并时增加另一项条件。#49313 (Nikita Mikhaylov)。
  • 用于从本地文件系统读取数据的读缓冲区默认大小已调整为更合适的数值。同时引入了两个新的设置:max_read_buffer_size_local_fsmax_read_buffer_size_remote_fs#49321 (Nikita Taranov).
  • 改进 SPARSE_HASHED/HASHED 字典的内存使用和速度(例如,SPARSE_HASHED 现在内存占用降低约 2.6 倍,速度提升约 2 倍)。 #49380 (Azat Khuzhin).
  • 通过在适当的地方应用 LowCardinality 来优化 system.query_logsystem.query_thread_log 表。对这些表的查询速度将会更快。#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 数据类型),但情况会稍微好一些。#49647 (Alexey 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).
  • 重构文件系统缓存中的锁实现 #44985 (Kseniia Sumarokova).
  • 如果可以应用简单的 COUNT 优化,则禁用纯并行副本。#50594 (Raúl Marín).
  • 在 Iceberg 模式推断中,不要对所有键发送 HEAD 请求,仅对用于读取数据的键发送。 #50203 (Kruglov Pavel).
  • 设置 enable_memory_bound_merging_of_aggregation_results 现在默认启用。 #50319 (Nikita Taranov).

实验性功能

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

改进

  • 在创建备份时,BACKUP 命令不会解密加密磁盘上的数据。相反,这些数据将在备份中以加密形式存储。此类备份只能恢复到具有相同(或已扩展)加密密钥列表的加密磁盘上。#48896Vitaly Baranov)。
  • 新增支持在 ATTACH PARTITION FROMREPLACE PARTITION FROM 的 FROM 子句中使用临时表。 #49436 (Roman Vasin).
  • MergeTree 表新增了 async_insert 设置。它与查询级的 async_insert 设置含义相同,并为特定表启用异步插入。注意:对来自 clickhouse-client 的 insert 查询不会生效,此时请使用查询级设置。#49122 (Anton Popov).
  • 为 QUOTA 创建语句的参数增加对大小后缀的支持。 #49087 (Eridanus).
  • 扩展 first_valuelast_value,使其接受 NULL 值。#46467 (lgbo)。
  • extractKeyValuePairs 添加别名 str_to_mapmapFromString,修复了 https://github.com/clickhouse/clickhouse/issues/47185 中的问题。 #49466 (flynn).
  • 添加对 CGroup v2 的支持,用于采集内存使用和可用性的异步指标。关闭了 #37983#45999sichenzhao)。
  • 集群表函数现在会始终跳过不可用的分片。修复了 #46314#46765 (zk_kiger)。
  • 允许 CSV 文件的表头包含空列。 #47496 (你不要过来啊).
  • 新增 Google Cloud Storage S3 兼容的表函数 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 子句。#48548 (Alexander Tokmakov)。
  • 在 system.replicas 中新增列 zookeeper_name,用于指示复制表的元数据存储在哪个(辅助)ZooKeeper 集群上。 #48549 (cangyin).
  • IN 运算符现在支持比较 DateDate32。修复了 #48736#48806 (flynn).
  • 增加对 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 等)。#49117Anton Popov)。
  • 在 filesystem 缓存中捕获 create_directories 抛出的异常。#49203 (Kseniia Sumarokova).
  • 将嵌入的示例复制到 system.functions 表中的新字段 example,用于补充字段 description#49222 (Dan Roscigno).
  • 为 MongoDB 字典启用连接选项。示例:xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source> ### 针对用户可见变更的文档条目。 #49225 (MikhailBurdukov).
  • kolmogorovSmirnovTest 的计算方法 asymp 添加了别名 asymptotic。改进了文档。#49286 (Nikita Mikhaylov)。
  • 聚合函数 groupBitAnd/Or/Xor 现在可以作用于有符号整数数据。这使其行为与标量函数 bitAnd/Or/Xor 保持一致。#49292 (exmy)。
  • 将函数文档拆分为粒度更细的字段。 #49300 (Robert Schulze).
  • 在单个服务器内,通过在所有表之间共享的线程池中使用多个线程来加载过期的分区片段。线程池及其队列的大小由 max_outdated_parts_loading_thread_pool_sizeoutdated_part_loading_thread_pool_queue_size SETTING 控制。 #49317 (Nikita Mikhaylov).
  • LowCardinality 列在数据块之间共享字典时,不要将已处理数据的大小估算得过大。此更改修复了 #49322。另见 #48745#49323Alexey Milovidov)。
  • Parquet 写入器现在在通过 OUTFILE 调用时,会使用合理的行组(row group)大小。#49325Michael 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#49519Kseniia 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 请求。这使得可以对通过分片上传的对象使用 copy 操作。建议将 s3_strict_upload_part_size 设置为一个具体值,因为对于由不同大小的分片创建的对象,compose 请求可能会失败。#49693 (Antonio Andelic).
  • 对于 extractKeyValuePairs 函数:改进“best-effort”解析逻辑,使其接受 key_value_delimiter 作为值的有效组成部分。这也简化了分支逻辑,并且可能略微提升性能。 #49760 (Arthur Passos)。
  • system.processors&#95;profile&#95;log 添加 initial_query_id 字段 #49777 (helifu)。
  • 系统日志表现在支持自定义排序键。#49778 (helifu)。
  • system.query_log 中新增了一个字段 partitions,用于指明哪些分区参与计算。#49779 (helifu)。
  • ReplicatedMergeTree 新增了 enable_the_endpoint_id_with_zookeeper_name_prefix 设置(默认禁用)。启用后,会将 ZooKeeper 集群名称添加到表的服务器间通信端点中。这样,在存在路径相同但使用不同辅助 ZooKeeper 集群的副本表时,可以避免出现 Duplicate interserver IO endpoint 错误。 #49780 (helifu)。
  • clickhouse-local 添加查询参数。修复了 #46561#49785 (Nikolay Degterinsky)。
  • 默认允许从 YAML 加载字典和函数。在此前的版本中,需要在配置文件中修改 dictionaries_configuser_defined_executable_functions_config,因为它们期望的是 *.xml 文件。#49812Alexey Milovidov)。
  • Kafka 表引擎现在支持使用别名列。#49824 (Aleksandr Musorin).
  • 新增一个 setting,用于限制 extractKeyValuePairs 可生成的键值对数量上限,作为防止占用过多内存的保护措施。 #49836 (Arthur Passos)。
  • IN 运算符添加对参数为单元素元组(这一情况较为少见)时的支持。#49844 (MikhailBurdukov)。
  • bitHammingDistance 函数现已支持 StringFixedString 数据类型。修复 #48827#49858flynn)。
  • 修复 OS X 上客户端超时时间重置时出现的错误。 #49863 (alekar).
  • 为函数 bitCount 添加对大整数的支持,例如 UInt128、Int128、UInt256 和 Int256。这样可以在大规模位掩码上计算汉明距离,用于 AI 应用。#49867Alexey Milovidov)。
  • 在加密磁盘中使用指纹而不是密钥 ID。这简化了加密磁盘的配置。#49882 (Vitaly Baranov)。
  • 为 PostgreSQL 新增 UUID 数据类型。修复 #49739#49894 (Nikolay Degterinsky)。
  • 函数 toUnixTimestamp 现在接受 DateDate32 参数。#49989Victor Krasnov)。
  • 仅将字典的内存占用计入服务器内存。 #49995 (Azat Khuzhin).
  • 服务器现在允许将 SQL_* 设置(例如 SQL_AUTO_IS_NULL)视为空操作,以兼容 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)来保持对已重命名设置的向后兼容性。#50044Azat Khuzhin)。
  • 支持通过设置 my_hostname 传递 FQDN,以在 keeper 中注册集群节点。新增 invisible 设置以支持多个 compute group。作为一个集群的 compute group 对其他 compute group 是不可见的。#50186 (Yangkuan Liu)。
  • 修复了 PostgreSQL 即使可以指定 LIMIT n 仍然读取全部数据的问题。 #50187 (Kseniia Sumarokova).
  • 为包含子查询的查询添加新的 profile events(QueriesWithSubqueries / SelectQueriesWithSubqueries / InsertQueriesWithSubqueries)。 #50204 (Azat Khuzhin).
  • 在 users.xml 文件中添加 roles 字段,允许通过配置文件指定已授予权限的角色。 #50278 (pufit).
  • 在 AsynchronousMetrics 中上报 CGroupCpuCfsPeriodCGroupCpuCfsQuota,并在服务器启动时遵守 cgroup v2 内存限制。#50379 (alekar).
  • 为 SIGQUIT 添加信号处理程序,使其行为与 SIGINT 相同。关闭了 #50298#50435Nikolay Degterinsky)。
  • 如果由于对象过大导致 JSON 解析失败,则输出最后处理到的位置以便调试。 #50474 (Valentin Alexeev).
  • 支持非固定精度的小数。关闭 #49130#50586Kruglov Pavel)。

构建 / 测试 / 打包方面的改进

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

ClickHouse 23.4 发布,2023-04-26

不兼容变更

  • 函数 formatDateTime() 中的格式化符号 %M 现在会输出月份名称,而不是分钟,从而使其行为与 MySQL 保持一致。可以通过设置 formatdatetime_parsedatetime_m_is_month_name = 0 恢复之前的行为。 #47246 (Robert Schulze)
  • 仅当使用虚拟文件系统缓存时,此变更才有效。如果虚拟文件系统缓存配置中的 path 非空且不是绝对路径,则会被解析为 <clickhouse server data directory>/caches/<path_from_cache_config> 下的路径。 #48784 (Kseniia Sumarokova)
  • 现在将拒绝具有相同表达式的主/从索引和排序键。可以通过设置 allow_suspicious_indices 禁用此行为。 #48536 (凌涛)

新功能

  • 支持新的聚合函数 quantileGK/quantilesGK,类似 Spark 中的 approx_percentile。Greenwald-Khanna 算法可参考 http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf#46428 (李扬)。
  • 新增语句 SHOW COLUMNS,用于展示来自 system.columns 的提炼信息。#48017Robert Schulze)。
  • SYSTEM SYNC REPLICA 查询新增了 LIGHTWEIGHTPULL 修饰符。LIGHTWEIGHT 版本仅等待 fetch 和 drop-range 操作(忽略 merge 和 mutation)。PULL 版本从 ZooKeeper 拉取新条目,但不会等待其完成。修复了 #47794#48085Alexander Tokmakov)。
  • 添加 kafkaMurmurHash 函数,以与 Kafka 的 DefaultPartitioner 兼容。修复 #47834#48185Nikolay Degterinsky)。
  • 允许通过 GRANT CURRENT GRANTS 轻松创建一个具有与当前用户相同授权的用户。 #48262 (pufit).
  • 新增统计聚合函数 kolmogorovSmirnovTest。关闭 #48228#48325FFFFFFFHHHHHHH)。
  • system.replicas 表中添加了一个 lost_part_count 列。该列的值显示相应表中丢失分区片段的总数。该值存储在 ZooKeeper 中,并可用于替代非持久化的 ReplicatedDataLoss profile 事件来进行监控。 #48526 (Sergei Trifonov).
  • 添加 soundex 函数以提高兼容性。关闭 #39880#48567FriendLey)。
  • 使 JSONExtract 支持 Map 类型。#48629 (李扬)。
  • 添加 PrettyJSONEachRow 格式,以输出带有换行分隔符和 4 个空格缩进的格式化 JSON。#48898 (Kruglov Pavel)。
  • 新增 ParquetMetadata 输入格式,用于读取 Parquet 文件元数据。 #48911 (Kruglov Pavel).
  • 添加 extractKeyValuePairs 函数,用于从字符串中提取键值对。输入字符串可能包含噪声(例如日志文件 / 不必完全采用键值对格式),算法会根据传入函数的参数查找匹配的键值对。目前,该函数接受以下参数:data_column(必需)、key_value_pair_delimiter(默认为 :)、pair_delimiters(默认为 \space \, \;)以及 quoting_character(默认为双引号)。#43606Arthur Passos)。
  • 现在,函数 replaceOne()、replaceAll()、replaceRegexpOne() 和 replaceRegexpAll() 现在可以使用非 const 的模式和替换参数进行调用。#46589 (Robert Schulze)。
  • 新增用于处理 Map 类型列的函数:mapConcatmapSortmapExists#48071Anton Popov)。

性能改进

  • 现在读取 Parquet 格式的文件速度更快。I/O 和解码已实现并行化(由 max_threads 设置控制),并且只读取所需的数据范围。#47964 (Michael Kolupaev).
  • 如果我们运行一个带有 IN(子查询)的变更(mutation)操作,如:ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table),并且表 t 有多个分区片段,那么对于每个分区片段都会在内存中构建一次子查询 SELECT id FROM huge_table 的 set。如果分区片段很多,则可能会消耗大量内存(并导致 OOM)和 CPU。解决方案是为当前由 mutation 任务构建的 set 引入一个短生命周期的缓存。如果同一 mutation 的另一个任务并发执行,它可以在缓存中查找该 set,等待其构建完成并复用。#46835 (Alexander Gololobov).
  • 仅在必要时才在执行 ALTER TABLE 查询时检查依赖关系。#48062 (Raúl Marín).
  • 优化函数 mapUpdate#48118 (Anton Popov).
  • 现在发往本地副本的内部查询会被显式发送,并通过回环接口接收数据。对于并行副本,不再遵循 prefer_localhost_replica 设置。这对于实现更好的调度是必要的,并且使代码更简洁:发起方只负责协调读取过程和合并结果,持续响应请求,而所有次级查询负责读取数据。注意:使用回环接口本身性能并不是最优的,否则某些副本可能会因任务饥饿而导致查询执行更慢,且无法利用所有可用资源。协调器的初始化现在更加惰性化。所有传入请求都包含关于读取算法的信息,我们在第一个请求到来时使用该信息初始化协调器。如果任何副本决定使用不同的算法读取,将抛出异常并终止查询。#48246 (Nikita Mikhaylov).
  • IN 子句右侧的子查询仅用于分析跳过索引,并且通过设置(use_skip_indexes=0)禁用它们时,不再为其构建 set。此前这可能会影响查询性能。#48299 (Anton Popov).
  • 在读取 FROM file(...) 之后立即并行化查询处理。相关 issue 为 #38755#48525 (Igor Nikonov)。现在在从任意数据源读取之后就会并行化查询处理。受影响的数据源主要是简单或外部存储,例如表函数 urlfile#48727 (Igor Nikonov)。这由设置 parallelize_output_from_storages 控制,默认未启用。
  • 降低了 ThreadPool 互斥锁的竞争(在大量小任务场景下可能提升性能)。#48750 (Sergei Trifonov).
  • 降低了多个 ALTER DELETE mutation 的内存使用。#48522 (Nikolai Kochetov).
  • 当启用 skip_unavailable_shards 设置时,移除多余的连接尝试。#48771 (Azat 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 进行完善的测试。#47307 (Kseniia Sumarokova)。
  • 为 socket 添加异步连接和异步写入能力。将跨分片的连接创建以及查询/外部表的发送改为异步。使用 fibers 重构代码。修复 #46931。在此 PR 合并后,我们将能够默认提高 connect_timeout_with_failover_mshttps://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,实现了更灵活的将插入表结构传播到 table function 的方式。修复了名称映射和使用虚拟列时的问题。不再需要使用 auto 设置。#47962Yakov 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/BACKUP 的按查询/按服务器级别限流(服务器级别设置: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)。#48242Azat Khuzhin)。
  • CapnProto 格式中支持更多类型:Map、(U)Int(128|256)、Decimal(128|256)。在输入/输出时允许进行整数类型转换。#48257 (Kruglov Pavel)。
  • 在正常情况下,不要抛出 CURRENT_WRITE_BUFFER_IS_EXHAUSTED 错误。 #48288 (Raúl Marín).
  • 新增设置项 keeper_map_strict_mode,用于对基于 KeeperMap 表的操作提供额外的强一致性保证。#48293Antonio Andelic)。
  • 检查 simple dictionary 的主键类型是否为原生无符号整数类型。新增设置项 check_dictionary_primary_key 以保持兼容性(将 check_dictionary_primary_key = false 以禁用检查)。 #48335 (lizhuoyu5).
  • 不要为 KeeperMap 复制变更操作,因为没有必要。#48354 (Antonio Andelic)。
  • 允许在 Protobuf 格式中将未命名 tuple 读写为嵌套 Message。Tuple 元素与 Message 字段按位置匹配。#48390 (Kruglov Pavel)。
  • 在新规划器中支持 additional_table_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#48440 (Nikolay Degterinsky)。
  • 在出现可重试错误时,为 MergeTree 表在加载数据分区片段时增加了重试机制。 #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 条目中包含的 mutation 命令数量(默认值为 10000)。 #48731 (Alexander Tokmakov)。
  • 在 AggregateFunction 类型中,不再将未使用的 arena 字节计为 read_bytes#48745Raú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。关闭 issue #48718#48850 (sichenzhao)。
  • 函数 "arrayDifferenceSupport()"、"arrayCumSum()" 和 "arrayCumSumNonNegative()" 现在支持宽整数类型 (U)Int128/256 的输入数组。 #48866 (cluster)。
  • clickhouse-client 中的多行历史记录现在不再填充空格,这使粘贴操作更加自然。#48870 (Joanna Hulboj)。
  • 在极少数情况下,当在 LXC 中运行 ClickHouse 且使用 LXCFS 时,进行了一个小幅改进。LXCFS 存在一个问题:有时在读取 /proc 内部文件时会返回错误 "Transport endpoint is not connected"。此前该错误已被正确记录到 ClickHouse 的服务器日志中。此外,我们通过重新打开文件来规避此问题。这是一个极小的改动。 #48922 (Real).
  • 改进预取的内存核算。在 CI 中随机化预取设置。#48973 (Kseniia Sumarokova).
  • 为 GCS 的原生复制操作正确设置请求头。 #48981 (Antonio Andelic).
  • 在命令行中新增支持使用连字符而不是下划线来指定设置名称,例如使用 --max-threads 代替 --max_threads。此外,还支持使用如 这样的 Unicode 连字符来代替 --——这在与其他公司团队协作时很有用,例如对方团队的一位经理从 MS Word 中复制粘贴了代码。#48985 (alekseygolub)。
  • 当使用 SSL 用户证书进行身份验证失败时,增加回退到密码验证的机制。关闭 #48974#48989Nikolay Degterinsky)。
  • 改进嵌入式仪表板。关闭 #46671#49036 (Kevin Zhang).
  • 为日志消息添加 profile events,以便能轻松按严重性统计日志消息数量。 #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 和 indices 的压缩方式。 #48286 (Alexey Milovidov).
  • 将内部 ZSTD 从 1.5.4 升级到 1.5.5。 #46797 (Robert Schulze).
  • 在测试中随机化从紧凑分区片段到宽分区片段的垂直合并。 #48287 (Raúl Marín).
  • 在 HDFS 中支持 CRC32 校验和,并修复性能问题。 #48614 (Alexey Milovidov).
  • 移除残留的 GCC 支持代码。 #48671 (Robert Schulze).
  • 新增启用新 analyzer 基础设施的 CI 任务。 #48719 (Dmitry Novik).

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

  • 修复在由后台线程推送物化视图时 system.query_views_log 的记录问题 #46668 (Azat Khuzhin)。
  • 修复了多个与 RENAME COLUMN 相关的问题 #46946alesapin)。
  • 修复 clickhouse-format 中一些轻微的高亮显示问题 #47610 (Natasha Murashkina)。
  • 修复 LLVM 的 libc++ 中的一个错误,该错误会在将大小超过 INT_MAX 的分区片段上传到 S3 时导致崩溃 #47693 (Azat Khuzhin)。
  • 修复 sparkbar 函数中的溢出问题 #48121Vladimir C)。
  • 修复 S3 中的竞争条件 #48190 (Anton Popov)。
  • 由于行为不一致,禁用聚合函数的 JIT 功能 #48195Alexey Milovidov)。
  • 修复 ALTER 语句格式(小问题)#48289Natasha Murashkina)。
  • 修复 RabbitMQ 中的 CPU 使用问题(在 23.2 版本中因 #44404 而加剧)#48311Kseniia Sumarokova)。
  • 修复在对基于 Distributed 的 Merge 查询执行 EXPLAIN PIPELINE 时发生的崩溃 #48320 (Azat Khuzhin)。
  • 修复将 LowCardinality 序列化为 Arrow 字典时的问题 #48361 (Kruglov Pavel).
  • 重置 TemporaryFileStream 中缓存文件片段的下载器 #48386 (Vladimir C)。
  • 修复在执行 DROP/REPLACE PARTITION 时可能出现的 SYSTEM SYNC REPLICA 卡住问题 #48391 (Azat Khuzhin)。
  • 修复在加载依赖于字典的分布式表时出现的启动错误 #48419 (MikhailBurdukov)。
  • 在自动重命名 system 表时不再检查依赖关系 #48431 (Raúl Marín)。
  • 仅更新 KeeperMap 存储中受影响的行 #48435 (Antonio Andelic)。
  • 修复 VFS 缓存中可能发生的段错误 #48469Kseniia Sumarokova)。
  • 在未提供常量字符串参数时,toTimeZone 函数会抛出错误 #48471 (Jordi Villar)。
  • 修复 Protobuf 中与 IPv4 相关的逻辑错误,新增对 Date32 的支持 #48486 (Kruglov Pavel).
  • system.settings 表中在处理具有多个取值的设置项时,"changed" 标志计算不正确 #48516 (MikhailBurdukov)。
  • 修复在启用压缩时的 Memory 存储引擎 #48517Anton Popov)。
  • 修复在客户端重新连接时,Bracketed Paste 模式导致密码输入异常的问题 #48528Michael Kolupaev)。
  • 修复键类型为 IP 和 UUID 的嵌套 map 问题 #48556 (Yakov Olkhovskiy).
  • 修复哈希字典并行加载器中的未捕获异常问题 #48571 (Azat Khuzhin).
  • groupArray 聚合函数在 Nullable 类型上处理空结果时能够正确工作 #48593 (lgbo)。
  • 修复 Keeper 中的一个 bug:在 ACL 中使用 auth scheme 创建节点时,节点有时不会被创建。 #48595 (Aleksei Filatov).
  • 允许在 IPv4 与 UInt 之间使用比较运算符 #48611Yakov Olkhovskiy)。
  • 修复缓存中可能出现的错误 #48636Kseniia Sumarokova)。
  • 异步插入空数据时将不再抛出异常。 #48663 (Anton Popov).
  • RENAME TABLE 操作失败时修复表的依赖关系 #48683Azat Khuzhin)。
  • 如果主键中包含重复的列(这种情况只会在使用 PROJECTION 时出现),在之前的版本中可能会触发一个 bug #48838Amos Bird)。
  • 修复 ZooKeeper 在 join send_thread/receive_thread 时的竞态条件 #48849Alexander Gololobov)。
  • 修复在尝试删除被忽略的、使用零拷贝复制的已分离 part 时出现的意外 part 名称错误 #48862 (Michael Lex)。
  • 修复从 Parquet/Arrow 读取 Date32 列时未被解析为 Date32 列的问题 #48864 (Kruglov Pavel).
  • 修复在对带有 ROW POLICY 且包含点号的列的表执行 SELECT 查询时出现的 UNKNOWN_IDENTIFIER 错误 #48976Kruglov Pavel)。
  • 修复按空 Nullable 字符串聚合时的问题 #48999 (LiuNeng).

ClickHouse 23.3 LTS 版本发布,2023-03-30

升级说明

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

新特性

  • 添加了一种使用 parallel_replicas_custom_keyparallel_replicas_custom_key_filter_type 在副本之间拆分工作的新模式。若集群由单个分片(shard)和多个副本组成,则会随机选择最多 max_parallel_replicas 个副本并将其视为分片。对于每个分片,在查询发送到该分片之前,会在发起端为该查询添加相应的过滤条件。如果集群由多个分片组成,其行为与 sample_key 相同,但可以自定义任意键。#45108Antonio Andelic)。
  • 在取消时显示部分结果的选项:新增查询设置项 partial_result_on_first_cancel,允许被取消的查询(例如通过 Ctrl-C 中断)返回部分结果。#45689 (Alexey Perevyshin).
  • 为临时表新增对任意表引擎的支持(Replicated 和 KeeperMap 引擎除外)。关闭 #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 时必需);同时,对于默认用户,不再需要像在 23.2 中那样手动指定 show_named_collections 即可拥有完整访问权限。#46241Kseniia Sumarokova)。
  • 允许嵌套自定义磁盘。此前,自定义磁盘仅支持扁平磁盘结构。#47106 (Kseniia Sumarokova)。
  • 新增函数 widthBucket(并提供用于兼容性的别名 WIDTH_BUCKET)。 #42974#46790 (avoiderboi)。
  • 根据指定的格式字符串添加新函数 parseDateTime / parseDateTimeInJodaSyntaxparseDateTime 按 MySQL 语法将字符串解析为 DateTime,parseDateTimeInJodaSyntax 按 Joda 语法进行解析。#46815 (李扬).
  • dummy UInt8 用作表函数 null 的默认结构。修复了 #46930#47006flynn)。
  • parseDateTimeBestEffort FUNCTION 现在支持带逗号的日期格式,例如 Dec 15, 2021。解决了 #46816#47071chen)。
  • 为 HTTP 接口添加 http_wait_end_of_queryhttp_response_buffer_size 两个设置项,对应 URL 参数 wait_end_of_querybuffer_size。这样就可以在配置 profile 中修改这些设置项。#47108 (Vladimir C)。
  • 新增 system.dropped_tables 表,用于显示已在 Atomic 数据库中执行 DROP 但尚未彻底移除的表。#47364 (chen).
  • 添加 INSTR 作为 positionCaseInsensitive 的别名,以兼容 MySQL。关闭了 #47529#47535flynn)。
  • 新增 toDecimalString 函数,用于将数字转换为固定精度的字符串。 #47838 (Andrey Zvonov).
  • 添加 MergeTree 设置项 max_number_of_mutations_for_replica。它将每个副本的 part 变更数量限制为指定值。0 表示对每个副本的 mutation 数量不设限制(执行仍可能受其他设置约束)。 #48047 (Vladimir C)。
  • 新增 Map 相关函数 mapFromArrays,用于从一对数组构造一个 Map。 #31125 (李扬)。
  • 允许控制 Parquet/ORC/Arrow 输出格式的压缩方式,并新增对更多压缩输入格式的支持。解决了 #13541#47114Kruglov Pavel)。
  • 为原生协议添加基于 SSL 的用户证书认证。解决了 #47077#47596Nikolay Degterinsky)。
  • parseDateTime 新增 *OrNull() 和 *OrZero() 变体,并添加别名 str_to_date 以与 MySQL 保持一致。 #48000 (Robert Schulze).
  • 添加了 REGEXP 运算符(类似于 "LIKE"、"IN"、"MOD" 等运算符),以提高与 MySQL 的兼容性 #47869 (Robert Schulze)。

性能改进

  • 内存中的标记现已压缩处理,内存占用减少 3–6 倍。#47290 (Michael Kolupaev)。
  • 在之前的版本中,大量文件的备份速度慢得难以置信。现在不再如此——现在快得难以置信。#47251Alexey Milovidov)。为备份的 I/O 操作引入了单独的线程池。这样可以让其独立于其他线程池进行扩展,从而提升性能。#47174Nikita Mikhaylov)。在备份处理的最终阶段,使用 MultiRead 请求和重试机制来收集元数据。#47243Nikita Mikhaylov)。如果备份和要恢复的数据都在 S3 中,那么从现在开始将使用服务端复制。#47546Vitaly Baranov)。
  • 修复了在使用 FINAL 的查询中出现的过多读取。 #47801 (Nikita Taranov).
  • 在服务器启动时,max_final_threads 的 SETTING 将按照与 max_threads 相同的算法被设置为 CPU 核心数。这提升了在拥有大量 CPU 的服务器上执行 final 的并发性能。#47915Nikita Taranov)。
  • 允许为以 CLICKHOUSE 作为源的 DIRECT 字典在多线程中执行读取 pipeline。要启用此功能,请在 CREATE DICTIONARY 语句中,为该源的 SETTINGS 部分设置 dictionary_use_async_executor=1#47986 (Vladimir C)。
  • 优化仅包含单个 Nullable 键的聚合性能。 #45772 (LiuNeng).
  • hasTokenOrNullhasTokenCaseInsensitivehasTokenCaseInsensitiveOrNull 实现了对小写 tokenbf_v1 索引的使用。#46252 (ltrk2).
  • 通过使用 SIMD 先搜索前两个字符来优化 positionLIKE 函数。#46289Jiebin Sun)。
  • 优化 system.detached_parts 中的查询,该表的体量可能非常大。针对块大小限制新增了多个数据源;在每个块中使用 IO 线程池来计算分区片段大小,即并行执行系统调用。 #46624 (Sema Checherinda).
  • 将 ReplicatedMergeTree 表中 max_replicated_merges_in_queue 的默认值从 16 提高到 1000。这使得在具有大量副本的集群上(例如在 ClickHouse Cloud 中使用共享存储的集群)可以更快地执行后台合并操作。 #47050 (Alexey Milovidov).
  • clickhouse-copier 更新为改用 GROUP BY 而不是 DISTINCT 来获取分区列表。对于大型表,将查询耗时从 500 多秒降低到 1 秒以内。#47386Clayton McClure)。
  • 修复 ASOF JOIN 中的性能降低问题。#47544 (Ongkong).
  • 在 Keeper 中进一步增加批处理,通过在处理读取请求时避免打断批次来提升性能。 #47978 (Antonio Andelic)。
  • 在 Merge 引擎中,即使各列具有不同的 DEFAULT 表达式,也允许使用 PREWHERE。 #46831 (Azat Khuzhin).

实验性特性

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

改进

  • 默认启用 input_format_json_ignore_unknown_keys_in_named_tuple#46742Kruglov Pavel)。
  • 允许在向 MATERIALIZED VIEW 推送数据时忽略错误(新增 materialized_views_ignore_errors SETTING,默认值为 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).
  • 此改进对用户而言应是透明的。基于查询计划重新实现 PROJECTION 分析。新增设置项 query_plan_optimize_projection=1,用于在旧实现和新实现之间切换。修复了 #44963#46537Nikolai Kochetov)。
  • 默认在输出格式中使用 Parquet v2,而不是 v1。新增设置项 output_format_parquet_version 用于控制 Parquet 版本,可能的取值为 1.02.42.62.latest(默认)。#46617Kruglov Pavel)。
  • 现在可以使用新的配置语法配置名称中包含点号(.)的 Kafka 主题。#46752Robert Schulze)。
  • 修复用于检查 hyperscan 模式中存在问题的重复的启发式算法。#46819 (Robert Schulze).
  • 当某个数据块由其他副本并发创建时,不再向 system.errors 报告 ZK 节点已存在的情况。 #46820 (Raúl Marín).
  • 增加 clickhouse-local 中已打开文件数的限制。这样它就可以在具有大量 CPU 核心的服务器上从 web 表读取数据。在已打开文件过多的情况下,不再因为这个原因而放弃从 URL 表引擎读取。修复了 #46852#46853Alexey Milovidov)。
  • 当无法解析数字时抛出的异常现在具有更易读的异常消息。#46917Robert Schulze)。
  • 在每个任务处理完成后都会更新 system.backups,以跟踪备份进度。#46989Aleksandr Musorin)。
  • 允许在 Native 输入格式中进行类型转换。添加设置项 input_format_native_allow_types_conversion 来控制该行为(默认启用)。#46990 (Kruglov Pavel)。
  • range 函数中支持 IPv4,以生成 IP 范围。 #46995 (Yakov Olkhovskiy).
  • 在无法将数据片段从一个卷/磁盘移动到另一个卷/磁盘时,改进异常信息。 #47032 (alesapin).
  • JSONType 函数中支持 Bool 类型。此前对于布尔值会错误地返回 Null 类型。#47046 (Anton Popov)。
  • 使用 _request_body 参数配置预定义的 HTTP 查询。#47086 (Constantine Peresypkin)。
  • 在内置 UI 的 SQL 编辑器中按下 Enter 键时自动缩进。 #47113 (Alexey Korepanov)。
  • 使用 'sudo' 进行自解压时,会尝试将解压出的文件的 uid 和 gid 设置为当前运行用户。 #47116 (Yakov Olkhovskiy).
  • 此前,repeat 函数的第二个参数只接受无符号整数类型,这意味着无法传入 -1 等值。这一行为与 Spark 中对应函数不一致。在本次更新中,repeat 函数已被修改为与 Spark 函数的行为保持一致,现在可以接受相同类型的输入,包括负整数。已进行了大量测试以验证更新后实现的正确性。 #47134 (KevinyhZou)。注意:此变更日志条目由 ChatGPT 重写。
  • 从堆栈跟踪中移除 ::__1 部分。在堆栈跟踪中将 std::basic_string<char, ... 显示为 String#47171 (Mike Kot).
  • 重新实现 interserver 模式以避免重放攻击(注意,该变更与旧版本服务器保持向后兼容性)。 #47213 (Azat Khuzhin).
  • 改进正则表达式分组的识别,并优化 regexp_tree 字典。 #47218 (Han Fei).
  • Keeper 改进:新增 4LW 命令 clrs,用于清理 Keeper 使用的资源(例如释放未使用的内存)。#47256 (Antonio Andelic).
  • 为编解码器 DoubleDelta(bytes_size)Gorilla(bytes_size)FPC(level, float_size) 添加可选参数,从而可以在 clickhouse-compressor 中在未指定列类型的情况下使用这些编解码器。修复在 clickhouse-compressor 中使用这些编解码器时可能出现的异常退出和算术错误。修复: https://github.com/ClickHouse/ClickHouse/discussions/47262#47271Kruglov Pavel)。
  • runningDifference 函数添加对 bigint 类型的支持。解决 #47194#47322Nikolay Degterinsky)。
  • 为具有过期时间的 S3 凭证添加一个过期窗口,以避免在某些极端情况下出现 ExpiredToken 错误。可以通过 expiration_window_seconds 配置进行控制,默认值为 120 秒。#47423 (Antonio Andelic)。
  • Avro 格式中支持 Decimal 和 Date32。#47434Kruglov Pavel)。
  • 在检测到从 OrdinaryAtomic 的转换中断时,不要启动服务器,并输出更完善的错误信息以及故障排查指引。 #47487 (Alexander Tokmakov).
  • system.opentelemetry_span_log 添加一个新列 kind。该列存储 OpenTelemetry 中定义的 SpanKind 值。#47499 (Frank Chen)。
  • 允许在 Protobuf 格式中仅使用根字段名作为列名来读取/写入嵌套数组。之前列名必须包含所有嵌套字段名(例如 a.b.c Array(Array(Array(UInt32)))),现在可以只使用 a Array(Array(Array(UInt32)))#47650Kruglov 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 event。#47885Antonio Andelic)。
  • 为 ClickHouse 安装添加 --link--noninteractive-y)选项。修复 #47750#47887Nikolay Degterinsky)。
  • 修复了在附加到 materialized view 时,如果其依赖表不可用会出现 UNKNOWN_TABLE 异常的问题。这在尝试从备份恢复状态时可能会很有用。#47975 (MikhailBurdukov)。
  • 修复在加密磁盘配置中未添加可选路径时的问题。 #47981 (Kseniia Sumarokova).
  • 在参数化视图中支持 CTE。实现:已更新以便在计算标量子查询时允许使用查询参数。#48065 (SmitaRKulkarni).
  • 支持大整数 (U)Int128/(U)Int256、任意键类型的 Map,以及任意精度(不再局限于 3 和 6)的 DateTime64#48119 (Kruglov Pavel).
  • 允许在行输入格式中忽略由于未知枚举值导致的错误。 #48133 (Alexey Milovidov).

构建/测试/打包改进

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

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

ClickHouse 发行版 23.2,2023-02-23

向后不兼容变更

  • 为函数 "toDayOfWeek()"(别名:"DAYOFWEEK")扩展了一个模式参数,用于指示一周是从星期一还是星期天开始,以及计数是从 0 还是 1 开始。为了与其他日期时间函数保持一致,模式参数被插入到时间参数和时区参数之间。这会导致之前使用(此前未在文档中说明的)两个参数语法 "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 在真实数据集上的性能。关闭了 issue #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, ...)#41976Kseniia Sumarokova)。
  • system.part_log 中公开 ProfileEvents 计数器。#38614Bharat Nallan)。
  • 对现有的 ReplacingMergeTree 引擎进行了增强,允许插入重复数据。在一个 MergeTree 引擎中同时利用了 ReplacingMergeTreeCollapsingMergeTree 的优势。被标记为删除的数据在查询时不会返回,但也不会从磁盘上移除。 #41005 (youennL-cs).
  • 新增 generateULID 函数。解决 #36536#44662Nikolay Degterinsky)。
  • 添加 corrMatrix 聚合函数,用于计算各列两两之间的相关性矩阵。此外,由于聚合函数 covarSampcovarPopcorr 类似,同时新增了 covarSampMatrixcovarPopMatrix。@alexey-milovidov 关闭了 #44587#44680 (FFFFFFFHHHHHHH)。
  • 引入 arrayShuffle FUNCTION,用于对数组进行随机排列。 #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)。
  • 'x''w''S' 添加对 JodaTime 格式的支持。参见 https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html#46073 (zk_kiger)。
  • 新增对窗口函数 ntile 的支持。(lgbo)。
  • 新增 final 设置,以隐式地将 FINAL 修饰符应用于所有表。 #40945 (Arthur Passos).
  • 新增了 arrayPartialSortarrayPartialReverseSort 函数。 #46296 (Joanna Hulboj).
  • 新的 HTTP 参数 client_protocol_version 允许为以 Native 格式返回的 HTTP 响应设置客户端协议版本。#40397#46360 (Geoff Genz)。
  • 新增函数 regexpExtract,用于兼容 Spark 函数 REGEXP_EXTRACT。其行为与已有函数 extract 类似。 #46469 (李扬).
  • 新增函数 JSONArrayLength,返回最外层 JSON 数组中的元素个数。如果输入的 JSON 字符串无效,该函数返回 NULL。 #46631 (李扬)。

性能优化

  • 引入的逻辑在 PREWHERE 条件是多个条件的合取(cond1 AND cond2 AND ...)时生效。它会将那些需要读取相同列的条件分组成若干步骤。在每个步骤之后,会计算完整条件中对应的部分,并可能对结果行进行过滤。这样可以在后续步骤中读取更少的行,从而节省 I/O 带宽并减少计算开销。该逻辑目前默认是禁用的。一旦确认不会带来任何回归问题,它将在未来的某个版本中默认启用,因此强烈建议在测试中使用。它可以通过两个设置进行控制:"enable_multiple_prewhere_read_steps" 和 "move_all_conditions_to_prewhere"。#46140Alexander Gololobov)。
  • 如果表的分区键和 GROUP BY 键兼容,新增了一个选项可对各个分区进行独立聚合。该行为由设置 allow_aggregate_partitions_independently 控制。由于适用范围有限(请参阅文档),该选项默认关闭。 #45364 (Nikita Taranov).
  • 允许在 Compact 格式的分区片段上使用 Vertical 合并算法。这将显著减少 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 (李扬).
  • position FUNCTION 在待搜索子串为空时添加快速路径。 #45382 (李扬).
  • 默认启用 query_plan_remove_redundant_sorting 优化。此优化功能最初在 #45420 中实现。#45567 (Igor Nikonov)。
  • 增大 HTTP Transfer Encoding 的分块大小,以提升通过 HTTP 接口执行大型查询时的性能。#45593 (Geoff Genz)。
  • 优化了在包含大量 Array/Map/Nested 列的表上执行的短 SELECT 查询的性能。 #45630 (Anton Popov).
  • 提升对大整数和 Decimal 类型进行过滤时的性能。#45949 (李扬)。
  • 此更改可以有效减少从 ColumnNullable(UInt8) 获取过滤器的开销,并提升整体查询性能。为了评估此更改的影响,我们采用了 TPC-H 基准测试,但对其做了修改:将列类型从非 Nullable 改为 Nullable,并以其查询的 QPS 作为性能指标进行测量。 #45962 (Zhiguo Zhou).
  • _part_partition_id 这两个虚拟列的类型设为 LowCardinality(String)。修复 #45964#45975flynn)。
  • Decimal 类型转换中,当 scale 不发生变化时提升性能。 #46095 (Alexey Milovidov).
  • 允许提升读取数据时的预取量。 #46168 (Kseniia Sumarokova).
  • arrayExists(x -> x = 1, arr) 重写为 has(arr, 1),将性能提升 1.34 倍。#46188 (李扬)。
  • 修复在非远程磁盘上执行垂直合并时过高的内存使用。在远程磁盘上遵守 max_insert_delayed_streams_for_parallel_write 设置。#46275Nikolai Kochetov)。
  • 将 zstd 更新到 v1.5.4。该版本在性能和压缩比方面有一些小幅改进。如果你运行的是不同 ClickHouse 版本的副本,可能会看到如下错误信息 Data after merge/mutation is not byte-identical to data on another replicas.,并附带解释。这些消息属于正常现象,你不需要担心。#46280Raúl Marín)。
  • 修复由 #39737 引起的性能退化问题。#46309 (Alexey 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 (李扬).
  • 改进了在带 ORDER BY 的顶层查询计划中,内存受限的合并与聚合之间的交互方式。此前,在某些情况下我们会为 AIO 回退到显式排序,但实际上并不需要这样做。#45892 (Nikita Taranov)。
  • 默认情况下,并发合并采用轮询(round-robin)方式进行调度,以确保公平且无饥饿的运行。此前在高负载分片中,由于使用严格优先级调度,大型合并任务可能会被较小的合并任务“饿死”。新增 background_merges_mutations_scheduling_policy 服务器配置选项,用于选择调度算法(round_robinshortest_task_first)。#46247Sergei Trifonov)。

改进

  • 在 ZooKeeper 会话丢失时默认启用对 INSERT 的重试。已在生产环境中使用。#46308 (Alexey Milovidov)。
  • 新增在命名元组的 JSON 对象中忽略未知键的支持(input_format_json_ignore_unknown_keys_in_named_tuple)。 #45678 (Azat Khuzhin).
  • 支持在带有 final 的查询中,将含有排序键表达式的 where 子句下推到 prewhere 以进行优化。#38893#38950 (hexiaoting)。
  • 为备份添加了新的监控指标:num_processed_files 和 processed_files_size,用于表示实际已处理的文件数量及其总大小。#42244 (Aleksandr).
  • 针对服务器间 DNS 错误添加了重试机制。#43179 (Anton Kozlov).
  • Keeper 改进:尝试在磁盘上预分配空间,以避免不可预期的磁盘空间耗尽问题。引入 max_log_file_size 设置,用于限制 Keeper 的 Raft 日志文件的最大大小。 #44370 (Antonio Andelic).
  • 在副本为只读时,优化副本延迟 API 逻辑。#45148 (mateng915).
  • clickhouse-client 中,当空密码无效时以交互方式提示输入密码。关闭 #46702#46730Nikolay Degterinsky)。
  • 将对非 Float* 类型列使用的 Gorilla 压缩标记为可疑。#45376Robert 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#45648SmitaRKulkarni)。
  • 将设置项 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 中引入、用于替代 HeadObjectGetObjectAttributes 请求改为可选(且默认禁用)。#45701Vitaly Baranov)。
  • 添加了基于连接名称覆盖连接设置的功能(也就是说,现在你不必再为每个连接单独存储密码,只需将所有内容统一放入 ~/.clickhouse-client/config.xml 中,甚至可以为不同连接使用各自的历史记录文件,这在某些场景下也很有用)。 #45715 (Azat Khuzhin).
  • Arrow 格式:支持 duration 类型。修复 #45669#45750flynn)。
  • 扩展 Query Cache 的日志记录,以便更好地分析和排查缓存行为。#45751Robert Schulze)。
  • query cache 的服务器级别设置现在可以在运行时重新配置。#45758Robert Schulze)。
  • 当使用命名集合为表函数指定参数时,在日志中隐藏密码。#45774 (Vitaly Baranov)。
  • 改进内部 S3 客户端,使其能够针对不同类型的 URL 正确自动推断区域和重定向。#45783 (Antonio Andelic).
  • 在 generateRandom 中添加对 Map、IPv4 和 IPv6 类型的支持,主要用于测试。#45785Raúl Marín)。
  • 为 IP 类型添加对 empty/notEmpty 的支持。 #45799 (Yakov Olkhovskiy)。
  • num_processed_files 被拆分为两列:num_files(用于 BACKUP)和 files_read(用于 RESTORE)。列 processed_files_size 被拆分为两列:total_size(用于 BACKUP)和 bytes_read(用于 RESTORE)。#45800 (Vitaly Baranov)。
  • 为实现 MySQL 兼容性,增加对 SHOW ENGINES 查询的支持。#45859Filatenkov 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 查询的算法。#46000Azat Khuzhin)。
  • 禁止使用错误的创建 View 语法 CREATE View X TO Y AS SELECT。关闭了 #4331#46043flynn)。
  • Log 系列存储引擎现已支持设置 storage_policy。修复 #43421#46044 (flynn)。
  • 在结果为空时改进 JSONColumns 格式。修复了 #46024 中的问题。#46053flynn)。
  • 新增 SipHash128 的参考实现。 #46065 (Salvatore Mesoraca).
  • 新增一个指标,用于记录使用 mmap 进行内存分配的时间和字节数。#46068 (李扬)。
  • 目前,对于 leftPadrightPadleftPadUTF8rightPadUTF8 等函数,第二个参数 length 必须为 UInt8|16|32|64|128|256 之一,这对 ClickHouse 用户来说限制过于严格,而且也与 arrayResizesubstring 等其他类似函数不一致。#46103李扬)。
  • 修复了在调试构建下,当 welchTTest 函数的统计值为 NaN 时触发的断言错误,并将其行为与其他类似函数统一。修改 studentTTest 的行为,使其在此类情况下返回 NaN 而不是抛出异常,因为之前的行为不够方便。修复了 #41176#42162#46141Alexey Milovidov)。
  • 更方便地使用大整数和 ORDER BY WITH FILL。在对大整数(128 位和 256 位)执行 ORDER BY WITH FILL 时,允许为 WITH FILL 的起始和结束点使用普通整数。修复了当大整数的起始或结束点为负数时产生错误结果的问题。关闭了 #16733#46152Alexey Milovidov)。
  • 根据 issue,向 system.tables 添加 partsactive_partstotal_marks 列。 #46161 (attack204)。
  • 函数 "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" 现在会拒绝那些在 vectorscan 中极有可能导致非常缓慢执行的正则表达式。 #46167 (Robert Schulze).
  • 当启用 insert_null_as_default 且某列未定义默认值时,将使用该列数据类型的默认值。本 PR 还修复了在 LowCardinality 列中对 null 使用默认值时的行为。#46171 (Kruglov Pavel)。
  • 对于 S3 客户端,更优先使用显式配置的访问密钥。如果将 use_environment_credentials 设置为 true,并且用户通过查询或配置提供了访问密钥,则优先使用这些密钥,而不是环境变量中的密钥。 #46191 (Antonio Andelic).
  • 为函数 "formatDateTime()" 添加别名 "DATE_FORMAT()",以提高与 MySQL 的 SQL 方言的兼容性,并为函数 formatDateTime 扩展替换符 "a"、"b"、"c"、"h"、"i"、"k"、"l"、"r"、"s"、"W"。 ### 面向用户变更的文档条目 用户可读的简短描述:DATE_FORMATformatDateTime 的别名。根据给定的格式字符串格式化时间。Format 是一个常量表达式,因此无法为单个结果列使用多种格式。(提供指向 formatDateTime 的链接)。#46302 (Jake Bamrah)。
  • 为并行副本(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 runtime 实现的 GWP-ASan。修复了 #27039#45226Han Fei)。
  • 我们希望让测试变得没那么稳定、更容易暴露问题:在测试中为 MergeTree 的 settings 添加随机化。#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 分支从 "contrib/" 移动到了 "base/poco/"。#46075Robert Schulze)。
  • clickhouse-watchdog 添加一个用于重启子进程的选项。这并没有太大用处。#46312Alexey Milovidov)。
  • 如果环境变量 CLICKHOUSE_DOCKER_RESTART_ON_EXIT 被设置为 1,Docker 容器将以子进程而不是第一个进程的方式运行 clickhouse-server,并在其退出时重启它。#46391Alexey Milovidov)。
  • 修复 systemd service 文件。#46461SuperDJY)。
  • 将构建 ClickHouse 所需的 Clang 最低版本从 12 提升到 15。#46710Robert Schulze)。
  • 将 Intel QPL 从 v0.3.0 升级到 v1.0.0,并构建 libaccel-config,将其以静态方式链接到 QPL 库,而不是动态链接。#45809jasperzhu)。

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

  • StorageRabbitMQ 中严格按照 rabbitmq_flush_interval_msrabbitmq_max_block_size 刷新数据。修复了 #42389 问题。修复了 #45160 问题。#44404Kseniia Sumarokova)。
  • sparkBar 函数中使用 PODArray 进行渲染,以便控制内存使用。关闭问题 #44467#44489Duc Canh Le)。
  • 修复 quantilesExactExclusive、quantilesExactInclusive 函数返回未排序的数组元素的问题。 #45379 (wujunfu).
  • 修复在启用 OpenTelemetry 时 HTTPHandler 中未捕获异常的问题。#45456 (Frank Chen).
  • 不要将 8 位数字推断为 Date 类型。这可能会导致读到错误的数据。#45581Kruglov Pavel)。
  • 修复了 odbc_bridge_use_connection_pooling 设置未被正确使用的问题。#45591Bharat Nallan)。
  • 当缓存回调被调用时,该缓存有可能已经被析构。为保证安全,我们按值捕获成员变量。对于任务调度来说也是安全的,因为在存储被销毁之前,它会先被停用。修复 #45548#45601Han Fei)。
  • 修复在将 Delta 或 DoubleDelta 编解码器与 Gorilla 编解码器组合使用时出现的数据损坏问题。#45615 (Robert Schulze)。
  • 在使用 N-gram Bloom filter 索引时正确进行类型检查,以避免无效读取。#45617 (Antonio Andelic)。
  • 有人报告了几起与 c-ares 相关的段错误。这些问题是我之前的拉取请求(pull request)引入的。我在 Alexander Tokmakov 的帮助下修复了它们。#45629 (Arthur Passos)。
  • 修复在遇到重复主键时的键描述问题。这种情况可能会出现在投影中。详细信息参见 #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 返回空结果)。这是由于 planner 额外添加了一个不必要的 offset 步骤所致。#45822刘陶峰)。
  • 向后兼容 - 允许从 UInt64 到 IPv4 的隐式窄化转换——该转换是 “INSERT ... VALUES ...” 表达式所必需的。#45865 (Yakov Olkhovskiy).
  • 修复了 IPv6 解析器在处理首个八位组缺失的混合 IPv4 地址(如 ::.1.2.3)时的错误。 #45871 (Yakov Olkhovskiy).
  • query_kind 列添加到 system.processes 表和 SHOW PROCESSLIST 查询中,并删除重复代码。该修改修复了一个 bug:全局配置参数 max_concurrent_select_queries 未正确应用于包含 INTERSECTEXCEPT 链的查询。 #45872 (Alexey Milovidov)。
  • 修复函数 stochasticLinearRegression 中的崩溃问题。该问题由 WingFuzz 发现。#45985Nikolai Kochetov)。
  • 修复在读取启用了稀疏列(由设置项 ratio_of_defaults_for_sparse_serialization 控制)的表数据时,带有 INTERSECTEXCEPT 修饰符的 SELECT 查询发生崩溃的问题。 #45987 (Anton Popov)。
  • 修复针对使用 FINAL 的 DESC 排序的顺序读取优化,关闭 #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#46151flynn)。
  • 修复在使用常量键的 fulls_sorting_join 时可能导致流水线卡住的错误。#46175 (Vladimir C)。
  • 在格式化过程中,禁止将 tuple 函数改写成字面量,以避免产生错误结果。 #46232 (Salvatore Mesoraca).
  • 修复以 Arrow 格式读取 LowCardinality(Nullable) 时可能出现的越界访问错误。#46270Kruglov Pavel)。
  • 修复 SYSTEM UNFREEZE 查询因异常 CANNOT_PARSE_INPUT_ASSERTION_FAILED 导致失败的问题。#46325Aleksei Filatov)。
  • 修复在反序列化存储 HashTable 的函数的聚合状态时,可能由于整数溢出而导致的崩溃。#46349Nikolai Kochetov)。
  • 修复在异步插入中,当以 VALUES 格式发送无效数据时可能出现的 LOGICAL_ERROR#46350 (Anton Popov).
  • 修复了在尝试执行 ALTER ... MOVE PART ... TO TABLE 时出现的 LOGICAL_ERROR。此类查询实际上从未被支持。#46359 (Alexander Tokmakov)。
  • 在启用 parallel_distributed_insert_select 时,修复 s3Cluster 在并行分布式 INSERT SELECT 操作中的 schema 推断问题。#46381 (Kruglov Pavel).
  • 修复类似 ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ... 的查询语句,其中 arr1arr2 是同一个 Nested 类型列中的字段。#46387Anton Popov)。
  • Scheduler 可能会调度任务失败。如果发生这种情况,应中止整个 MulityPartUpload,并且 UploadHelper 必须等待已经被调度的任务完成。 #46451 (Dmitry Novik).
  • 修复在 Merge 表中因默认类型不同而导致的 PREWHERE 处理问题(修复当列的默认类型不一致时出现的一些 NOT_FOUND_COLUMN_IN_BLOCK 错误,同时在各表中列类型相同时允许使用 PREWHERE,仅在类型不同时才禁止)。#46454 (Azat Khuzhin)。
  • 修复了在 ORDER BY 子句中使用常量值时可能发生的崩溃。已修复 #46466#46493Nikolai Kochetov)。
  • 当在查询级别指定了 disk 设置,但在 MergeTree 引擎配置的 settings 部分中指定了 storage_policy 时,不再抛出异常。disk 将覆盖配置中的设置。#46533 (Kseniia Sumarokova)。
  • 修复了在 arrayMap 函数中对常量 LowCardinality 参数的错误处理。此缺陷可能在发布版中导致段错误(segfault),并在 debug 构建中触发逻辑错误 Bad cast#46569 (Alexey Milovidov)。
  • 修复 #46557#46611Alexander Gololobov)。
  • 修复当服务器无法在 1 分 30 秒内启动时,clickhouse-server systemd 单元出现无限重启的问题(禁用通过 systemd service 启动 clickhouse-server 时的超时逻辑)。 #46613 (Azat Khuzhin)。
  • 在异步插入过程中分配的内存缓冲区在全局上下文中被释放,但相应 USER 和 查询 的 MemoryTracker 计数器未被正确更新,从而导致误报的 OOM 异常。#46622Dmitry Novik)。
  • 更新为不再从 table_join 中清除 on_expression,因为后续的 ANALYZE 运行仍会使用它,修复了 #45185#46487SmitaRKulkarni)。

ClickHouse 23.1 版本发布,2023-01-26

ClickHouse 23.1 版本

升级说明

  • SYSTEM RESTART DISK 查询现在变为一个空操作(no-op)。#44647alesapin)。
  • HASHED/SPARSE_HASHED 字典的 PREALLOCATE 选项现在变为一个空操作。#45388Azat Khuzhin)。它不再具有显著优势。
  • 禁止在非 Float32 或非 Float64 类型的列上使用 Gorilla 编解码器。#45252Robert Schulze)。这没有意义,并且会导致结果不一致。
  • 对于使用已弃用语法创建的 *MergeTree 表,并行仲裁插入(parallel quorum inserts)可能工作不正确。因此,对此类表完全禁用并行仲裁插入支持。这不会影响使用新语法创建的表。#45430Alexander Tokmakov)。
  • 使用 GetObjectAttributes 请求替代 HeadObject 请求来获取 AWS S3 中对象的大小。此更改修复了在更新 AWS SDK 后,对未显式指定区域的端点的处理。#45288Vitaly Baranov)。已对 AWS S3 和 Minio 进行了测试,但请注意,各种 S3 兼容服务(GCS、R2、B2)可能存在细微的不兼容性。此更改也可能要求您调整 ACL,以允许 GetObjectAttributes 请求。
  • 禁止在时区名称中使用路径。例如,不允许 /usr/share/zoneinfo/Asia/Aden 这样的时区名称;应使用 IANA 时区数据库名称,例如 Asia/Aden#44225Kruglov Pavel)。
  • 由于会产生不正确的结果,禁止使用将等值连接和常量表达式组合在一起的查询(例如 JOIN ON t1.x = t2.x AND 1 = 1)。#44016Vladimir C)。

新功能

  • 用于通过遍历正则表达式树提取键的字典源。可用于解析 User-Agent。 #40878 (Vage Ogannisian)。 #43858 (Han Fei)。
  • 新增参数化 View 功能,现在可以为 View 表引擎指定查询参数。修复了 #40907#41687SmitaRKulkarni)。
  • 新增 quantileInterpolatedWeighted / quantilesInterpolatedWeighted 函数。 #38252 (Bharat Nallan)。
  • Map 类型提供数组展开支持,类似于 Spark 中的 explode 函数。 #43239 (李扬)。
  • 支持 SQL 标准中的二进制和十六进制字符串字面量。#43785 (Mo Xuan)。
  • 允许以 Joda-Time 风格格式化 DateTime。请参考 Joda-Time 文档#43818李扬)。
  • formatDateTime 实现了用于格式化秒的小数部分的格式说明符(%f)。 #44060 (ltrk2). #44497 (Alexander Gololobov).
  • 新增 age 函数,用于计算两个日期或日期时间值之间的差值,并将其表示为完整单位数。关闭了关联的 issue #41115#44421Robert Schulze)。
  • 为字典新增 Null 源。解决 #44240#44502mayamika)。
  • 允许通过 s3_storage_class 配置项设置 S3 存储类别,例如 <s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>。关闭 #44443#44707chen)。
  • 在解析 Named Tuple(命名元组)时,如果 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 函数中添加正确的实现(格式重构后的额外收益)。#42777 (Kruglov Pavel)。
  • 支持在 CapnProto 格式中将 Nested 表读写为 StructList。将 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)。

实验特性

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

性能优化

  • 在启动 MergeTree 表时不再加载非活跃的分区片段。 #42181 (Anton Popov).
  • 在存在大量小文件的情况下,优化了从存储 S3 和表函数 s3 读取数据的延迟。现在在从存储 S3 读取时,remote_filesystem_read_methodremote_filesystem_read_prefetch 这两个设置项会生效。 #43726 (Anton Popov).
  • 对 Parquet/ORC 文件中结构体字段的读取进行了优化,仅加载所需字段。 #44484 (lgbo).
  • 用于 HTTP 接口查询的两级聚合算法曾被错误地禁用。现已重新启用,从而带来了显著的性能提升。#45450 (Nikolai Kochetov)。
  • 为 StorageFile 增加了 mmap 支持,有望提升 clickhouse-local 的性能。#43927 (pufit)。
  • 在 HashedDictionary 中添加了分片支持,以支持并行加载(扩展能力几乎可随分片数量线性提升)。 #40003 (Azat Khuzhin).
  • 提高查询解析速度。#42284Raúl Marín)。
  • exprLowCardinality 列时,一律将 OR 链 expr = x1 OR ... OR expr = xN 替换为 expr IN (x1, ..., xN)。在这种情况下会忽略 optimize_min_equality_disjunction_chain_length 设置。#42889 (Guo Wangyang)。
  • 通过优化与 ThreadStatus 相关的代码,小幅提升性能。#43586 (Zhiguo Zhou)。
  • 通过自动向量化优化列式三元逻辑求值。在该 microbenchmark 的性能测试中,我们在 ICX 设备(Intel Xeon Platinum 8380 CPU)上观测到最高可达 21 倍性能提升#43669Zhiguo Zhou)。
  • 尽量避免在 system.tables 表上获取读锁。#43840 (Raúl Marín)。
  • 优化 ThreadPool。SSB(Star Schema Benchmark)在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上的性能实验表明,该改动可将 ThreadPoolImpl::mutex 的锁竞争有效降低 75%,从而提高 CPU 利用率,并使整体性能提升 2.4%#44308 (Zhiguo Zhou)。
  • 现在,仅在缓存的哈希表大小足够大时,才会应用用于预测哈希表大小的优化(阈值通过经验测定并被硬编码在代码中)。 #44455 (Nikita Taranov)。
  • 对从远程文件系统异步读取的小幅性能优化。 #44868 (Kseniia Sumarokova).
  • 为以下情况添加快速路径优化:- col like '%%'; - col like '%'; - col not like '%'; - col not like '%'; - match(col, '.*')#45244李扬)。
  • 对过滤(WHERE 子句)中的 happy path 优化做了小幅改进。#45289Nikita Taranov)。
  • toUnixTimestamp64* 提供单调性信息,以便在索引分析中进行更多代数优化。#44116 (Nikita Taranov).
  • 允许将用于查询处理的临时数据配置(溢写到磁盘)与文件系统缓存协同工作(占用缓存磁盘的空间)#43972Vladimir C)。这主要提升了 ClickHouse Cloud 的性能,但如果你知道如何操作,同样也适用于自管理部署。
  • 使 system.replicas 表可以并行获取副本状态。修复 #43918#43998 (Nikolay Degterinsky)。
  • 在备份到 S3 时优化内存占用:现在文件将直接复制到 S3,而不再使用 WriteBufferFromS3(后者可能会占用大量内存)。 #45188 (Vitaly Baranov).
  • 为异步块 ID 引入缓存。在启用异步插入去重时,这将减少对 ZooKeeper 的请求数量。#45106 (Han Fei).

改进

  • 在无参数的 generateRandom 中使用插入目标表的结构。 #45239 (Kruglov Pavel)。
  • 允许在 JSONExtract 函数中将 JSON 字段中以字符串形式存储的浮点数隐式转换为整数。例如:JSONExtract('{"a": "1000.111"}', 'a', 'UInt64') -> 1000,之前会返回 0。#45432Anton Popov)。
  • 向表 system.formats 添加了字段 supports_parallel_parsingsupports_parallel_formatting,以提高自省能力。 #45499 (Anton Popov).
  • 改进了在 CustomSeparated/Template 格式中读取 CSV 字段的方式。修复了 #42352#39620#43332Kruglov Pavel)。
  • 统一查询耗时度量方式。 #43455 (Raúl Marín).
  • 在使用表函数 file/hdfs/s3 时,如果 SELECT 查询中存在虚拟列,改进了从插入表自动获取表结构的机制,从而修复可能出现的 Block structure mismatchnumber of columns mismatch 错误。#43695 (Kruglov Pavel)。
  • 为函数 range 添加对有符号参数的支持。修复 #43333#43733sanyu)。
  • 移除冗余排序,例如移除子查询中与 ORDER BY 子句相关的排序。基于 query plan 实现。它对 ORDER BY 子句所做的优化与 optimize_duplicate_order_by_and_distinct 类似,但更加通用,因为它适用于任意冗余的排序步骤(不仅限于由 ORDER BY 子句引起的排序),并且可应用于任意深度的子查询。相关 issue:#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).
  • 将清理线程最近一次分区片段检查的信息添加到 system.parts 表中。#44244 (Dmitry Novik)。
  • 在只读模式下禁止使用表函数进行插入操作。 #44290 (SmitaRKulkarni).
  • 添加名为 simultaneous_parts_removal_limit 的设置项,用于限制 CleanupThread 在一次迭代中处理的分区片段数量。 #44461 (Dmitry Novik).
  • 当查询中只需要虚拟列时,不要初始化 ReadBufferFromS3。此更改可能有助于解决 #44246#44493chen)。
  • 避免列名提示重复。修复 #44130#44519Joanna Hulboj)。
  • 允许在磁盘 endpoint 中使用宏替换。解决 #40951#44533SmitaRKulkarni)。
  • 在启用 input_format_json_read_object_as_string 时改进模式推断。 #44546 (Kruglov Pavel)。
  • 新增一个用户级别的设置项 database_replicated_allow_replicated_engine_arguments,用于禁止在 DatabaseReplicated 中创建带参数的 ReplicatedMergeTree 表。#44566 (alesapin)。
  • 防止用户误将 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 格式会将布尔类型解析为 ClickHouse 的布尔类型。#44684 (Kruglov Pavel)。
  • 在 Arrow/Parquet/ORC 中支持 Bool 类型。修复 #43970#44698Kruglov Pavel)。
  • 在读取 UUID 时不要贪婪地解析超出引号的部分——这可能会导致错误数据被误判为解析成功。 #44686 (Raúl Marín).
  • 在 Int64 溢出的情况下推断为 UInt64,并修复模式推断中的部分转换。#44696 (Kruglov Pavel).
  • 之前在 Replicated 数据库中的依赖关系解析是通过一种比较 “hacky” 的方式完成的,现在改为使用显式图进行规范实现。#44697Nikita Mikhaylov)。
  • 修复 output_format_pretty_row_numbers 在块之间无法保持行号连续的问题。关闭 #44815#44832flynn)。
  • 不再将由于分区片段与后台清理进程并发合并导致的错误报告到 system.errors 中。 #44874 (Raúl Marín).
  • 优化并修复与 Distributed 异步 INSERT 相关的指标。 #44922 (Azat Khuzhin).
  • 新增用于禁止并发备份和恢复的设置,修复了 #43891。实现方式:* 新增服务器级设置,用于禁止并发备份和恢复,在 Context 中创建 BackupWorker 时读取并设置。* 这些设置默认值为 true。* 在开始备份或恢复之前,增加了检查步骤,用于判断是否有其他备份/恢复正在运行。对于内部请求,会通过 backup&#95;uuid 检查该请求是否来自本节点。#45072 (SmitaRKulkarni)。
  • 为系统日志新增 <storage_policy> 配置参数。#45320 (Stig Bakken)。

构建/测试/打包改进

  • 将用于 ClickHouse 客户端/本地历史记录模糊搜索的 skim 库(使用 Rust 编写)改为静态链接。#44239 (Azat Khuzhin)。
  • 由于 Rust,我们移除了对共享链接(动态链接)的支持。实际上,Rust 只是移除的借口,我们无论如何都打算移除它。#44828 (Alexey Milovidov)。
  • 从软件包中移除对 adduser 工具的依赖,因为我们并没有使用它。这修复了 #44934#45011 (Alexey Milovidov)。
  • SQLite 库更新到最新版本。它用于 SQLite 数据库和表集成引擎。同时修复了一个 TSan 误报。这关闭了 #45027#45031 (Alexey Milovidov)。
  • 修改 CRC-32 以解决 PowerPC 中的 WeakHash 冲突问题。#45144 (MeenaRenganathan22)。
  • 更新 aws-c* 子模块。#43020 (Vitaly Baranov)。
  • 自动合并 CI 通过的回溯 PR 和 CI 通过且已批准的 PR。#41110 (Mikhail f. Shiryaev)。
  • 提供一个用于查看 ClickHouse CI 状态的网站源码

错误修复

  • 将域名 IP 类型(IPv4、IPv6)替换为内建类型。#43221Yakov Olkhovskiy)。从而自动修复代码中缺失的一些实现。
  • 修复在备份过程中变更被终止时的备份流程。#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 中对查询设置的约束问题。 #43993 (Nikolay Degterinsky).
  • 修复了表元数据中 EPHEMERAL 列默认值无法解析的问题。 #44026 (Yakov Olkhovskiy)。
  • 修复了从兼容性设置中解析无效版本的问题。 #44224 (Kruglov Pavel).
  • 使在 datetime 上进行 interval 相减的行为与相加保持一致。#44241 (ltrk2).
  • 移除 VIEW 结果的最大大小限制。 #44261 (lizhuoyu5).
  • 修复在 do_not_evict_index_and_mrk_files=1 时缓存中可能出现的逻辑错误。解决 #42142 中的问题。#44268Kseniia Sumarokova)。
  • 修复直写缓存中可能过早中断缓存写入的问题(由于错误假设导致缓存在不该停止时被停止)。#44289 (Kseniia Sumarokova).
  • 修复了在将带有常量参数的 IN 函数与 LowCardinality 一起作为常量参数使用时可能导致的崩溃。修复了 #44221#44346Nikolai Kochetov)。
  • 修复了对参数化聚合函数中复杂参数(如数组)的支持,关闭了 #30975。在此更改之前,聚合函数 sumMapFiltered 在分布式查询中无法使用。#44358 (Alexey Milovidov)。
  • 修复在 BSON 模式推断中读取 ObjectId 的问题。 #44382 (Kruglov Pavel).
  • 修复了 ReplicatedMergeTree 中可能导致在合并完成前提前删除临时分区片段的竞争条件。该问题可能会导致类似 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 设置的约束之后会使这些约束失效。#44411 (Konstantin Bogdanov)。
  • 修复在执行包含数据的 EXPLAIN AST INSERT 查询时出现的 SYNTAX_ERROR。关闭 #44207#44413save-my-heart)。
  • 修复了在 CSV 格式中读取包含 CRLF 的布尔值时的问题。关闭 #44401#44442Kruglov Pavel)。
  • 不要在 LowCardinality 字典上执行 and/or/if/multiIf 函数,因此结果类型不能为 LowCardinality。否则在某些情况下可能会导致错误 Illegal column ColumnLowCardinality。修复了 #43603#44469Kruglov Pavel)。
  • 修复在使用 max_streams_for_merge_tree_reading SETTING 时出现的 mutation 问题。#44472Anton Popov)。
  • 修复在 ASTSelectQuery::formatImpl 中使用 GROUPING SETS 时可能出现的空指针解引用问题(#43049)。#44479Robert Schulze)。
  • 按照 settings 对表函数参数、CAST 函数参数以及 JSONAsObject 的 schema 推断中的类型进行校验。 #44501 (Kruglov Pavel).
  • 修复 IN 函数在与 LowCardinality 和常量列一起使用时的问题,关闭 #44503#44506Duc Canh Le)。
  • 修复了在 CREATE TABLE 语句中规范化 DEFAULT 表达式时的一个 bug。函数 in 的第二个参数(或运算符 IN 的右侧参数)在执行 CREATE 查询时,可能会被替换为其求值结果。修复了 #44496#44547Alexander Tokmakov)。
  • 在包含 WITH ROLLUP、WITH CUBE 和 WITH TOTALS 的情况下,PROJECTION 无法生效。在之前的版本中,查询会抛出异常,而不是跳过对 PROJECTION 的使用。修复了 #44614。修复了 #42772#44615Alexey Milovidov)。
  • 由于函数 get all blocks sorted by time 未获取到异步块,异步块因此没有被清理。#44651Han Fei)。
  • 修复在包含子查询的 JOIN、UNION 和 TOTALS 查询中出现的 LOGICAL_ERROR 错误:The top step of the right pipeline should be ExpressionStep。解决了 #43687#44673Nikolai Kochetov)。
  • 避免 Executable 表引擎抛出 std::out_of_range 异常。#44681Kruglov Pavel)。
  • 不要在 AST 上对分位数应用 optimize_syntax_fuse_functions,关闭 #44712#44713Vladimir C)。
  • 修复 Merge 表和 PREWHERE 中错误类型的问题,关闭 #43324#44716Vladimir C)。
  • 修复关闭期间(销毁 TraceCollector 时)可能发生的崩溃问题。修复 #44757#44758Nikolai Kochetov)。
  • 修复了分布式查询处理中的潜在崩溃问题。当带有 totals 或 extremes 的查询返回空结果且 Distributed 表与本地表之间存在类型不匹配时,可能会发生该崩溃。修复了 #44738#44760Nikolai Kochetov)。
  • 修复在拉取操作中(min_compressed_bytes_to_fsync_after_fetch)以及在变更操作中针对小文件(ttl.txt、columns.txt)的 fsync 处理(min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge)。#44781 (Azat Khuzhin)。
  • 当在分区片段在磁盘之间移动时查询 system.partssystem.parts_columns 表,可能会触发罕见的竞态条件。该问题最初在 #41145 中引入。#44809Alexey Milovidov)。
  • 修复在启用 PROJECTION 优化后可能出现的 Context has expired 错误。该问题可以在包含某些函数的查询中复现,例如在运行时使用上下文的 dictHas/dictGet。修复 #44844#44850Nikolai Kochetov)。
  • 修复了在从远程文件系统读取 LowCardinality 字典时可能出现的 Cannot read all data 错误,对应修复了 #44709#44875Nikolai Kochetov)。
  • 在无法读取硬件监控传感器数据时忽略这些情况,而不是在日志中输出完整的异常消息。#44895Raú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),即延迟随超过阈值的分区片段数量成比例增长。修复了 #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)。 #45058 (Nikita Taranov)。
  • 修复 RANGE_HASHED 字典,在指定 update_field 时,在更新过程中将范围列计入主键的一部分。修复了 #44588 中的问题。#45061Maksim Kita)。
  • 修复在嵌套 lambda 中对 LowCardinality 捕获参数进行捕获时出现的 Cannot capture column 错误。修复 #45028#45065Nikolai Kochetov)。
  • 修复在使用 minmax/count PROJECTION 时,由于未应用 additional_table_filters 中的附加过滤条件而导致查询结果错误的问题。 #45133 (Nikolai Kochetov).
  • 修复了 histogram 函数会接受负值的错误。 #45147 (simpleton)。
  • 修复 StorageJoin 中错误的列可空性设置,关闭 #44940#45184 (Vladimir C).
  • 修复在运行时增大 background_fetches_pool_size 设置时的重新加载问题。 #45189 (Raúl Marín).
  • 正确处理在 KV 引擎(例如 KeeperMap、EmbeddedRocksDB)上,当键列使用返回不同类型结果的子查询与 IN 搭配时的 SELECT 查询。#45215 (Antonio Andelic).
  • 在某些情况下修复了 SEMI JOINjoin_use_nulls 的逻辑错误,关闭 #45163,关闭 #45209#45230Vladimir C)。
  • 修复从 S3 读取数据时的 heap-use-after-free 问题。#45253 (Kruglov Pavel)。
  • 修复 Avro Union 类型为 ['null', Nested 类型] 时的 bug,#45275。修复将 bytes 类型错误推断为 Float 的 bug。#45276 (flynn)。
  • 当显式 PREWHERE 不能用于使用 Merge 存储引擎的表时,抛出正确的异常。 #45319 (Antonio Andelic).
  • 在 WSL1 Ubuntu 下,自解压版 ClickHouse 因不一致问题导致解压失败——/proc/self/maps 报告的是 32 位文件的 inode,而 stat 报告的是 64 位文件的 inode。 #45339 (Yakov Olkhovskiy)。
  • 修复分布式表启动时的竞态条件(可能导致异步 INSERT 的文件被重复处理)。 #45360 (Azat Khuzhin).
  • 修复了在从 S3 存储和表函数 s3 读取数据时,当 ListObject 请求失败时可能发生的崩溃问题。#45371 (Anton Popov)。
  • 修复在存在结构错误的字典(例如 XML 配置中类型不正确)时执行 SELECT ... FROM system.dictionaries 会抛出异常的问题。 #45399 (Aleksei Filatov)。
  • 修复在 INSERT INTO ... SELECT * FROM s3Cluster 查询中,当基于插入表的表结构进行 schema 推断时出现的问题。 #45422 (Kruglov Pavel).
  • 修复了通过 HTTP 解析 JSON/BSONEachRow 时的一个问题,该问题可能会导致某些列使用默认值而不是数据中的值。 #45424 (Kruglov Pavel).
  • 修复了在从文本源按类型解析 IP 类型时出现的错误(代码 632:DB::Exception: Unexpected data ... after parsed IPv6 value ...)。#45425Yakov Olkhovskiy)。
  • 关闭 #45297,添加对空正则表达式的检查。#45428 (Han Fei)。
  • 修复可能出现的(很可能是分布式)查询挂起问题。 #45448 (Azat Khuzhin).
  • 修复在启用 allow_asynchronous_read_from_io_pool_for_merge_tree 时,当 ThreadPool::schedule 抛出异常时可能导致的死锁问题。 #45481 (Nikolai Kochetov).
  • 修复在执行 DETACH 后表仍可能被使用的问题。#45493 (Azat Khuzhin)。
  • 修复在查询执行过程中使用并行解析时,查询被取消可能导致的罕见中止问题。#45498Anton Popov)。
  • 修复了在创建分布式表与向其中执行 INSERT 之间存在的竞争条件(可能会在向该表执行 INSERT 时导致 CANNOT_LINK)。 #45502 (Azat Khuzhin).
  • 为缓存策略 getter 添加合适的默认值(SLRU),修复了 #45514#45524Kseniia Sumarokova)。
  • 在变更(mutation)中禁止使用 ARRAY JOIN,关闭了 #42637 #44447SmitaRKulkarni)。
  • 修复了在使用表别名和列转换器时的限定星号问题。解决了 #44736#44755SmitaRKulkarni)。

2022 年更新日志

  • 目录
  • ClickHouse 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 年更新日志