V24.5 Cloud 版本变更日志
基于 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 表仍会显示这些列;但在新版本中,它会直接跳过整个表。移除了会减慢查询的跟踪日志消息 "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。关闭 issue #56257。#59747 (Shaun Struwig)。 -
现在可以为表引擎授予权限,并且不会影响现有用户的行为。#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相同——不会自动添加LIMIT。#61969 (YenchangChan)。 -
现在支持通过
ALTER MODIFY SETTING修改 Memory 引擎表的设置。例如:ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;。#62039 (zhongyuankai)。 -
分析器现在支持递归 CTE。#62074 (Maksim Kita)。
-
之前我们的 S3 存储和 S3 表函数不支持从归档文件中进行查询。现在新增方案,允许在 S3 中遍历归档内的文件。#62259 (Daniil Ivanik)。
-
支持条件函数
clamp。#62377 (skyoct)。 -
新增
npy输出格式。#62430 (豪肥肥)。 -
分析器现在支持
QUALIFY子句。关闭 issue #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 的变更操作(mutations)开销(v2)。#60856 (Azat Khuzhin)。
-
使用等价集合改进 JOIN 过滤下推。#61216 (Maksim Kita)。
-
增加新的分析器阶段(analyzer pass),以优化 IN 单值场景。#61564 (LiuNeng)。
-
当输入字符串全部为 ASCII 字符时,将字符串函数 XXXUTF8 按 ASCII 方式处理。灵感来自 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。从文件执行简单的 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 的执行速度现在大幅提升(10 倍到 1000 倍)。#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 进行比较时,将启用索引分析,从而解决 issue #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, ...)作为键。关闭 issue #54537。#59318 (李扬)。 -
为
AzureBlobStorage添加类似于S3的异步WriteBuffer。#59929 (SmitaRKulkarni)。 -
支持在保留边框的同时调整列宽的多行字符串。#59940 (Volodyachan)。
-
让
RabbitMQ对损坏的消息发送nack。关闭 issue #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,其中包含分片的最小块号或变更(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)。 -
进度条现在会对来自
system.zeros、system.zeros_mt的带LIMIT的简单查询生效(之前已支持system.numbers和system.numbers_mt),以及generateRandom表函数。额外的好处是:如果记录总数大于max_rows_to_read限制,将更早抛出异常。这关闭了 issue #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 schema 自动推断
Nullable列类型。#61984 (Maksim Kita)。 -
允许在聚合过程中取消聚合状态的并行合并。例如:
uniqExact。#61992 (Maksim Kita)。 -
启动时带有
INVALIDATE_QUERY的字典源不会被加载两次。#62050 (vdimir)。 -
现在,对 ReplicatedMergeTree 执行 OPTIMIZE FINAL 时,会先等待当前活动的合并完成,然后重新尝试调度最终合并。这将使其行为与普通 MergeTree 更加一致。#62067 (Nikita Taranov)。
-
在从 Hive 文本文件读取数据时,会使用 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 设置,但只影响轻量级删除(lightweight deletes)的行为。#62195 (Anton Popov)。
-
在解析自定义设置的值时区分布尔值和整数:
SET custom_a = true; SET custom_b = 1;。#62206 (Vitaly Baranov)。 -
支持通过 AWS PrivateLink 接口终端节点访问 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)。 -
为避免超过数据片段(part)数量限制,
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 key。#62842 (Kseniia Sumarokova)。
-
当用户的 valid_until 到期时关闭会话。#63046 (Konstantin Bogdanov).