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

V24.6 版 Cloud 更新日志

v24.6 版本中与 ClickHouse Cloud 服务相关的更改。

向后不兼容的变更

  • 重新设计了存储引擎 S3QueueOrdered 模式下的并行处理。如果在 Ordered 模式下使用了 s3queue_processing_threads_nums3queue_total_shards_num 设置,则此 PR 是向后不兼容的。设置 s3queue_total_shards_num 已被删除,此前它只能在启用 s3queue_allow_experimental_sharded_mode 时使用,而该设置现已弃用。新增了一个设置 s3queue_buckets#64349Kseniia Sumarokova)。
  • 新增了函数 snowflakeIDToDateTimesnowflakeIDToDateTime64dateTimeToSnowflakeIDdateTime64ToSnowflakeID。与现有的 snowflakeToDateTimesnowflakeToDateTime64dateTimeToSnowflakedateTime64ToSnowflake 函数不同,这些新函数与 generateSnowflakeID 函数兼容,即它们接受由 generateSnowflakeID 生成的 snowflake ID,并生成与 generateSnowflakeID 相同类型的 snowflake ID(即 UInt64)。此外,这些新函数默认使用 UNIX 纪元(即 1970-01-01),与 generateSnowflakeID 保持一致。如有需要,可以传入不同的 epoch,例如 Twitter/X 的 epoch(2010-11-04,即自 UNIX 纪元起的 1288834974657 毫秒)。旧的转换函数已被弃用,并将在过渡期结束后移除;如仍需使用它们,请启用设置 allow_deprecated_snowflake_conversion_functions#64948Robert Schulze)。

新特性

  • 支持空元组。#55061 (Amos Bird).
  • 新增 Hilbert 曲线编码和解码函数。#60156 (Artem Mustafin).
  • hilbertEncode 新增索引分析支持。#64662 (Artem Mustafin).
  • 新增对使用函数 readWKTLineString 读取 WKT 格式 LINESTRING 几何类型的支持。#62519 (Nikita Mikhaylov).
  • 新增 SQL 函数 generateSnowflakeID,用于生成 Twitter 风格的 Snowflake ID。#63577 (Danila Puzov).
  • 新增使用 = 运算符比较 IPv4IPv6 类型的支持。#64292 (Francisco J. Jurado Moreno).
  • 在二元数学函数(pow、atan2、max2、min2、hypot)中支持 decimal 参数。#64582 (Mikhail Gorshkov).
  • 新增 SQL 函数 parseReadableSize(以及 OrNullOrZero 变体)。#64742 (Francisco J. Jurado Moreno).
  • 为类文件存储(s3/file/hdfs/url/azureBlobStorage)新增 _time 虚拟列。#64947 (Ilya Golshtein).
  • 新增函数 base64URLEncodebase64URLDecodetryBase64URLDecode#64991 (Mikhail Gorshkov).
  • 新增函数 editDistanceUTF8,用于计算两个 UTF-8 字符串之间的编辑距离#65269 (LiuNeng).
  • 新增 http_response_headers 配置,用于在自定义 HTTP 处理器中支持自定义响应头。#63562 (Grigorii).
  • 新增表函数 loop,用于以无限循环的方式返回查询结果。#63452 (Sariel). 这对于测试非常有用。
  • system.query_log 中新增两列:used_privilegesmissing_privilegesused_privileges 记录在查询执行期间被检查的权限,missing_privileges 包含缺失的必需权限。#64597 (Alexey Katsman).
  • 新增设置 output_format_pretty_display_footer_column_names,启用时会在长表(默认 50 行)末尾显示列名,最小行数阈值由 output_format_pretty_display_footer_column_names_min_rows 控制。#65144 (Shaun Struwig).

