Cloud V24.5 变更日志
基于 v24.5 版本的 ClickHouse Cloud 服务相关变更。
重大变更
-
将
system.zookeeper表中的列名从duration_ms更改为duration_microseconds,以反映该持续时间实际上是以微秒级分辨率表示。#60774 (Duc Canh Le)。 -
不再允许将
max_parallel_replicas设置为 0,因为这在语义上没有意义。将其设置为 0 可能会导致意外的逻辑错误。关闭了 #60140。#61201 (Kruglov Pavel)。 -
移除对
INSERT WATCH查询的支持(这是实验性LIVE VIEW特性的一部分)。#62382 (Alexey Milovidov)。 -
neighbor、runningAccumulate、runningDifferenceStartingWithFirstValue、runningDifference等函数的使用已被弃用(因为它们容易出错)。应改用标准窗口函数。若要重新启用这些函数,请设置allow_deprecated_error_prone_window_functions=1。#63132 (Nikita Taranov)。
向后不兼容的变更
-
在新的 ClickHouse 版本中,如果所有参数都是 Float64,函数 geoDistance、greatCircleDistance 和 greatCircleAngle 在内部计算以及返回类型上将使用 64 位双精度浮点数据类型。这解决了 #58476。在之前的版本中,这些函数始终使用 Float32。你可以通过将 geo_distance_returns_float64_on_float64_arguments 设置为 false,或者将 compatibility 设置为 24.2 或更早版本来切换回旧行为。#61848 (Alexey Milovidov)。
-
当存在大量列但许多数据库或表未被授予 SHOW TABLES 权限时,来自 system.columns 的查询将运行得更快。请注意,在之前的版本中,如果你仅对单个列授予 SHOW COLUMNS 权限,而没有对相应的表授予 SHOW TABLES 权限,则 system.columns 表会显示这些列,但在新版本中,它将完全跳过这些表。移除了会减慢查询的 trace 日志消息 "Access granted" 和 "Access denied"。#63439 (Alexey Milovidov)。
-
修复了 largestTriangleThreeBuckets 中的崩溃。这改变了该函数的行为,使其忽略所提供序列中的 NaN 值。因此,结果集可能与之前版本不同。#62646 (Raúl Marín)。
新特性
-
新的分析器在新建的服务上默认启用。
-
支持通过类似 DROP TABLE a,b,c; 的语句一次性删除多个表。#58705 (zhongyuankai)。
-
用户现在可以通过设置 input_format_tsv_crlf_end_of_line,在 TSV 格式中解析 CRLF。修复 #56257。#59747(Shaun Struwig)。
-
现在可以为 Table 引擎授予权限了,并且这不会影响现有用户的行为。#60117 (jsc0218)。
-
新增 Form 格式,用于以 application/x-www-form-urlencoded 格式读取/写入单条记录。#60199 (Shaun Struwig)。
-
新增了在 CROSS JOIN 中进行压缩的功能。#60459 (p1rattttt)。
-
新增设置 input_format_force_null_for_omitted_fields,用于将被省略的字段强制设置为 NULL 值。#60887 (Constantine Peresypkin)。
-
支持在 join 中使用带有不等条件、且同时引用左右两张表列的表达式,例如
t1.y < t2.y。若要启用,执行SET allow_experimental_join_condition = 1。#60920 (lgbo)。 -
新增函数 getClientHTTPHeader。该更改关闭了 issue #54665。与 @lingtaolf 共同完成。#61820(Alexey Milovidov)。
-
为方便起见,SELECT * FROM numbers() 将与 SELECT * FROM system.numbers 以相同方式工作——没有任何限制。#61969 (YenchangChan)。
-
现在支持通过 ALTER MODIFY SETTING 修改 memory 表的设置。ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;。#62039 (zhongyuankai)。
-
Analyzer 现已支持递归 CTE。#62074 (Maksim Kita)。
-
此前我们的 S3 存储和 S3 表函数不支持从归档文件中进行查询。我实现了一个方案,可以遍历 S3 中归档文件内的文件。#62259(Daniil Ivanik)。
-
新增对条件函数 clamp 的支持。 #62377 (skyoct).
-
添加 npy 输出格式。#62430 (豪肥肥)。
-
Analyzer 现已支持 QUALIFY 子句。修复 #47819。 #62619 (Maksim Kita).
-
已向 HTTP 接口添加
role查询参数。其工作方式类似于SET ROLE x,会在执行语句之前先应用角色。这样就可以克服 HTTP 接口的限制,因为它不允许多条语句,也就无法在同一请求中同时发送SET ROLE x和目标语句。本方式也支持设置多个角色,例如?role=x&role=y,其效果等同于SET ROLE x, y。#62669(Serge Klochkov)。 -
添加 SYSTEM UNLOAD PRIMARY KEY。#62738 (Pablo Marcos)。
-
新增 SQL 函数 generateUUIDv7、generateUUIDv7ThreadMonotonic、generateUUIDv7NonMonotonic(具有不同的单调性/性能权衡),用于生成版本 7 的 UUID,即带随机成分的时间戳型 UUID。同时新增函数 UUIDToNum 用于从 UUID 中提取字节,以及函数 UUIDv7ToDateTime 用于从版本 7 的 UUID 中提取时间戳部分。#62852(Alexey Petrunyaka)。
-
添加 Raw 作为 TSVRaw 的同义名。#63394 (Unalian)。
-
在数据大小超出限制时,新增支持在临时文件中执行 cross join。 #63432 (p1rattttt)。
性能改进
-
在执行 INSERT 时跳过对新创建的 projection 块的合并操作。#59405 (Nikita Taranov)。
-
降低针对 SELECT 的 mutation 开销(v2)。#60856 (Azat Khuzhin)。
-
使用等价集改进 JOIN 过滤下推。#61216 (Maksim Kita)。
-
增加一个新的 analyzer pass 来优化单值场景。#61564 (LiuNeng)。
-
当输入字符串全部为 ASCII 字符时,以“ASCII 方式”处理 XXXUTF8 字符串函数。受 apache/doris#29799 启发。整体提速约 1.07x~1.62x。注意在某些情况下峰值内存使用也有所下降。#61632 (李扬)。
-
默认启用快速 Parquet 编码器(output_format_parquet_use_custom_encoder)。#62088 (Michael Kolupaev)。
-
改进 JSONEachRowRowInputFormat,在读取完所有必需字段后跳过剩余所有字段。#62210 (lgbo)。
-
函数 splitByChar 和 splitByRegexp 获得了显著加速。#62392 (李扬)。
-
改进在 file/s3/hdfs/url/... 表函数中的简单 INSERT SELECT。新增独立的 max_parsing_threads 设置,用于控制并行解析时使用的线程数。#62404 (Kruglov Pavel)。
-
通过设置 azure_allow_parallel_part_upload,支持 AzureBlobStorage 的并行写入缓冲区。#62534 (SmitaRKulkarni)。
-
函数 to_utc_timestamp 和 from_utc_timestamp 现在大约快 2 倍。#62583 (KevinyhZou)。
-
当输入中主要包含无法解析的值时,函数 parseDateTimeOrNull、parseDateTimeOrZero、parseDateTimeInJodaSyntaxOrNull 和 parseDateTimeInJodaSyntaxOrZero 现在快了很多(10x - 1000x)。#62634 (LiuNeng)。
-
修改 HostResolver 在解析失败时的行为,使每个 IP 只保留一条记录。#62652 (Anton Ivashkin)。
-
新增配置 prefer_merge_sort_block_bytes,用于控制内存使用,并在列很多时合并排序提速约 2 倍。#62904 (LiuNeng)。
-
当 JOIN 之后的过滤总是过滤掉默认值时,QueryPlan 会将 OUTER JOIN 优化为 INNER JOIN。该优化可通过设置 query_plan_convert_outer_join_to_inner_join 控制,默认启用。#62907 (Maksim Kita)。
-
默认启用 optimize_rewrite_sum_if_to_count_if。#62929 (Raúl Marín)。
-
针对新的 analyzer 进行了一些微优化。#63429 (Raúl Marín)。
-
当 DateTime 与 DateTime64 比较时,索引分析现在也能生效。修复了 #63441。#63443 (Alexey Milovidov)。
-
通过清理无用数据,将类型为 Set 的索引加速了一些(大约 1.5 倍)。#64098 (Alexey Milovidov)。
改进内容
-
移除 optimize_monotonous_functions_in_order_by 设置,因为该设置正被废弃,已不再产生任何效果(no-op)。 #63004 (Raúl Marín).
-
Map 类型现在可以使用 Float32、Float64、Array(T)、Map(K,V) 和 Tuple(T1, T2, ...) 作为键。已关闭 #54537。#59318 (李扬)。
-
为 AzureBlobStorage 添加一个类似于 S3 的异步 WriteBuffer。#59929 (SmitaRKulkarni)。
-
支持在保留边框的情况下调整列宽的多行字符串。#59940(Volodyachan)。
-
使 RabbitMQ 对损坏的消息发送 nack。修复 #45350。#60312 (Kseniia Sumarokova)。
-
添加设置项 first_day_of_week,用于控制函数 toStartOfInterval(..., INTERVAL ... WEEK) 在计算一周起始日时所使用的第一天。这样可以与函数 toStartOfWeek 保持一致,后者默认将星期日作为一周的第一天。#60598(Jordi Villar)。
-
新增持久化虚拟列 _block_offset,用于存储在插入时分配的所属数据块中的原始行号。可以通过设置 enable_block_offset_column 来启用列 _block_offset 的持久化。新增虚拟列 _part_data_version,其值为 part 的最小块号或 mutation 版本号。持久化虚拟列 _block_number 不再被视为实验性功能。#60676 (Anton Popov)。
-
函数 date_diff 和 age 现在以纳秒级而非微秒级精度计算结果。它们现在也支持将纳秒(nanosecond、nanoseconds 或 ns)作为 unit 参数的取值之一。#61409(Austin Kothig)。
-
现在在合并过程中,不再为宽分区片段加载 marks。#61551 (Anton Popov)。
-
默认启用 output_format_pretty_row_numbers,以提升易用性。#61791 (Alexey Milovidov)。
-
进度条现在也可用于带有
LIMIT、从system.zeros、system.zeros_mt读取的简单查询(它已经支持system.numbers和system.numbers_mt),以及generateRandom表函数。作为额外优化,如果记录总数大于max_rows_to_read限制,将会更早抛出异常。由此关闭了 #58183。#61823(Alexey Milovidov)。 -
新增对 TRUNCATE ALL TABLES 的支持。 #61862 (豪肥肥)。
-
添加了设置项 input_format_json_throw_on_bad_escape_sequence,禁用该设置项后,允许在 JSON 输入格式中保存不正确的转义序列。#61889 (Kruglov Pavel)。
-
将警告消息中的用语从 “a” 修正为 “the”。由于只有一个 Atomic 引擎,因此应使用 “to the new Atomic engine” 而不是 “to a new Atomic engine”。#61952 (shabroo)。
-
修复在回滚 quorum 插入事务时的逻辑错误。 #61953 (Han Fei)。
-
根据 Apache Arrow 模式自动推断 Nullable 列类型。#61984(Maksim Kita)。
-
允许在聚合过程中取消对聚合状态的并行合并。例如:函数 uniqExact。#61992 (Maksim Kita)。
-
带有 INVALIDATE_QUERY 的字典源在启动时不再被重新加载两次。#62050 (vdimir)。
-
ReplicatedMergeTree上的OPTIMIZE FINAL现在会先等待当前正在进行的合并完成,然后重新尝试调度最终合并。这将使其行为与普通MergeTree更加一致。#62067(Nikita Taranov)。 -
在从 Hive 文本文件读取数据时,会使用文本文件的首行来确定输入字段的数量。但有时首行的字段数与 Hive 表定义不一致,例如 Hive 表被定义为包含 3 列,如 test_tbl(a Int32, b Int32, c Int32),但文本文件的首行只有 2 个字段。在这种情况下,输入字段数量会被调整为 2 个,如果文本文件的下一行有 3 个字段,那么第三个字段将无法被读取,而是被设置为默认值 0,这是不正确的。#62086 (KevinyhZou)。
-
在客户端输入时的语法高亮将基于语法级别工作(此前基于词法级别)。#62123(Alexey Milovidov)。
-
修复这样一个问题:当在包含主键的布尔表达式后面冗余地添加
= 1或= 0时,导致未使用主键索引。例如,SELECT * FROM <table> WHERE <primary-key> IN (<value>) = 1和SELECT * FROM <table> WHERE <primary-key> NOT IN (<value>) = 0都会执行全表扫描,而本应可以使用主键索引。#62142 (josh-hildred)。 -
新增了 lightweight_deletes_sync 设置(默认值:2 —— 同步等待所有副本)。它类似于 mutations_sync 设置,但仅影响轻量级删除的行为。#62195(Anton Popov)。
-
在解析自定义设置的值时,能够区分布尔值和整数:SET custom_a = true; SET custom_b = 1。 #62206 (Vitaly Baranov)。
-
通过 AWS PrivateLink Interface 终端节点支持 S3 访问。关闭 #60021、#31074 和 #53761。#62208(Arthur Passos)。
-
客户端必须向服务器发送请求头
Keep-Alive: timeout=X。如果客户端从服务器接收到带有该请求头的响应,则必须使用服务器返回的该值。同时,为了避免连接关闭时出现竞态条件,客户端最好不要继续复用即将过期的连接。#62249 (Sema Checherinda)。 -
为 date_trunc 增加了纳秒、微秒和毫秒单位。 #62335 (Misz606)。
-
查询缓存现在不再缓存对系统表(system.、information_schema.、INFORMATION_SCHEMA.*)执行的查询结果。#62376(Robert Schulze)。
-
MOVE PARTITION TO TABLE 查询可能被延迟,或者抛出 TOO_MANY_PARTS 异常,以避免超过对分区片段数量的限制。适用的设置和限制与 INSERT 查询相同(参见 max_parts_in_total、parts_to_delay_insert、parts_to_throw_insert、inactive_parts_to_throw_insert、inactive_parts_to_delay_insert、max_avg_part_size_for_too_many_parts、min_delay_to_insert_ms 和 max_delay_to_insert 设置)。 #62420 (Sergei Trifonov)。
-
使 transform 始终返回第一个匹配项。#62518 (Raúl Marín)。
-
在执行 RESTORE 时,避免对表的 DEFAULT 表达式求值。 #62601 (Vitaly Baranov)。
-
允许在 HTTP 请求中将 QUOTA 键与不同的认证方案搭配使用。#62842(Kseniia Sumarokova)。
-
当达到用户的 valid_until 时,关闭会话。#63046 (Konstantin Bogdanov)。