性能优化

  • 修复在 #60459(24.5)中引入的 CROSS JOIN 性能回退问题。#65243(Nikita Taranov)。
  • 改进 io_uring 重新提交操作的可见性。将 profile 事件 IOUringSQEsResubmits 重命名为 IOUringSQEsResubmitsAsync,并新增事件 IOUringSQEsResubmitsSync。#63699(Tomer Shafir)。
  • 为所有函数调用添加断言,以验证其使用的列大小是否正确。#63723(Raúl Marín)。
  • 在插入时增加重新调整行顺序的能力,以在不违反由 PRIMARY KEY 设定的顺序前提下优化数据大小。该功能由设置 optimize_row_order 控制(默认关闭)。#63578Igor Markelov)。
  • 添加原生 Parquet 读取器,可将 Parquet 二进制数据直接读取为 ClickHouse 列。受设置 input_format_parquet_use_native_reader 控制(默认关闭)。 #60361 (ZhiHong Zhang).
  • 当查询过滤条件能够从 MergeTree 表中精确选出范围时,支持部分 trivial count 优化。 #60463 (Amos Bird).
  • 通过在单个 transform 中汇聚多个线程的 chunk,降低多线程 INSERT 的最大内存占用。#61047 (Yarik Briukhovetskyi).
  • 在使用 Azure 对象存储时,通过采用固定内存分配来减少内存占用,避免分配额外的缓冲区。#63160SmitaRKulkarni)。
  • 减少 ColumnNullable::size 中的虚函数调用次数。 #60556 (HappenLee).
  • 当正则表达式参数为单个字符时,优化 splitByRegexp 的性能。 #62696 (Robert Schulze).
  • 通过跟踪使用过的最小和最大键,加速基于 8 位和 16 位键的聚合。这可以减少需要验证的单元数量。#62746Jiebin Sun)。
  • 当左侧为 LowCardinality 且右侧为常量集合时,对 IN 运算符进行优化。 #64060 (Zhiguo Zhou).
  • 使用线程池在 ConcurrentHashJoin 中对哈希表进行初始化和销毁。 #64241 (Nikita Taranov).
  • 针对包含稀疏列的表优化了纵向合并。#64311 (Anton Popov)。
  • 在执行纵向合并时启用了从远程文件系统预取数据的功能,从而降低了数据存储在远程文件系统上的表在进行纵向合并时的延迟。 #64314 (Anton Popov).
  • 减少对 ColumnSparse::filterisDefault 的冗余调用,从而提升性能。 #64426 (Jiebin Sun)。
  • 通过对 getChildren 发起多个异步请求,加速 find_super_nodesfind_big_family keeper-client 命令的执行。 #64628 (Alexander Gololobov).
  • 改进函数 least/greatest 对可为 NULL 的数值类型参数的支持。#64668 (KevinyhZou)。
  • 允许合并查询计划中两个连续的过滤步骤。如果过滤条件可以从父步骤下推,则可以改进过滤下推优化。#64760 (Nikolai Kochetov)。
  • 在 vertical final 算法的实现中移除不良优化,并重新将 vertical final 算法设为默认启用。#64783 (Duc Canh Le).
  • 从过滤表达式中移除 ALIAS 节点。对于使用 PREWHERE 的查询(在新分析器中),这会略微提升性能。#64793 (Nikolai Kochetov)。
  • 重新启用 OpenSSL 会话缓存功能。#65111Robert Schulze)。
  • 添加了用于在插入时禁用跳过索引和统计信息物化的设置(materialize_skip_indexes_on_insertmaterialize_statistics_on_insert)。#64391 (Anton Popov).
  • 根据已分配的内存大小计算行组大小,从而在单线程模式下降低 Parquet 写入器的峰值内存占用。#64424 (LiuNeng)。
  • 改进稀疏列的迭代器,减少对 size 的调用。 #64497 (Jiebin Sun).
  • 更新条件,以在备份到 Azure Blob 存储时使用服务器端复制。#64518 (SmitaRKulkarni)。
  • 针对具有大量 skip 索引的表,优化了垂直合并的内存使用。#64580 (Anton Popov)。

改进

  • 恢复了 ClickHouse 在 CSV 格式中处理和解释 Tuple 的原有行为。此更改实质上回退了 ClickHouse/ClickHouse#60994,并将其限制为仅在以下少数设置下可用:output_format_csv_serialize_tuple_into_separate_columns、input_format_csv_deserialize_separate_columns_into_tuple 和 input_format_csv_try_infer_strings_from_quoted_tuples。#65170(Nikita Mikhaylov)。
  • 现在在系统表上执行 SHOW CREATE TABLE 时,会显示每个表特有的、非常实用的注释,用于说明该表的用途。 #63788 (Nikita Mikhaylov)。
  • 函数 round(), roundBankers(), floor(), ceil()trunc() 的第二个参数(scale)现在可以不是常量(non-const)。#64798 (Mikhail Gorshkov)。
  • 在高负载服务中进行线程调度时,避免在 MergeTree 索引分析期间可能出现的死锁。#59427 (Sean Haynes)。
  • 对 S3 代理支持和隧道机制的一些边界情况进行了小幅修复。#63427Arthur Passos)。
  • 添加监控指标,用于跟踪 plain_rewritable 元数据存储创建和删除的目录数量,以及本地到远程内存映射表中的条目数量。#64175 (Julia Kartseva)。
  • 查询缓存现在会将文本相同但设置不同的查询视为不同的查询。这样在不同设置(例如 limitadditional_table_filters)会影响查询结果的情况下,可以提高健壮性。 #64205 (Robert Schulze).
  • 在对象存储中将非标准错误码 QpsLimitExceeded 视为可重试错误并予以支持。 #64225 (Sema Checherinda).
  • 新增了一个设置项 input_format_parquet_prefer_block_bytes,用于控制平均输出数据块的字节数,并将 input_format_parquet_max_block_size 的默认值修改为 65409。#64427 (LiuNeng)。
  • 用户配置中的设置不会影响基于对象存储的 MergeTree 表的合并和变更操作。#64456 (alesapin)。
  • 在对象存储中支持将非标准错误码 TotalQpsLimitExceeded 视为可重试错误。#64520Sema Checherinda)。
  • 为开源版和 ClickHouse Cloud 版本更新了 Advanced Dashboard,加入了“最大并发网络连接数”图表。#64610Thom O'Connor)。
  • 改进 zeros_mtgenerateRandom 的进度报告。#64804Raúl Marín)。
  • 添加一个异步指标 jemalloc.profile.active,用于显示当前是否启用了采样。这是除了 prof.active 之外的额外激活机制;调用线程要进行采样,二者都必须处于激活状态。#64842 (Unalian)。
  • 移除了 allow_experimental_join_condition 的重要标记。该标记可能会导致在混合版本集群中无法成功执行分布式查询。#65008Nikita Mikhaylov)。
  • 新增服务器异步指标 DiskGetObjectThrottler*DiskGetObjectThrottler*,用于表示通过磁盘设置 s3_max_get_rpss3_max_put_rps 定义的每秒请求速率限制,以及在不触发该磁盘限流阈值的前提下当前仍可发送的请求数量。对于每个配置了限流的磁盘,都会定义这些指标。 #65050 (Sergei Trifonov)。
  • 在使用 bcrypt_hash 创建用户时添加验证。#65242Raúl Marín)。
  • 新增用于统计在 PREWHERE 执行期间及之后读取行数的 profile 事件。 #64198 (Nikita Taranov).
  • 在并行副本模式下在 EXPLAIN PLAN 中输出查询。 #64298 (vdimir).
  • allow_deprecated_functions 重命名为 allow_deprecated_error_prone_window_functions#64358 (Raúl Marín)。
  • file 表函数中,文件描述符同样会受 max_read_buffer_size 设置的约束。#64532 (Azat Khuzhin).
  • 在不支持的存储上禁用事务,即使用于物化视图时也是如此。#64918 (alesapin)。
  • 在旧版分析器中禁止使用 QUALIFY 子句。旧版分析器会忽略 QUALIFY,因此在执行 mutation 操作时可能导致数据被意外删除。#65356Dmitry Novik)。

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

  • 修复了在与 IN 和 indexHint() 一起使用时 'set' 跳过索引不起作用的问题。#62083 (Michael Kolupaev)。
  • 修复在表未使用自适应粒度时,带有 FINAL 关键字的查询返回错误结果的问题。#62432(Duc Canh Le)。
  • 在为参数化视图的参数赋值时支持执行函数。#63502(SmitaRKulkarni)。
  • 修复了 Parquet 内存跟踪问题。#63584(Michael Kolupaev)。
  • 修复分布式查询结果中偶发的数据缺失问题。#63691(vdimir)。
  • 修复了对类型为 Tuple(Map(LowCardinality(String), String), ...) 的列的读取。#63956(Anton Popov)。
  • 修复未限定 COLUMNS 匹配器的解析逻辑。保留输入列的顺序,并禁止使用未知标识符。#63962(Dmitry Novik)。
  • 修复由不同类型(表达式和函数)之间的循环别名导致的错误。#63993 (Nikolai Kochetov).
  • 此修复将使用正确的定义者,为查询管道中的每个视图重新建立合适的上下文。#64079(pufit)。
  • 修复分析器:修正了在使用 INTERPOLATE 时出现的 Not found column 错误。#64096(Yakov Olkhovskiy)。
  • 防止在使用 CREATE TABLE 创建 MaterializedView 时出现 LOGICAL_ERROR。#64174(Raúl Marín)。
  • 查询缓存现在会将针对不同数据库的两个相同查询视为不同查询。先前的行为可能被用来绕过读取某个表所需但缺少的权限。#64199(Robert Schulze)。
  • 修复 StatusFile 中的 ~WriteBufferFromFileDescriptor 在出现未捕获异常时可能导致进程中止的问题。#64206(Kruglov Pavel)。
  • 修复使用 ARRAY JOIN 的分布式查询中出现的重复别名错误。#64226(Nikolai Kochetov)。
  • 修复 accurateCast 在从 string 转换为 integer 时的意外行为。#64255 (wudidapaopao)。
  • 修复了 CNF 简化逻辑,以正确处理 OR 组中包含互斥原子的情况。#64256(Eduard Karacharov)。
  • 修复 Query Tree 大小校验。#64377(Dmitry Novik)。
  • 修复逻辑错误:修正对带有 PREWHERE 的 Buffer 表进行的错误类型转换。#64388 (Nikolai Kochetov)。
  • 修复了在包含默认表达式的表上执行的 CREATE TABLE AS 查询。#64455(Anton Popov)。
  • 修复在具有可空键的表上使用 ORDER BY ... NULLS FIRST / LAST 时的 optimize_read_in_order 行为。#64483 (Eduard Karacharov)。
  • 修复在对 GLOBAL IN 使用别名的查询中出现的 “Expression nodes list expected 1 projection names” 和 “Unknown expression or identifier” 错误。#64517(Nikolai Kochetov)。
  • 修复在分布式查询中,当 GROUP BY 键中包含常量 CTE 时出现的 “Cannot find column” 错误。#64519(Nikolai Kochetov)。
  • 修复了函数 formatDateTimeInJodaSyntax 的输出问题:当格式化器生成的字符数为奇数且最后一个字符为 0 时会产生错误结果。例如,SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D') 现在会正确返回 150,而不是此前的 15。#64614 (LiuNeng)。
  • 如果已经使用 -If 组合器,则不要重写聚合。#64638(Dmitry Novik)。
  • 修复对 float 类型的类型推断(在缓冲区较小时,例如 --max_read_buffer_size 1 的情况下)。#64641 (Azat Khuzhin)。
  • 修复了可能导致带表达式的 TTL 失效的问题。#64694(alesapin)。
  • 修复新分析器中删除恒为 true 的 WHERE 和 PREWHERE 表达式的行为。#64695(Nikolai Kochetov)。
  • 修复了在按 startsWith、endsWith、match、multiSearchAny 的结果进行过滤时,基于 token 的文本索引(ngrambf、full_text)导致数据被过度删减的问题。#64720(Eduard Karacharov)。
  • 修复了 UTF8::computeWidth 函数中 ANSI CSI 转义序列处理不正确的问题。#64756(Shaun Struwig)。
  • 修复一个在多个子查询之间错误移除 ORDER BY / LIMIT BY 的问题。#64766(Raúl Marín)。
  • 修复在混合 JOIN 条件中,对集合使用子查询时的(实验性)非等值 JOIN 实现。#64775 (lgbo)。
  • 修复在 plain_rewritable 磁盘上的本地缓存中出现的崩溃。#64778 (Julia Kartseva)。
  • 修复在包含对 Nested 列进行 ARRAY JOIN 的分布式查询中出现的“找不到列”错误。修复 #64755。#64801 (Nikolai Kochetov)。
  • 修复 slru 缓存策略中的内存泄漏。#64803(Kseniia Sumarokova)。
  • 修复了多种查询中可能存在的内存跟踪不正确问题:从 S3 读取任意数据的查询、通过 HTTP 协议执行的查询,以及异步插入。#64844(Anton Popov)。
  • 修复在从物化视图中读取带有 PREWHERE 的查询时,当物化视图中存在与源表数据类型不同的列时出现的 Block 结构不匹配错误。修复 #64611。#64855(Nikolai Kochetov)。
  • 修复在表包含带子查询的 TTL,且数据库为 replicated、启用了并行副本并使用 analyzer 时出现的罕见崩溃问题。虽然这种情况极其罕见,但请不要在 TTL 中使用子查询。#64858 (alesapin)。
  • 修复了在 ClickHouse/ClickHouse#54211 中引入的、针对参数化 VIEW 的 ALTER MODIFY COMMENT 查询失效的问题。#65031 (Nikolay Degterinsky)。
  • 修复在启用 cluster_secure_connection 参数时 DatabaseReplicated 中的 host_id。此前,即使启用了该参数,由 DatabaseReplicated 在集群内创建的所有连接仍未使用安全连接。#65054 (Nikolay Degterinsky)。
  • 修复在对 StorageMerge 进行 PREWHERE 优化后出现的 Not-ready Set 错误。#65057(Nikolai Kochetov)。
  • 避免在类文件式存储中向已最终确定的缓冲区写入数据。#65063(Kruglov Pavel)。
  • 修复在存在循环别名时查询可能无限执行的问题。修复 #64849。#65081(Nikolai Kochetov)。
  • 修复在使用 INTERPOLATE(别名)(新分析器)进行远程查询时出现的“Unknown expression identifier”错误。修复了 #64636 问题。#65090(Nikolai Kochetov)。
  • 修复将算术运算从聚合中外推的问题。在新的分析器中,此优化此前只会应用一次。#65104 (Dmitry Novik)。
  • 修复新分析器中聚合函数名称重写的问题。#65110(Dmitry Novik)。
  • 如果在从客户端套接字读取(部分)请求体时发生接收超时,则返回 5xx 状态码而不是 200 OK。#65118 (Julian Maicher)。
  • 修复在 hedged 请求中可能发生的崩溃。#65206(Azat Khuzhin)。
  • 修复 Hashed 和 Hashed_Array 字典在短路求值时的 bug,该问题可能会读取未初始化的数值,从而导致各种异常。#65256(jsc0218)。
  • 此 PR 确保在执行 IN 运算符类型转换时,常量(IN 运算符的第二个参数)的类型信息始终可见。否则,类型信息的丢失可能会导致某些转换失败,例如从 DateTime 到 Date 的转换。修复 (#64487)。#65315 (pn)。