2024 更新日志
目录
ClickHouse 版本 v24.12,2024-12-19
ClickHouse 版本 v24.11,2024-11-26
ClickHouse 版本 v24.10,2024-10-31
ClickHouse 版本 v24.9,2024-09-26
ClickHouse 版本 v24.8 LTS,2024-08-20
ClickHouse 版本 v24.7,2024-07-30
ClickHouse 版本 v24.6,2024-07-01
ClickHouse 版本 v24.5,2024-05-30
ClickHouse 版本 v24.4,2024-04-30
ClickHouse 版本 v24.3 LTS,2024-03-26
ClickHouse 版本 v24.2,2024-02-29
ClickHouse 版本 v24.1,2024-01-30
2023 年更新日志
ClickHouse 版本 24.12,2024-12-19
不向后兼容的变更
- 函数
greatest和least现在会忽略 NULL 输入值,而此前只要任一参数为 NULL,就会返回 NULL。例如,SELECT greatest(1, 2, NULL)现在会返回 2。此更改使其行为与 PostgreSQL 兼容,但同时与返回 NULL 的 MySQL 不再兼容。若要保留之前的行为,请将设置least_greatest_legacy_null_behavior(默认:false)设为true。 #65519 #73344(kevinyhzou)。 - 新的 MongoDB 集成现在为默认配置。希望继续使用旧版 MongoDB 驱动(基于 Poco 驱动)的用户,可以启用服务器设置
use_legacy_mongodb_integration。 #73359(Kirill Nikiforov。
新功能
- 将
JSON/Dynamic/Variant类型从实验特性提升到 beta 阶段。#72294(Pavel Kruglov)。我们还将所有修复以及此变更回溯移植到了 24.11 版本。 - Iceberg 数据存储 格式的模式演进为用户提供了丰富的选项,用于修改其表结构。列的顺序、列名以及简单类型扩展都可以在底层进行变更。#69445(Daniil Ivanik)。
- 通过 Iceberg REST Catalog 集成:新增名为 Iceberg 的数据库引擎,可将整个目录接入 ClickHouse。#71542 (Kseniia Sumarokova)。
- 为
MergeTree表的主键索引新增了缓存(可通过表设置use_primary_key_cache启用)。如果为主键索引同时启用了懒加载和缓存,则主键索引会按需加载到缓存中(类似 mark cache),而不是一直常驻内存。新增了在对数据分片执行插入 / 合并 / 拉取操作以及表重启时对主键索引进行预热的功能(可通过设置prewarm_primary_key_cache启用)。这可以降低共享存储上超大表的内存占用,我们已在超过一千万亿行记录的表上进行了测试。#72102 (Anton Popov)。#72750 (Alexander Gololobov)。 - 实现
SYSTEM LOAD PRIMARY KEY命令,用于为指定表的所有数据部分加载主键索引;如果未指定表,则为所有表加载主键索引。这对于进行基准测试以及在查询执行过程中避免额外延迟非常有用。#66252 #67733 (ZAWA_ll)。 - 新增了一条查询语句,可将
MergeTree表作为ReplicatedMergeTree表附加,反之亦然:ATTACH TABLE ... AS REPLICATED和ATTACH TABLE ... AS NOT REPLICATED。#65401 (Kirill)。 - 新增设置项
http_response_headers,用于自定义 HTTP 响应头。例如,你可以让浏览器直接渲染存储在数据库中的图片。由此关闭了 #59620。#72656(Alexey Milovidov)。 - 新增函数
toUnixTimestamp64Second,用于将DateTime64转换为具有固定秒精度的Int64值,从而可以在日期早于 Unix 纪元时返回负值。#70597 (zhanglistar)。#73146 (Robert Schulze)。 - 新增设置项
enforce_index_structure_match_on_partition_manipulation,以便当源表的 projection 和二级索引集合是目标表对应集合的子集时,允许执行 attach 操作。关闭 #70602。#70603(zwy991114)。 - 为 ALTER USER 增加语法
{ADD|MODIFY|DROP SETTING}、ALTER USER{ADD|DROP PROFILE},并在 ALTER ROLE 和 ALTER PROFILE 中提供相同语法。这样就可以修改设置集,而不必每次都整体替换。 #72050 (pufit)。 - 新增
arrayPRAUC函数,用于计算精确率-召回率(Precision-Recall)曲线的 AUC(曲线下面积)。 #72073 (Emmanuel)。 - 为数组类型新增
indexOfAssumeSorted函数。在数组已按非递减顺序排序的情况下,该函数可以优化查找操作。在超大数组(超过 100,000 个元素)上效果尤为明显。#72517(Eric Kurbanov)。 - 允许聚合函数
groupConcat接受分隔符作为可选的第二个参数。#72540 (Yarik Briukhovetskyi)。 - 函数
translate现在支持字符删除:当from参数包含的字符多于to参数时,将删除多余的字符。示例:SELECT translate('clickhouse', 'clickhouse', 'CLICK')现在返回CLICK。 #71441 (shuai.xu).
实验性特性
- 新增 MergeTree 设置项
allow_experimental_reverse_key,用于在 MergeTree 排序键中启用对降序排序的支持。该功能对时间序列分析尤其有用,特别是 TopN 查询。示例用法:ENGINE = MergeTree ORDER BY (time DESC, key)—— 对time字段进行降序排序。#71095(Amos Bird)。
性能优化
- JOIN 重新排序。新增了一个选项,可以在查询计划中选择 JOIN 的哪一侧作为内部(构建)表。该行为由
query_plan_join_swap_table控制,可将其设置为auto。在此模式下,ClickHouse 将尝试选择行数最少的表。#71577(Vladimir Cherkasov)。 - 现在,当
join_algorithm设置为default时,将使用parallel_hash算法(如果可用)。在无法使用parallel_hash时,仍会考虑此前的两个可选算法(direct和hash)。#70788 (Nikita Taranov)。 - 添加了一个选项,用于从
WHERE和ON表达式中提取公共表达式,以减少在执行 JOIN 时使用的哈希表数量。当 JOIN 的 ON 条件在不同的 OR 分支中存在由 AND 连接的公共子表达式时,这一优化是有意义的。可通过optimize_extract_common_expressions = 1启用。#71537 (János Benjamin Antal)。 - 允许在执行
SELECT时,当对已建立索引的列执行 CAST 为LowCardinality(String)时仍然使用索引。这种情况可能出现在对一个 Merge 表执行查询时,其中部分底层表的列类型为String,而部分为LowCardinality(String)。#71598(Yarik Briukhovetskyi)。 - 在使用并行副本执行查询且启用了本地计划时,不会在 worker 节点上执行索引分析。协调节点会基于其自身(查询发起端)进行的索引分析,为各个 worker 节点选择要读取的范围。这样一来,使用并行副本的短查询可以达到与单节点查询同样低的延迟。#72109(Igor Nikonov)。
- 对于对象存储磁盘,
clickhouse disks remove --recursive的内存占用已减少。#67323 (Kirill)。 - 恢复从 #57631 引入的,在 compact 格式数据分片中读取单个列子列的优化,该优化此前被误删。#72285(Pavel Kruglov)。
- 通过在比较器中去虚化函数调用,加速对
LowCardinality(String)列的排序。#72337 (Alexander Gololobov)。 - 为某些简单数据类型优化函数
argMin/argMax。#72350(alesapin)。 - 通过在内存跟踪器中使用共享锁来优化锁机制,减少锁竞争,从而提升在拥有大量 CPU 核心的系统上的性能。 #72375 (Jiebin Sun).
- 新增设置
use_async_executor_for_materialized_views。使用异步(可能为多线程)方式执行物化视图查询,可以在 INSERT 操作期间加快视图处理速度,但也会消耗更多内存。#72497 (alesapin)。 - 提升了聚合函数状态反序列化的性能(在数据类型
AggregateFunction以及分布式查询中)。略微提升了RowBinary格式解析的性能。 #72818 (Anton Popov)。 - 在读取时根据表键的顺序拆分区间并使用并行副本,以减少读取过程中的内存消耗。 #72173 (JIaQi).
- 在插入批次中分区键仅有一个取值的情况下,加速对 MergeTree 的插入操作。#72348 (alesapin).
- 在从备份恢复时,实现了并行创建表的功能。在此 PR 之前,
RESTORE命令始终使用单线程创建表,对于包含大量表的备份,这可能会很慢。#72427(Vitaly Baranov)。 - 如果 mark cache 很大,清空它可能会花费较长时间。如果在此期间一直持有 context 的互斥锁,会阻塞许多其他操作,甚至在锁释放之前都无法建立新的客户端连接。而且,为了实现同步其实并不需要一直持有这把互斥锁,通过
shared_ptr持有对该缓存的本地引用就足够了。#72749 (Alexander Gololobov)。
改进
- 移除
allow_experimental_join_condition设置,从而默认允许使用非等值条件。#69910(Vladimir Cherkasov)。 - 服务器端配置(users.xml)中的设置现在也会应用到客户端,这对于格式设置(例如
date_time_output_format)非常有用。 #71178 (Michael Kolupaev)。 - 根据服务器/用户内存使用情况自动将
GROUP BY/ORDER BY切换为外部模式(写入磁盘)。通过max_bytes_ratio_before_external_group_by/max_bytes_ratio_before_external_sort查询设置进行控制。#71406(Azat Khuzhin)。 - 添加了一种新的取消逻辑:
CancellationChecker会检查每个已启动查询的超时时间,并在达到超时时将其停止。#69880 (Yarik Briukhovetskyi)。 - 支持通过
ALTER将Object类型转换为JSON类型,这意味着可以轻松从已弃用的 Object 类型迁移。#71784 (Pavel Kruglov)。 - 允许集合中存在 Enum 中未定义的未知值。修复 #72662。#72686(zhanglistar)。
- 为
Enum数据类型添加对字符串搜索运算符(如 LIKE)的支持,实现了 #72661。#72732(zhanglistar)。 - 此前一些无意义的 ALTER USER 查询会被接受。修复了 #71227。#71286(Arthur Passos)。
- 在为分布式
INSERT ... SELECT构建执行计划时,遵循prefer_locahost_replica设置。 #72190 (filimonov). - Azure 违反了 Iceberg 规范,错误地将 Iceberg v1 标记为 Iceberg v2。该问题在这里进行了描述。Azure Iceberg Writer 创建的 Iceberg 元数据文件(以及 manifest 文件)不符合规范。现在我们尝试使用 v2 读取器读取 v1 Iceberg 格式的元数据(因为 Azure 就是这样写的),并在未在 manifest 文件中创建相应字段时抛出错误。#72277(Daniil Ivanik)。
- 现在允许在查询中使用
UNION [ALL]来创建MATERIALIZED VIEW。其行为与带有JOIN的物化视图相同:只有SELECT表达式中的第一个表会作为插入触发源生效,其他所有表都会被忽略。不过,如果对第一个表有多次引用(例如与自身进行 UNION),那么所有这些引用都会作为插入的数据块一并被处理。#72347(alesapin)。 - 在将 ClickHouse 用作字典数据源时,增加了对源查询的验证。#72548(Alexey Katsman)。
- 确保 ClickHouse 在重新加载配置时能感知到来自 ZooKeeper 的更改。#72593 (Azat Khuzhin)。
- 对已缓存 marks 的内存使用进行更合理的估算,从而降低缓存的总体内存占用。#72630 (Antonio Andelic)。
- 新增一个名为
StartupScriptsExecutionState的指标。该指标可以有三个取值:0 = 启动脚本尚未执行完成,1 = 启动脚本执行成功,2 = 启动脚本执行失败。我们需要这个指标,是为了了解启动脚本在云端是否成功执行,尤其是在基础配置发布之后。#72637 (Miсhael Stetsyuk). - 将新的
MergeTreeIndexGranularityInternalArraysTotalSize指标添加到system.metrics中。此指标用于定位具有超大数据集、容易受到高 - 为创建复制表的操作添加重试机制。 #72682 (Vitaly Baranov).
- 将
total_bytes_with_inactive添加到system.tables中,用于统计非活跃数据部分的总字节数。#72690 (Kai Zhu)。 - 将 MergeTree 设置添加到
system.settings_changes。#72694 (Raúl Marín)。 - 为
notEmpty函数增加对 JSON 类型的支持。#72741(Pavel Kruglov)。 - 支持解析来自 GCS S3 的
AuthenticationRequired错误。 #72753 (Vitaly Baranov). - 在函数
ifNull和coalesce中支持Dynamic类型。#72772 (Pavel Kruglov)。 - 在
toFloat64、touInt32等函数中增加对Dynamic的支持。 #72989 (Pavel Kruglov). - 添加 S3 请求设置
http_max_fields、http_max_field_name_size、http_max_field_value_size,并在执行备份或恢复时解析 S3 API 响应的过程中使用这些设置。#72778 (Vitaly Baranov)。 - 仅在最后一个使用该元数据的表被删除后,才删除 keeper 中 Storage S3(Azure)Queue 的表元数据。#72810 (Kseniia Sumarokova)。
- 添加了
JoinBuildTableRowCount/JoinProbeTableRowCount/JoinResultRowCountProfileEvents 事件。#72842 (Vladimir Cherkasov)。 - 在 MergeTree 排序键和跳过索引中支持子列。 #72644 (Pavel Kruglov).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复 MergeTree 中可能存在交叉的数据分片(在将分片移动到 detached 目录的操作失败后出现,可能是由于对象存储上的操作失败导致)。 #70476 (Azat Khuzhin).
- 修复了在检测表名过长时的错误检测逻辑。提供诊断信息以提示允许的最大长度。新增函数
getMaxTableNameLengthForDatabase。 #70810 (Yarik Briukhovetskyi). - 修复了在
clickhouse-library-bridge崩溃后产生的僵尸进程问题(该程序允许运行不安全的库)。#71301 (MikhailBurdukov)。 - 修复在为
plain_rewritable磁盘创建目录失败时,事务回滚过程中出现的 NoSuchKey 错误。#71439 (Julia Kartseva)。 - 修复在
PrettyJSON 格式中对Dynamic值的序列化。#71923(Pavel Kruglov)。 - 将自动推断的格式名称添加到
File/S3/URL/HDFS/Azure引擎的CREATE查询中。此前,每次服务器重启都会重新推断格式名称,如果指定的数据文件已被删除,就会在服务器启动时导致错误。#72108(Pavel Kruglov)。 - 修复在旧版分析器中于
JOIN ON表达式使用 UDF 时出现的错误。#72179 (Raúl Marín)。 - 修复了
StorageObjectStorage中的一些小问题,并默认启用了use_hive_partitioning。#72185 (Yarik Briukhovetskyi)。 - 修复 bug:
min_age_to_force_merge_on_partition_only会卡在反复尝试合并同一个已经被合并为单个 part 的分区上,而不去合并那些仍包含多个 part 的分区。#72209 (Christoph Wurm)。 - 修复了在处理稀疏列时极少数情况下会发生的
SimpleSquashingChunksTransform崩溃问题。#72226(Vladimir Cherkasov)。 - 修复了
GraceHashJoin中的数据竞争问题,该问题可能导致连接结果中缺失某些行。#72233(Nikita Taranov)。 - 在启用
enable_block_number_column设置时,修复了带有物化_block_number列的ALTER DELETE查询。#72261 (Anton Popov)。 - 修复了在并发调用
ColumnDynamic::dumpStructure()时出现的数据竞争问题,例如在ConcurrentHashJoin构造函数中。#72278 (Nikita Taranov)。 - 修复在
ORDER BY ... WITH FILL中使用重复列时可能导致的LOGICAL_ERROR。 #72387 (Vladimir Cherkasov). - 在应用
optimize_functions_to_subcolumns之后,修复了多种情况下的类型不匹配问题。#72394 (Anton Popov). - 改为使用
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE,而不是AWS_CONTAINER_AUTHORIZATION_TOKEN_PATH。修复 #71074。#72397(Konstantin Bogdanov)。 - 修复在解析
BACKUP DATABASE db EXCEPT TABLES db.table查询时出现的失败问题。#72429 (Konstantin Bogdanov)。 - 不再允许创建空的
Variant。#72454 (Pavel Kruglov)。 - 修复
system.merges中result_part_path的无效格式问题。#72567(Konstantin Bogdanov)。 - 修复解析仅包含单个元素(例如
{file})的 glob 表达式的问题。 #72572 (Konstantin Bogdanov). - 修复在包含
ARRAY JOIN的分布式查询中为 follower 服务器生成查询时的问题。修复了 #69276。#72608(Dmitry Novik)。 - 修复
DateTime64 IN DateTime64表达式返回空结果的错误。 #72640 (Yarik Briukhovetskyi). - 修复了在向包含使用
flatten_nested=0创建的表的 Replicated 数据库添加新副本时出现的元数据不一致问题。#72685 (Alexander Tokmakov)。 - 修复 Keeper 内部通信的高级 SSL 配置。#72730(Antonio Andelic)。
- 修复在 S3Queue 无序模式下,当
tracked_files_limit设置值小于 S3 文件生成速率时触发的 “No such key” 错误。#72738 (Kseniia Sumarokova). - 修复当本地不存在该用户时在 RemoteQueryExecutor 中抛出的异常。#72759(Andrey Zvonov)。
- 修复了在启用
enable_block_number_column设置时,对物化_block_number列执行变更操作的问题。 #72854 (Anton Popov). - 修复在备份中存在空文件时使用普通可重写磁盘进行备份/恢复的功能。 #72858 (Kseniia Sumarokova).
- 在 DistributedAsyncInsertDirectoryQueue 中正确取消插入。#72885 (Antonio Andelic).
- 修复了在将错误数据解析到稀疏列时发生的崩溃(在启用
enable_parsing_to_custom_serialization设置时可能发生)。#72891 (Anton Popov). - 修复在备份恢复过程中可能发生的崩溃。#72947 (Kseniia Sumarokova).
- 修复了
parallel_hashJOIN 方法中的一个缺陷,该缺陷可能在查询的ON子句包含带不等式过滤条件的复杂条件时出现。 #72993 (Nikita Taranov). - 在进行 JSON 解析时使用默认的格式设置,以避免反序列化出错。 #73043 (Pavel Kruglov).
- 修复在使用不支持的存储时事务崩溃的问题。#73045 (Raúl Marín)。
- 修复在
MemoryTracking与MemoryResident之间的差值持续增大时可能出现的内存跟踪过高估计问题。#73081 (Azat Khuzhin). - 在解析
Tuple时检查 JSON 中是否存在重复键。此前在解析过程中可能会导致逻辑错误Invalid number of rows in Chunk。#73082(Pavel Kruglov)。
构建 / 测试 / 打包改进
- 之前存放在
/utils目录中且需要手动从源码编译的所有小型工具,现在都已成为主 ClickHouse 安装包的一部分。关闭相关问题:#72404。#72426(Nikita Mikhaylov)。 - 去除在 22.3 中引入的对
/etc/systemd/system/clickhouse-server.service的删除逻辑。#39323。#72259(Mikhail f. Shiryaev)。 - 拆分大型编译单元,以避免因内存 / CPU 限制导致的编译失败。#72352(Yakov Olkhovskiy)。
- OSX:启用 ICU 支持进行构建,从而支持排序规则、字符集转换以及其他本地化功能。#73083(Raúl Marín)。
ClickHouse 版本 24.11,2024-11-26
不向后兼容的变更
- 移除系统表
generate_series和generateSeries。它们是错误添加的,参见:#59390。#71091(Alexey Milovidov)。 - 移除
StorageExternalDistributed。关闭问题 #70600。#71176(flynn)。 - 表引擎 Kafka、NATS 和 RabbitMQ 现在由
SOURCES层级中的各自权限控制。请为所有使用这些引擎类型创建表的非默认数据库用户添加相应权限。#71250(Christoph Wurm)。 - 在执行变更前检查完整的变更查询(包括子查询)。这可以防止误运行无效查询并积累会阻塞有效变更的“死变更”。#71300(Christoph Wurm)。
- 将文件系统缓存设置
skip_download_if_exceeds_query_cache重命名为filesystem_cache_skip_download_if_exceeds_per_query_cache_write_limit。#71578(Kseniia Sumarokova)。 - 移除在
deltaSumTimestamp中对Enum以及UInt128和UInt256参数的支持。移除对deltaSumTimestamp第二个(“timestamp”)参数类型为Int8、UInt8、Int16和UInt16的支持。#71790(Alexey Milovidov)。 - 当使用 Dictionary 存储引擎、dictionary 表函数或直接对字典本身执行 SELECT 以直接从字典中获取数据时,现在只需对该字典具有
SELECT权限或dictGet权限即可。这与之前防止 ACL 绕过的尝试保持一致:https://github.com/ClickHouse/ClickHouse/pull/57362 和 https://github.com/ClickHouse/ClickHouse/pull/65359。同时也使后者具备向后兼容性。[#72051](https://github.com/ClickHouse/ClickHouse/pull/72051)([Nikita Mikhaylov](https://github.com/nikitamikhaylov))。
实验性特性
- 将
allow_feature_tier实现为全局开关,用于禁用所有实验性 / beta 特性。#71841 #71145 (Raúl Marín). - 修复由于 JSON 子列文件中未转义的特殊字符导致的可能错误
No such file or directory。#71182 (Pavel Kruglov). - 支持将类型从 String 修改为 JSON。此 PR 还将 JSON 和 Dynamic 类型的序列化更改为新版本 V2。旧版本 V1 仍可以通过启用设置
merge_tree_use_v1_object_and_dynamic_serialization来使用(可在升级期间使用,以便在不出现问题的情况下回滚版本)。#70442 (Pavel Kruglov). - 通过从 JSON 字符串进行序列化/反序列化,实现从 Map/Tuple/Object 到新 JSON 的简单 CAST 转换。#71320 (Pavel Kruglov).
- 默认不允许在 ORDER BY/GROUP BY/PARTITION BY/PRIMARY KEY 中使用 Variant/Dynamic 类型,因为这可能导致意外结果。#69731 (Pavel Kruglov).
- 禁止在 min/max 函数中使用 Dynamic/Variant 类型,以避免产生混淆。#71761 (Pavel Kruglov).
新功能
- 新增用于描述工作负载和资源管理的 SQL 语法。https://clickhouse.com/docs/operations/workload-scheduling。[#69187](https://github.com/ClickHouse/ClickHouse/pull/69187) (Sergei Trifonov).
- 新增数据类型
BFloat16,用于表示 16 位浮点数,具有 8 位指数、符号位和 7 位尾数。此改动关闭了 #44206。此改动关闭了 #49937。#64712 (Alexey Milovidov). - 新增
CHECK GRANT查询,用于检查当前用户/角色是否已被授予特定权限,以及对应的表/列是否存在于内存中。#68885 (Unalian). - 新增
iceberg[S3;HDFS;Azure]Cluster、deltaLakeCluster、hudiCluster表函数。#72045 (Mikhail Artemenko). - 为 http_handlers(
dynamic_query_handler/predefined_query_handler)新增支持设置用户/密码的能力。#70725 (Azat Khuzhin). - 在 ORDER BY WITH FILL 运算符中新增对 staleness 子句的支持。#71151 (Mikhail Artemenko).
- 允许每种身份验证方法拥有各自的过期时间,并从用户实体中移除该属性。#70090 (Arthur Passos).
- 新增函数
parseDateTime64、parseDateTime64OrNull和parseDateTime64OrZero。与现有的parseDateTime(及其变体)函数相比,它们返回DateTime64类型的值,而不是DateTime。#71581 (kevinyhzou).
性能优化
- 针对在整个 part 内索引粒度为常量的情况优化了索引粒度值的内存使用。新增支持始终为 part 选择常量粒度(通过设置
use_const_adaptive_granularity),从而确保其在内存中的使用始终是优化的。这有助于在大型负载场景(共享存储中包含数万亿行数据)下,避免数据 part 的元数据(索引粒度值)内存占用不断增长。#71786(Anton Popov)。 - 现在,在使用
join_algorithm = 'parallel_hash'并将输入块在多个线程之间分发以进行并行处理时,我们不再复制输入块中的列。#67782 (Nikita Taranov)。 - 为不相交的数据片段优化了
Replacing合并算法。#70977 (Anton Popov). - 不再在 metrics 和 system.detached_parts 中列出来自只读和一次写入磁盘的 detached parts。 #71086 (Alexey Milovidov).
- 默认情况下不要计算开销较大的异步指标。该功能在 #40332 中引入,但如果只是为了单个客户而运行一个开销很重的后台作业并不理想。#71087(Alexey Milovidov)。
- 对于
plain_rewritable磁盘:列出目录时不要调用对象存储 API,因为这样可能成本较高。相反,将文件名列表存储在内存中。需要权衡的是:初始加载时间会增加,并且存储文件名所需的内存也会增多。#70823 (Julia Kartseva)。 - 通过缩小临界区来改进
system.query_metric_log采集间隔的性能和准确性。#71473 (Pablo Marcos)。 - 通过生成虚拟行来实现顺序读取优化,从而在归并排序时减少数据读取量,在存在多个 part 时尤其有用。 #62125 (Shichao Jin).
- 新增服务器设置项
async_load_system_database,允许服务器在系统数据库尚未完全加载的情况下启动。当存在大量系统表时,这有助于更快地启动 ClickHouse。#69847 (Sergei Trifonov). - 为
clickhouse-compressor添加--threads参数,从而支持并行压缩数据。 #70860 (Alexey Milovidov). - 添加了
prewarm_mark_cache设置,用于在插入、合并、拉取数据分片以及表启动时,将 marks 预加载到 mark cache 中。#71053 (Anton Popov)。 - 将内存中的
index_granularity数组缩减至合适大小,以减少 MergeTree 表引擎家族的内存占用。#71595 (alesapin). - 对非磁盘读操作关闭文件系统缓存选项
boundary_alignment,以提升从带缓存的独立远程文件读取的性能。 #71827 (Kseniia Sumarokova). - 之前,类似
SELECT * FROM table LIMIT ...的查询会加载实际上未被使用的数据分片索引。#71866(Alexander Gololobov)。 - 默认启用
parallel_replicas_local_plan。在查询发起节点上构建完整的本地执行计划,可以在降低资源消耗的同时提升并行副本的性能,并为应用更多查询优化提供空间。#70171 (Igor Nikonov)。
改进
- 允许通过文件参数方式使用 ClickHouse,例如
ch queries.sql。#71589(Raúl Marín)。 Vertical格式(当你用\G结束查询时也会启用)获得了 Pretty 系列格式的特性,例如:- 高亮显示数字中的千位分组;- 输出可读的数字提示信息。 #71630(Alexey Milovidov)。- 将外部用户角色从查询发起方推送到集群中的其他节点。当只有查询发起方能访问外部认证系统(如 LDAP)时,这会很有用。#70332 (Andrey Zvonov)。
- 为聚合函数
any添加了别名anyRespectNulls、firstValueRespectNulls和anyValueRespectNulls,同时为聚合函数anyLast添加了别名anyLastRespectNulls和lastValueRespectNulls。这样可以使用更自然的纯驼峰命名风格,而不是驼峰与下划线混用的写法,例如使用SELECT anyLastRespectNullsStateIf而不是anyLast_respect_nullsStateIf。#71403(Peter Nguyen)。 - 添加了配置参数
date_time_utc,使 JSON 日志格式支持 RFC 3339/ISO8601 格式的 UTC 日期时间。#71560 (Ali)。 - 为 S3 端点的用户身份验证新增了一种 header 类型(
access_header)。这样可以以最低优先级指定某个访问 header,并且该 header 会被来自任何其他来源(例如表结构或命名集合)的access_key_id覆盖。#71011 (MikhailBurdukov)。 - 在使用常量数组和被捕获的常量参数时,高阶函数将返回常量。#58400 (Alexey Milovidov)。
- 查询计划步骤名称(
EXPLAIN PLAN json=1)和管道处理器名称(EXPLAIN PIPELINE compact=0,graph=1)现在都带有唯一 id 作为后缀。这样可以将处理器分析器的输出和 OpenTelemetry 跟踪与 explain 的输出一一对应。#63518(qhsong)。 - 添加了一个选项,用于在将对象写入 Azure Blob Storage 之后检查该对象是否存在,可通过设置
check_objects_after_upload来控制。 #64847 (Smita Kulkarni). - 在
clickhouse-local中默认使用Atomic数据库。处理了 #50647 中的第 1 和第 5 条。关闭了 #44817。#68024(Alexey Milovidov)。 - 异常会违反 HTTP 协议规范,以便向客户端通知错误。#68800 (Sema Checherinda).
- 通过创建 replica_dir,并在 DDLWorker 中将副本标记为活动状态,以上报正在运行分布式 DDL 查询的主机。 #69658 (tuanpach).
- 当
distributed_ddl_output_mode被设置为 *_only_active 时,数据库 ON CLUSTER 查询将只等待活动副本完成。#69660 (tuanpach)。 - 对
ON CLUSTER备份和恢复的错误处理和取消机制进行了改进:- 如果某个主机上的备份或恢复失败,将会在其他主机上自动取消 - 不会因为部分主机失败而其他主机继续工作而产生异常或莫名其妙的错误 - 如果某个主机上的备份或恢复被取消,将会在其他主机上自动取消 - 修复了test_disallow_concurrency相关问题——现在禁用并发应当表现得更好 - 备份和恢复现在对 ZooKeeper 断连更加不敏感,具备更高的容错能力。#70027 (Vitaly Baranov). - 在 S3Queue 存储中为某些设置提供
ALTER TABLE ... MODIFY/RESET SETTING ...支持。 #70811 (Kseniia Sumarokova). - 新增了可按与重新加载服务器证书相同的流程来重新加载客户端证书的功能。#70997 (Roman Antonov)。
- 使客户端历史记录大小可配置,并增大其默认大小。#71014(Jiří Kozlovský)。
- 为 Parquet 原生读取器添加布尔类型支持。 #71055 (Arthur Passos).
- 在与 S3 交互时对更多类型的错误进行重试,例如 "Malformed message"。 #71088 (Alexey Milovidov).
- 降低部分与 S3 相关消息的日志级别。#71090(Alexey Milovidov)。
- 支持写入名称包含空格的 HDFS 文件。#71105 (exmy).
- 新增了限制复制表、字典和视图数量的设置。#71179 (Kirill)。
- 如果前者可用,请使用
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE替代AWS_CONTAINER_AUTHORIZATION_TOKEN。修复了 #71074。#71269(Konstantin Bogdanov)。 - 从 ReplicatedMergeTree 重启线程中移除创建 metadata_version ZooKeeper 节点的逻辑。唯一需要创建该节点的情况是,当用户从早于 20.4 的版本直接升级到晚于 24.10 的版本时。ClickHouse 不支持跨越超过一年的升级,因此我们应该抛出异常并要求用户逐步升级,而不是创建该节点。#71385(Miсhael Stetsyuk)。
- 为高级仪表板添加按主机划分的仪表板
Overview (host)和Cloud overview (host)。#71422 (alesapin)。 clickhouse-local默认使用隐式 SELECT,这使得可以将其用作计算器。改进了隐式 SELECT 模式下的语法高亮效果。#71620 (Alexey Milovidov)。- 命令行应用程序现在即使是多条语句也会进行语法高亮显示。#71622 (Alexey Milovidov)。
- 命令行应用程序在出现错误时将返回非零退出码。在之前的版本中,
disks应用程序在出现错误时会返回零,而其他应用程序在错误码为 256(PARTITION_ALREADY_EXISTS)和 512(SET_NON_GRANTED_ROLE)时也会返回零。#71623(Alexey Milovidov)。 - 当用户/用户组以 ID 指定时,
clickhouse su会失败。此补丁修复了该问题,使其也能接受UID:GID形式。 #71626 (Mikhail f. Shiryaev). - 允许通过设置
filesystem_cache_prefer_bigger_buffer_size来禁用文件系统缓存的内存缓冲区自动增大。 #71640 (Kseniia Sumarokova). - 在文件系统缓存中,为后台下载的最大文件分段大小新增单独的设置项
background_download_max_file_segment_size。 #71648 (Kseniia Sumarokova). - 稍微改进了 JSON 类型解析:如果当前 JSON 路径所在的块包含多种类型的值,将按特定的 best-effort 顺序依次尝试各类型,从而选择最合适的类型。#71785 (Pavel Kruglov)。
- 此前,从
system.asynchronous_metrics读取数据会等待并发更新完成。如果系统处于高负载状态,这可能会耗费较长时间。此更改后,可以随时读取先前已收集的值。#71798 (Alexander Gololobov)。 - S3Queue 和 AzureQueue:将
polling_max_timeout_ms设置为 10 分钟,polling_backoff_ms设置为 30 秒。#71817(Kseniia Sumarokova)。 - 在
history周期内将HostResolver更新三次。#71863 (Sema Checherinda). - 在高级仪表板 HTML 页面中,添加了一个用于从
system.dashboards表中选择仪表板的下拉选择器。#72081(Sergei Trifonov)。 - 在完成授权后检查默认数据库是否存在。修复 #71097。#71140(Konstantin Bogdanov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 在执行
ATTACH PART查询期间去重的数据分片,现在不再停留在带有attaching_前缀的状态。#65636 (Kirill)。 - 修复了在
IN函数中使用 DateTime64 时精度丢失的问题。#67230 (Yarik Briukhovetskyi). - 修复在
ORDER BY ... WITH FILL中使用带有IGNORE/RESPECT NULLS的函数时可能出现的逻辑错误,关闭 #57609。 #68234(Vladimir Cherkasov)。 - 修复了在触及内存限制时,使用
Native格式进行异步插入时会出现的罕见逻辑错误。 #68965 (Anton Popov). - 修复在
CREATE TABLE语句中对EPHEMERAL列的COMMENT定义。 #70458 (Yakov Olkhovskiy). - 修复 JSONExtract 与 LowCardinality(Nullable) 搭配使用时的逻辑错误。 #70549 (Pavel Kruglov).
- 当存在另一个具有相同 zkpath 的副本时,允许执行 SYSTEM DROP REPLICA zkpath。 #70642 (MikhailBurdukov).
- 修复
AggregateFunctionGroupArraySorted中的崩溃和内存泄漏。#70820 (Michael Kolupaev)。 - 在 URL 引擎中新增支持通过用户请求头覆盖 Content-Type。 #70859 (Artem Iurin).
- 修复
StorageS3Queue中的逻辑错误 “无法在 /processed 中创建持久节点,因为该节点已存在”。 #70984 (Kseniia Sumarokova). - 修复了在某些情况下未能关闭命名会话,导致其一直处于挂起状态的问题。#70998 (Márcio Martins).
- 修复在投影轻量级删除的 rebuild 选项中未考虑 _row_exists 列的问题。 #71089 (Shichao Jin).
- 修复在 Oracle Linux UEK 6.10 上运行时出现的
AT_* is out of range问题。#71109 (Örjan Fors). - 修复由于意外竞态条件导致的 system.query_metric_log 中错误的值。#71124 (Pablo Marcos).
- 修复 quantileExactWeightedInterpolated 聚合函数名称不一致的问题。该缺陷是在 https://github.com/ClickHouse/ClickHouse/pull/69619 中引入的。cc @Algunenano。#71168 (李扬)。
- 修复在函数比较中使用 Dynamic 时触发 bad_weak_ptr 异常的问题。#71183 (Pavel Kruglov).
- 检查要读取的 7z 文件是否位于本机。 #71184 (Daniil Ivanik)。
- 修复在通过 HTTP 和异步插入使用 Native 格式时被忽略的格式设置问题。 #71193 (Pavel Kruglov).
- 使用设置
use_query_cache = 1运行的 SELECT 查询,如果出现系统表名称的字面量,将不再被拒绝。例如:SELECT * FROM users WHERE name = 'system.metrics' SETTINGS use_query_cache = true;现在可以正常工作。#71254(Robert Schulze)。 - 修复了这样一个问题:在启用 enable_filesystem_cache=1,但存储配置中的磁盘未配置任何缓存时,内存使用量会增加。 #71261 (Kseniia Sumarokova).
- 修复在从 Dynamic 列反序列化 LowCardinality 字典时可能出现的“Cannot read all data”错误。 #71299 (Pavel Kruglov).
- 修复客户端中并行输出格式清理不完整的问题。 #71304 (Raúl Marín).
- 在命名集合中补充了缺失的反转义处理。否则,clickhouse-server 将无法启动。#71308 (MikhailBurdukov)。
- 修复通过原生协议进行的包含空数据块的异步插入。#71312 (Anton Popov).
- 修复在错误的通配符授权下 AST 格式不一致的问题 #71309。#71332 (pufit).
- 在 data parts 的析构函数中添加 try/catch,以避免调用 std::terminate。 #71364 (alesapin).
- 检查 JSON 类型提示中的可疑类型和试验性类型。#71369 (Pavel Kruglov).
- 在非 Linux 操作系统上同样启动 memory worker 线程(修复 #71051)。#71384(Alexandre Snarskii)。
- 修复 Chunk 中 Variant 列的无效行数错误。#71388(Pavel Kruglov)。
- 修复旧版 PostgreSQL 中出现的列 "attgenerated" 不存在的问题,对应 #60651。#71396(0xMihalich)。
- 为避免服务器日志被大量刷屏,现在会将失败的身份验证尝试记录为
DEBUG级别,而不是ERROR级别。#71405 (Robert Schulze). - 修复在向
mongodb表函数传递错误参数(例如NULL)时导致的崩溃。 #71426 (Vladimir Cherkasov). - 修复启用 optimize_rewrite_array_exists_to_has 时发生的崩溃。#71432 (Raúl Marín).
- 修复了在插入操作中对设置
max_insert_delayed_streams_for_parallel_write的使用。此前该设置的行为不正确,在向多个分区写入数据的插入操作中可能导致较高的内存占用。#71474 (Anton Popov). - 修复在
arrayJoin可能出现在WHERE条件中的情况下,旧分析器中可能出现的错误Argument for function must be constant。这是在合并请求 https://github.com/ClickHouse/ClickHouse/pull/65414 之后引入的回归问题。#71476(Nikolai Kochetov)。 - 防止在 SortCursor 中列数为 0 时发生崩溃(旧版分析器)。#71494 (Raúl Marín).
- 修复由未初始化的 ORC 数据导致的 Date32 超出范围问题。更多详细信息请参阅 https://github.com/apache/incubator-gluten/issues/7823。#71500(李扬)。
- 修复在 wide part 中统计 Dynamic 和 JSON 类型列大小的方式。 #71526 (Pavel Kruglov).
- 修复 Analyzer 在物化视图中的查询使用带有 CTE 的
IN时的问题。关闭 #65598。#71538(Maksim Kita)。 - 避免在约束中使用 UDF 时发生崩溃。#71541 (Raúl Marín)。
- 在
bitShift函数中,当发生越界时,返回 0 或默认字符,而不抛出错误。#71580(Pablo Marcos)。 - 修复在某些引擎下使用物化视图时导致的服务器崩溃问题。#71593(Pervakov Grigorii)。
- 对包含常量数组别名的嵌套数据结构执行 array join 时,会导致空指针解引用。此更改已关闭 #71677。#71678(Alexey Milovidov)。
- 修复在使用空元组执行 ALTER 操作时出现的 LOGICAL_ERROR。修复了 #71647。#71679(Amos Bird)。
- 在使用 NOT IN 运算符的情况下,不要转换作用于分区列的谓词中的常量集合。#71695(Eduard Karacharov)。
- 修复 docker 初始化脚本失败时的日志消息,使其表述更易于理解。#71734 (Андрей).
- 修复将 LowCardinality(Nullable) 转换为 Dynamic 时的 CAST。此前这可能会导致错误
Bad cast from type DB::ColumnVector<int> to DB::ColumnNullable。 #71742 (Pavel Kruglov). - 修复在
WHERE条件中对主键为DateTime64类型的列使用toDayOfWeek时抛出的异常。#71849 (Yakov Olkhovskiy). - 修复了解析为稀疏列后填充默认值的逻辑。#71854 (Anton Popov)。
- 修复在分布式表上当输入为 ALIAS 时 GROUPING 函数出错的问题,关闭 #68602。#71855(Vladimir Cherkasov)。
- 修复在启用
allow_experimental_join_condition时可能导致的崩溃,关闭 #71693。#71857(Vladimir Cherkasov)。 - 修复了使用
WITH TIES子句时SELECT语句可能返回行数不足的问题。 #71886 (wxybear). - 修复当在
arrayWithConstant计算中某一列被错误地认为超出数组大小限制时引发的TOO_LARGE_ARRAY_SIZE异常。#71894(Udi)。 clickhouse-benchmark对耗时超过一秒的查询报告了错误的指标。#71898 (Alexey Milovidov).- 修复 clickhouse-client 中进度指示器与进度表之间的数据竞争问题。在使用 FROM INFILE 时会出现该问题。在执行 INSERT 查询期间拦截按键,以切换进度表显示。#71901 (Julia Kartseva)。
- 使用辅助 keeper 进行集群自动发现。 #71911 (Anton Ivashkin).
- 修复在 24.6 中损坏的 system.s3/azure_queue_log 表中的 rows_processed 列。关闭 #69975。#71946(Kseniia Sumarokova)。
- 修复了
s3/s3Cluster函数可能返回不完整结果或抛出异常的问题。该问题出现在在 S3 URI 中使用通配符模式(例如pattern/*),且存在一个键为pattern/的空对象时(此类对象会由 S3 控制台自动创建)。同时,将设置项s3_skip_empty_files的默认值从false更改为true。 #71947 (Nikita Taranov)。 - 修复
clickhouse-client语法高亮时的崩溃问题。关闭 #71864。#71949(Nikolay Degterinsky)。 - 修复当第一个参数为常量时,在
ORDER BY中对MergeTree表使用二元单调函数会触发Illegal type错误的问题。修复了 #71941。#71966(Nikolai Kochetov)。 - 仅允许在子查询中使用的 EXPLAIN AST 中包含 SELECT 查询。其他类型的查询会导致逻辑错误:'Bad cast from type DB::ASTCreateQuery to DB::ASTSelectWithUnionQuery' 或
Inconsistent AST formatting。#71982 (Pavel Kruglov). - 当使用
clickhouse-client插入记录时,客户端会从服务器读取列描述。但之前存在一个 bug:我们以错误的顺序写入了这些描述,正确的顺序应为 [statistics, ttl, settings]。#71991(Han Fei)。 - 当启用
format_alter_commands_with_parentheses时,修复MOVE PARTITION ... TO TABLE ...ALTER 命令的格式问题。#72080 (János Benjamin Antal)。 - 修复了在使用并行副本的查询中对 RIGHT / FULL JOIN 的处理。现在,RIGHT JOIN 可以使用并行副本执行(右表的读取会分布到各个副本上)。FULL JOIN 无法在节点之间并行化,只能在本地执行。 #71162 (Igor Nikonov).
- 修复了由于系统调用受限,导致 Docker 容器中的 ClickHouse 向 stderr 输出 "get_mempolicy: Operation not permitted" 的问题。 #70900 (filimonov).
- 将修复 ZooKeeper 中 metadata_version 记录的操作放在重启线程中,而不是附加线程中。#70297 (Miсhael Stetsyuk)。
- 这是针对“zero-copy”复制的修复,该功能不受支持,并将被完全移除。当在使用 zero-copy 复制的 ReplicatedMergeTree 中仍有节点在使用某个 blob 时,不要删除该 blob。#71186 (Antonio Andelic)。
- 这是针对 “zero-copy” 复制的修复,该功能不受支持并将被完全移除。在将一个数据分片移动到 zero-copy 磁盘之前先获取 zero-copy 共享锁,以防在 Keeper 不可用时可能发生的数据丢失。#71845 (Aleksei Filatov)。
ClickHouse 发布 24.10,2024-10-31
向后不兼容的变更
- 允许在包含
UNION的查询链中,当子查询被括号括起来时,将SETTINGS写在FORMAT之前。这修复了 #39712。改变在一个查询中连续两次指定 SETTINGS 子句时的行为。更靠近对应子查询的 SETTINGS 子句将优先生效。在此前的版本中,最外层的 SETTINGS 子句可能会优先于内部子句。#68614(Alexey Milovidov)。 - 默认现在允许对
[PRE]WHERE子句中的过滤条件进行重排序。可以通过将allow_reorder_prewhere_conditions设置为false来禁用该行为。#70657(Nikita Taranov)。 - 移除许可证不兼容的
idxd-config库。同时也移除了实验性的 Intel DeflateQPL 编解码器。#70987(Alexey Milovidov)。
新功能
- 允许使用通配符前缀授予访问权限:
GRANT SELECT ON db.table_pefix_* TO user。#65311(pufit)。 - 在查询运行期间按下空格键时,客户端会显示一个实时更新的详细指标表。可以在 clickhouse-client 中使用新的
--progress-table选项全局启用该功能;新的--enable-progress-table-toggle选项与--progress-table关联,按下 Control+空格可切换进度表的渲染。#63689(Maria Khristenko),#70423(Julia Kartseva)。 - 允许对象存储表引擎和数据湖对读取的文件进行缓存,使用由 ETag + 文件路径生成的哈希值作为缓存键。#70135 (Kseniia Sumarokova)。
- 支持通过查询创建表:
CREATE TABLE ... CLONE AS ...。它会克隆源表的 schema,然后将所有分区附加到新创建的表上。此功能仅支持MergeTree系列表。修复 #65015。#69091(tuanpach)。 - 添加了新的系统表
system.query_metric_log,其中包含来自表system.events的各个查询的内存和指标值历史记录,并会定期写入磁盘。#66532(Pablo Marcos)。 - 可以通过隐式 SELECT 来编写简单的 SELECT 查询,从而启用计算器式表达式,例如
ch "1 + 2"。这由一个新的设置implicit_select控制。#68502(Alexey Milovidov)。 - 为 clickhouse local 增加对
--copy模式的支持,将其用作格式转换的快捷方式 #68503。#68583(Denis Hananein)。 - 新增一个用于可视化合并过程的内置 HTML 页面,可通过
/merges路径访问。 #70821 (Alexey Milovidov)。 - 新增对
arrayUnion函数的支持。#68989 (Peter Nguyen)。 - 支持参数化 SQL 别名。#50665 (Anton Kozlov)。
- 新增了一个聚合函数
quantileExactWeightedInterpolated,它是基于 quantileExactWeighted 的插值版本。可能有人会问,既然已经有了quantileExactInterpolatedWeighted,那为什么还需要新的quantileExactWeightedInterpolated?原因在于新函数比旧的更精确。这是为了与 Spark 兼容。#69619(李扬)。 - 新增函数
arrayElementOrNull。当数组索引越界或 Map 中不存在指定键时,返回NULL。#69646(李扬)。 - 允许用户通过在
config.xml文件中新增加的message_regexp和message_regexp_negative字段中指定正则表达式来过滤日志输出。日志过滤应用于已格式化且无颜色的文本,以提供最直观的开发者体验。#69657(Peter Nguyen)。 - 新增
RIPEMD160函数,用于计算字符串的 RIPEMD-160 密码哈希值。示例:SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog'))返回37F332F68DB77BD9D7EDD4969571AD671CF9DD3B。#70087(Dergousov Maxim)。 - 支持在
HDFS上读取Iceberg表。#70268 (flynn). - 现在支持以
WITH ... INSERT形式使用 CTE,此前仅支持INSERT ... WITH ...。 #70593 (Shichao Jin)。 - MongoDB 集成:支持所有 MongoDB 类型,在 MongoDB 端支持 WHERE 和 ORDER BY 语句,并对 MongoDB 不支持的表达式进行限制。请注意,新的集成默认处于禁用状态,如需使用,请在服务器配置中将
<use_legacy_mongodb_integration>设置为false。#63279(Kirill Nikiforov)。 - 新增了一个函数
getSettingOrDefault,如果在当前 profile 中未找到自定义设置,则返回默认值并避免抛出异常。#69917 (Shankar)。
实验特性
- 可刷新的物化视图已达到生产可用状态。#70550(Michael Kolupaev)现在在 Replicated 数据库中也支持可刷新的物化视图。#60669(Michael Kolupaev)。
- 并行副本功能从实验阶段提升到 beta 阶段。重构了控制并行副本算法行为的相关设置。简要回顾:ClickHouse 针对涉及多个副本的并行读取提供了四种不同算法,由设置
parallel_replicas_mode进行控制,其默认值为read_tasks。此外,新增了开关类型设置enable_parallel_replicas。#63151(Alexey Milovidov),(Nikita Mikhaylov)。 - 通过在
Dynamic中的内部类型上执行函数,大多数函数现在支持Dynamic类型。#69691(Pavel Kruglov)。 - 在启用设置
input_format_binary_read_json_as_string/output_format_binary_write_json_as_string时,允许在RowBinary格式下将JSON类型作为二进制字符串进行读写。#70288(Pavel Kruglov)。 - 允许在 Native 格式中将
JSON列序列化/反序列化为单个 String 列。输出时使用设置output_format_native_write_json_as_string;输入时在列数据之前写入序列化版本1。#70312(Pavel Kruglov)。 - 为 MergeTree 表引入了一种特殊(实验性)的 merge 选择器模式,使其对数据片段数量接近上限的分区执行更为激进的合并策略。该模式由 MergeTree 级别设置
merge_selector_use_blurry_base控制。#70645(Nikita Mikhaylov)。 - 实现了 Avro 的
Union类型与 ClickHouse 的Variant类型之间的通用序列化/反序列化(ser/de)。修复了 #69713。#69712(Jiří Kozlovský)。
性能优化
- 重构
IDisk和IObjectStorage以提升性能。plain和plain_rewritable对象存储中的表将初始化得更快。#68146(Alexey Milovidov、Julia Kartseva)。在判断 plain_rewritable 磁盘上某个文件或目录是否存在时,不要调用对象存储的 LIST API,因为这在成本上可能不划算。#70852(Julia Kartseva)。减少在 plain_rewritable 磁盘中对对象存储 HEAD API 的请求次数。#70915(Julia Kartseva)。 - 新增了支持将数据直接解析为稀疏列的功能。 #69828 (Anton Popov).
- 提高了对含有大量缺失值的格式(例如
JSONEachRow)的解析性能。 #69875 (Anton Popov). - 支持并行读取 Parquet 行组,并在单线程模式下预取这些行组。 #69862 (LiuNeng).
- 为
pointInPolygon增加 minmax 索引支持。 #62085 (JackyWoo). - 在读取 Parquet 文件时使用 Bloom 过滤器。#62966(Arthur Passos)。
- 无锁重命名数据片段,以避免由于数据片段锁导致 INSERT 操作影响 SELECT 查询(在正常情况下,启用
fsync_part_directory且并行执行 INSERT 时,SELECT 的 QPS 提升了 2 倍,在高负载下效果更为显著)。注意,目前这仅适用于ReplicatedMergeTree。#64955(Azat Khuzhin)。 - 使
materialize ttl遵从ttl_only_drop_parts;仅读取重新计算 TTL 所需的列,并通过用空分片替换的方式来删除分片。 #65488 (Andrey Zvonov). - 在
ThreadPool中优化了线程创建逻辑,以最大限度减少锁竞争。线程创建现在在临界区之外执行,从而在高负载情况下避免作业调度和线程管理的延迟,使 ClickHouse 在高并发负载下更加响应迅速。#68694 (filimonov)。 - 支持从
ORC读取LowCardinality字符串列。 #69481 (李扬). - 在
part_log、query_views_log、filesystem_cache_log等系统日志中,对ProfileEvents使用LowCardinality。 #70152 (Alexey Milovidov)。 - 提升
fromUnixTimestamp/toUnixTimestamp函数的性能。#71042 (kevinyhzou). - 在从阻塞 I/O 进行读取时,不要为整个服务器禁用来自页面缓存的非阻塞读取。此前,如果某个文件系统(例如 tmpfs)不支持
preadv2系统调用而其他文件系统支持,就会导致性能下降。#70299(Antonio Andelic)。 ALTER TABLE .. REPLACE PARTITION不再等待其他分区中正在进行的 mutation/merge 操作完成。#59138 (Vasily Nemkov)。- 从 Keeper 同步 ACL 时不要执行验证。创建时已经进行了验证。原则上这问题不大,但在一些部署中,可能会有成万甚至更多已创建的用户,而这些不必要的哈希验证会在服务器启动期间花费很长时间才能完成(此时会从 Keeper 同步所有内容)。#70644 (Raúl Marín)。
改进
CREATE TABLE AS会复制PRIMARY KEY、ORDER BY等类似子句(针对MergeTree表)。#69739 (sakulali)。- 在 Keeper 中支持 64 位 XID。可以通过
use_xid_64配置项启用该功能。#69908 (Antonio Andelic)。 - 当布尔类型的命令行参数未显式提供值时,该参数将被设置为 true(例如
clickhouse-client --optimize_aggregation_in_order --query "SELECT 1")。#70459(davidtsuk)。 - 新增了用户级设置
min_free_disk_bytes_to_perform_insert和min_free_disk_perform_to_throw_insert,用于防止在磁盘接近写满时继续执行插入操作。#69755 (Marco Vilas Boas)。 - 内嵌的设置文档会比网站上的文档更加详细和完整。这是让网站文档始终从源代码自动生成之前的第一步。这将带来深远影响: - 可以保证涵盖每一个设置; - 默认值不可能过时; - 我们可以为每个 ClickHouse 版本生成对应的文档; - 即使在无法访问互联网的情况下,服务器本身也可以展示这些文档。
- 允许在函数
replace中使用空 needle 参数,其行为与 PostgreSQL 保持一致。 #69918 (zhanglistar)。 - 在
replaceRegexp*函数中允许 needle 为空。 #70053 (zhanglistar). - 根据存储策略,会在
data/database_name/目录中创建指向表数据实际路径的符号链接,而不再指向默认磁盘上的store/...目录。#61777(Kirill)。 - 从
JSON解析Enum字段时,包含整数值的字符串会被解释为对应的Enum元素。此更改解决了 #65119。#66801(scanhex12)。 - 允许对空字符串执行
TRIM的LEADING或TRAILING操作,并将其视为空操作(no-op)。关闭 issue #67792。#68455(Peter Nguyen)。 - 提升
cast(timestamp as String)与 Spark 的兼容性。 #69179 (Wenzheng Liu). - 当
enable_analyzer设置为true时,始终使用新的 analyzer 来计算常量表达式。支持在无需使用SELECT查询来计算常量表达式的情况下,对executable表函数的参数进行计算。#69292(Dmitry Novik)。 - 添加
enable_secure_identifiers设置,以禁止包含特殊字符的标识符。#69411 (tuanpach)。 - 添加
show_create_query_identifier_quoting_rule,用于定义在SHOW CREATE TABLE查询结果中标识符加引号的行为。可选值:user_display:当标识符是关键字时加引号。when_necessary:当标识符是{"distinct", "all", "table"}之一且可能导致歧义时(例如作为列名、字典属性名)加引号。always:始终为标识符加引号。 #69448 (tuanpach)。 - 改进访问实体依赖关系的恢复逻辑 #69563 (Vitaly Baranov)。
- 当你运行
clickhouse-client或其他 CLI 应用程序时,如果由于服务器过载导致启动缓慢,而你已经开始输入查询(例如SELECT),旧版本会在打印欢迎信息之前,先把终端回显中剩余的内容输出出来,比如显示为SELECTClickHouse local version 24.10.1.1.,而不是ClickHouse local version 24.10.1.1.。现在这个问题已经修复。此更改关闭了 #31696。#69856(Alexey Milovidov)。 - 向
system.replicas表添加新列readonly_duration,以便在告警中区分真正的只读副本和哨兵副本。#69871 (Miсhael Stetsyuk)。 - 将
join_output_by_rowlist_perkey_rows_threshold设置项的类型更改为无符号整数。 #69886 (kevinyhzou)。 - 改进 OpenTelemetry span 日志记录,使其包含查询设置。 #70011 (sharathks118).
- 当 lambda 结果类型不符合预期时,为高阶数组函数添加诊断信息。 #70093 (ttanay).
- Keeper 改进:在集群变更期间减少锁操作。 #70275 (Antonio Andelic).
- 在
SHOW GRANTS命令中添加WITH IMPLICIT和FINAL关键字。修复与隐式授权相关的一个小问题:#70094。#70293(pufit)。 - 对 MergeTree 设置遵循
compatibility参数。compatibility的取值在服务器启动时从defaultprofile 中获取,并据此调整默认的 MergeTree 设置。之后对compatibility设置的更改不会影响 MergeTree 设置。#70322(Nikolai Kochetov)。 - 在服务器间通信发生错误时,避免将大体积的 HTTP 响应体写入日志,以防止日志刷屏。 #70487 (Vladimir Cherkasov).
- 添加了新的设置
max_parts_to_move,用于控制一次最多可以移动的数据部分数量。#70520 (Vladimir Cherkasov)。 - 限制特定日志消息的频率。#70601 (Alexey Milovidov).
- 在客户端中,对带有
PART限定符的CHECK TABLE的格式化不正确。#70660 (Alexey Milovidov)。 - 支持使用原生 Parquet 写入器写入列索引和偏移索引。#70669 (LiuNeng).
- 支持使用 joda 语法解析
DateTime64的微秒和时区(“joda” 是一个流行的 Java 日期时间库,“joda 语法” 指该库的日期时间格式风格)。 #70737 (kevinyhzou)。 - 更改了判定云存储是否支持批量删除的方法。#70786 (Vitaly Baranov)。
- 在原生读取器中添加对 Parquet page v2 的支持。#70807(Arthur Passos)。
- 增加了对同时设置了
storage_policy和disk的表的检查。同时,在使用disk设置时,增加了对新旧存储策略兼容性的检查。#70839(Kirill)。 - 添加
system.s3_queue_settings和system.azure_queue_settings。 #70841 (Kseniia Sumarokova). - 函数
base58Encode和base58Decode现在接受FixedString类型的参数。示例:SELECT base58Encode(toFixedString('plaintext', 9));。#70846(Faizan Patel)。 - 为 part log 的每种记录类型添加
partition列。之前仅对某些记录设置了该列。此更改解决了 #70819。#70848(Alexey Milovidov)。 - 将
MergeStart和MutateStart事件添加到system.part_log中,有助于合并操作的分析和可视化。#70850(Alexey Milovidov)。 - 添加一个关于已合并源数据片段数量的 profile 事件,用于在生产环境中监控 MergeTree 的扇出度。 #70908 (Alexey Milovidov)。
- 后台下载到文件系统缓存功能已重新启用。#70929 (Nikita Taranov).
- 新增一个名为
Trivial的合并选择器算法,仅供专业场景使用。它的效果不如Simple合并选择器。#70969 (Alexey Milovidov)。 - 支持原子性
CREATE OR REPLACE VIEW。 #70536 (tuanpach) - 为聚合函数
windowFunnel新增strict_once模式,以防止同一事件在同时满足多个条件时被重复计数,关闭 #21835。#69738(Vladimir Cherkasov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 将配置更新应用到全局上下文对象中,可修复诸如 #62308 之类的问题。#62944(Amos Bird)。
- 修复
ReadSettings未使用用户设定值、而只使用默认值的问题。#65625(Kseniia Sumarokova)。 - 修复在使用有符号参数时
sumMapFiltered中的类型不匹配问题。#58408 (Chen768959)。 - 修复在传入可选时区参数时
toHour等转换函数的单调性问题。#60264 (Amos Bird)。 - 放宽对
Merge表的supportsPrewhere检查。这修复了 #61064。该检查在 #60082 中被不必要地过度收紧了。#61091(Amos Bird)。 - 修复对
use_concurrency_control设置的处理方式,使concurrent_threads_soft_limit_num限制能够被正确执行。由于之前该功能存在问题,此更改使并发控制默认启用。#61473(Sergei Trifonov)。 - 修复当
IS NULL检查被任意其他函数(例如NOT)包裹时,JOIN ON子句优化不正确的问题,该问题可能导致结果错误。已关闭 #67915。#68049(Vladimir Cherkasov)。 - 防止执行会导致表的
CREATE查询无效的ALTER查询。#68574 (János Benjamin Antal)。 - 修复
negate(-) 和NOT函数在处理元组和数组时 AST 格式化不一致的问题。#68600(Vladimir Cherkasov)。 - 修复了在反序列化过程中将不完整类型插入到
Dynamic中的问题。这可能会导致参数越界(Parameter out of bound)错误。#69291 (Pavel Kruglov). - 零拷贝复制是实验性特性,不应在生产环境中使用:修复在启用零拷贝的 ReplicatedMergeTree 中执行
restore replica后出现的无限循环问题。 #69293 (MikhailBurdukov)。 - 将存储引擎
S3Queue中processing_threads_num的默认值恢复为 CPU 核心数。#69384(Kseniia Sumarokova)。 - 在将嵌套的 repeated protobuf 字段序列化/反序列化到嵌套列时跳过 try/catch 流程(修复 #41971)。#69556(Eliot Hautefeuille)。
- 修复在 PostgreSQL 引擎中向 FixedString 类型列插入数据时发生的崩溃。#69584 (Pavel Kruglov)。
- 修复在执行
create view t as (with recursive 42 as ttt select ttt);时出现的崩溃。#69676 (Han Fei). - 修复了当值类型为 DateTime64 时,
maxMapState抛出 “Bad get” 异常的问题。#69787 (Michael Kolupaev). - 通过将
useDefaultImplementationForLowCardinalityColumns重写为返回true,修复LowCardinality列上getSubcolumn的问题。 #69831 (Miсhael Stetsyuk). - 修复在执行分布式表
DROP失败后导致分布式发送永久阻塞的问题。#69843 (Azat Khuzhin). - 修复包含 WITH FILL 且键为 NaN 的无法取消的查询问题。此更改关闭了 #69261。#69845(Alexey Milovidov)。
- 将 analyzer 的默认值修正为旧的兼容性值。#69895 (Raúl Marín).
- 在删除旧表的过程中执行 CREATE OR REPLACE VIEW 时,不再检查依赖关系。此前,如果要重新创建的视图存在依赖它的表,CREATE OR REPLACE 查询会失败。#69907 (Pavel Kruglov)。
- 与 Decimal 相关的更新。修复了 #69730。#69978(Arthur Passos)。
- 现在,
DEFINER/INVOKER也适用于参数化视图。#69984(pufit)。 - 修复对视图 DEFINER 的解析。#69985 (pufit).
- 修复了一个错误:在使用
Date或Date32参数的查询中,时区可能导致查询结果发生变化。#70036 (Yarik Briukhovetskyi)。 - 修复了在包含嵌套视图并带有
WHERE条件的查询中出现的Block structure mismatch错误。修复了 #66209。#70054(Nikolai Kochetov)。 - 在计算
tuple函数时,避免在不同命名元组之间重复使用列。此更改修复了 #70022。#70103(Amos Bird)。 - 修复在区间中替换字面量时错误触发的 LOGICAL_ERROR。 #70122 (Pablo Marcos).
- 在执行 ALTER TABLE MODIFY COLUMN/QUERY 时检查 Nullable(Nothing) 类型,以避免出现包含此数据类型的表。#70123 (Pavel Kruglov).
- 为非法查询
JOIN ... ON *提供适当的错误消息,关闭 #68650。 #70124(Vladimir Cherkasov)。 - 修复在跳过索引时产生的错误结果。#70127 (Raúl Marín).
- 修复 ColumnObject/ColumnTuple decompress 方法中的数据竞争问题,该问题可能导致释放后仍然使用堆内存(heap use after free)。#70137(Pavel Kruglov)。
- 修复在对 Dynamic 类型的列执行 ALTER COLUMN 时可能出现的挂起问题。 #70144 (Pavel Kruglov).
- 现在,ClickHouse 会将更多错误视为可重试,并且在出现此类错误时不会将数据部分标记为损坏。 #70145 (alesapin).
- 在为 JSON 子列创建 Dynamic 类型时,现在会使用正确的
max_types参数。#70147(Pavel Kruglov)。 - 修复使用 bcrypt 密码认证方式的用户,其密码会显示在
system.query_log中的问题。 #70148 (Nikolay Degterinsky). - 修复原生接口(InterfaceNativeSendBytes)的事件计数器。#70153(Yakov Olkhovskiy)。
- 修复与 JSON 列相关的潜在崩溃问题。 #70172 (Pavel Kruglov).
- 修复
arrayMin和arrayMax的多个问题。 #70207 (Raúl Marín). - 使 JSON 类型解析器遵循 allow_simdjson 设置。 #70218 (Pavel Kruglov).
- 修复在创建包含两个
SELECT且使用INTERSECT的物化视图时发生的空指针解引用错误,例如:CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);。#70264(Konstantin Bogdanov)。 - 不要使用启动脚本修改全局设置。以前,在启动脚本中更改某个设置会导致它在全局范围内被修改。 #70310 (Antonio Andelic).
- 修复在减小
max_types参数时对Dynamic类型执行 ALTER 时可能导致服务器崩溃的问题。#70328 (Pavel Kruglov). - 修复由于错误使用 WITH FILL 而导致的崩溃。#70338(Raúl Marín)。
- 修复
SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf中可能出现的 use-after-free 问题。 #70358 (Azat Khuzhin). - 修复在对 JSON 子对象的子列执行 GROUP BY 时出现的崩溃。 #70374 (Pavel Kruglov).
- 如果 part 没有任何行,则不要为垂直合并预取 part。 #70452 (Antonio Andelic).
- 修复在
WHERE中使用 lambda 函数时的崩溃。#70464(Raúl Marín)。 - 修复在使用
Replicated数据库且在次级副本上表函数源不可用时,通过CREATE ... AS table_function(...)创建表的问题。 #70511 (Kseniia Sumarokova). - 在
wait_for_async_insert=1的情况下忽略所有异步插入的输出。修复了 #62644 中的问题。#70530(Konstantin Bogdanov)。 - 在从 system.remote_data_paths 中遍历 shadow 目录时,忽略 frozen_metadata.txt 文件。 #70590 (Aleksei Filatov)。
- 修复在未对齐的内存上创建有状态窗口函数的问题。#70631 (Raúl Marín).
- 修复了在添加具有非空默认表达式的
Array类型列后,SELECT查询和合并操作中极少见的崩溃问题。 #70695 (Anton Popov). - 对表函数 s3 执行 INSERT 操作时将会遵循查询设置。 #70696 (Vladimir Cherkasov).
- 修复在启用跳过不受支持字段时推断 protobuf 模式时出现的无限递归问题。#70697(Raúl Marín)。
- 默认情况下禁用 enable_named_columns_in_function_tuple。 #70833 (Raúl Marín).
- 修复
S3Queue表引擎在根据服务器 CPU 核心数推导processing_threads_num设置时该设置不生效的问题。#70837(Kseniia Sumarokova)。 - 规范化聚合状态中的具名元组参数。这修复了 #69732。#70853(Amos Bird)。
- 修复由于负零导致的双层哈希表中的逻辑错误。此更改关闭了 #70973。#70979(Alexey Milovidov)。
- 修复分布式和并行副本查询中
limit by和limit with ties的行为。 #70880 (Nikita Taranov)。
ClickHouse 发布 24.9,2024-09-26
向后不兼容的变更
- 现在对具名元组(named tuple)支持类似
a[b].c的表达式,同时也支持来自任意表达式的具名下标访问,例如expr().name。这对处理 JSON 很有用。本变更关闭了 #54965。在之前的版本中,形如expr().name的表达式会被解析为tupleElement(expr(), name),查询分析器会尝试查找列name,而不是对应的元组元素;而在新版本中,它被改为tupleElement(expr(), 'name')。在大多数情况下,之前的版本本来就无法正常工作,但可以想象一种极为罕见的场景,在这种场景下这一变更可能会导致不兼容:如果你把元组元素的名称存储在某个列或别名中,而该列或别名的名称与元组元素本身的名称不同:SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a。你极不可能写出这样的查询,但我们仍然必须将此变更标记为潜在的向后不兼容变更。#68435 (Alexey Milovidov)。 - 当启用
print_pretty_type_names设置时,它会在SHOW CREATE TABLE语句、formatQuery函数以及clickhouse-client和clickhouse-local的交互模式中,以更易读的形式打印Tuple数据类型。在之前的版本中,此设置仅应用于DESCRIBE查询和toTypeName。本变更关闭了 #65753。#68492 (Alexey Milovidov)。 - 不再允许在
Replicated数据库中创建表时显式指定 UUID。同样也不再允许为Replicated数据库中的 *MergeTree 表显式指定 Keeper 路径和副本名称。该变更引入了新的设置database_replicated_allow_explicit_uuid,并将database_replicated_allow_replicated_engine_arguments的类型从 Bool 更改为 UInt64。#66104 (Alexander Tokmakov)。
新功能
- 允许单个用户拥有多个身份验证方式,而不是只能有一种。支持将身份验证方式重置为最近添加的方式。如果你想在一段时间内部分实例运行在 24.8,部分实例运行在 24.9,建议在此期间将
max_authentication_methods_per_user设置为 1,以避免潜在的不兼容问题。#65277(Arthur Passos)。 - 增加对
ATTACH PARTITION ALL FROM的支持。#61987 (Kirill Nikiforov). - 添加
input_format_json_empty_as_default设置,该设置启用后,会将 JSON 输入中的空字段视为默认值。关闭 #59339。#66782(Alexis Arnaud)。 - 新增了函数
overlay和overlayUTF8,用于将字符串中的部分内容替换为另一个字符串。示例:SELECT overlay('Hello New York', 'Jersey', 11)返回Hello New Jersey。 #66933 (李扬). - 为分区级轻量级删除添加支持:
DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr;#67805 (sunny). - 为不同单位(例如秒和分钟)的
Interval数据类型值实现了比较功能,现在在比较时会将它们转换为最小公共上位类型。 #68057 (Yarik Briukhovetskyi). - 添加
create_if_not_exists设置,使 CREATE 语句默认采用IF NOT EXISTS行为。#68164 (Peter Nguyen)。 - 支持在 Azure 和本地读取
Iceberg表。#68210 (Daniil Ivanik). - 现在支持通过标签删除查询缓存条目。例如,由
SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc'创建的查询缓存条目,现在可以通过SYSTEM DROP QUERY CACHE TAG 'abc'删除。#68477(Michał Tabaszewski)。 - 为具名集合添加存储加密。#68615 (Pablo Marcos).
- 为
URL表引擎添加虚拟列_headers,关闭 #65026。#68867(flynn)。 - 添加
system.projections表,用于跟踪所有可用的 projection。#68901(Jordi Villar)。 - 新增函数
arrayZipUnaligned以实现与 Spark 的兼容性(在 Spark 中命名为arrays_zip),该函数基于原有的arrayZip,支持未对齐的数组。#69030 (李扬)。 - 为 Keeper 客户端命令行应用程序新增了
cp/mv命令,用于以原子方式复制/移动节点。#69034 (Mikhail Artemenko)。 - 为函数
arrayAUC新增参数scale(默认值:true),以便可以跳过归一化步骤(问题 #69609)。 #69717(gabrielmcg44)。
实验特性
- 新增设置
input_format_try_infer_variants,当某列/数组元素存在多个可能类型时,允许在文本格式的模式推断期间推断出Variant类型。 #63798 (Shaun Struwig). - 新增聚合函数
distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes,用于更好地分析 JSON 列中的类型内容。 #68463 (Kruglov Pavel). - 使用一致性哈希实现了一个新算法,用于确定并行副本之间 marks 分布的单位。针对不同的读取模式选择不同数量的 marks,以提升性能。 #68424 (Nikita Taranov).
- 之前在处理并行副本公告时,part 去重逻辑的算法复杂度为 O(n^2),对于具有大量 part(或分区)的表可能会耗费较长时间。此改动将复杂度降为 O(n*log(n))。 #69596 (Alexander Gololobov).
- 可刷新物化视图改进:追加模式(
... REFRESH EVERY 1 MINUTE APPEND ...)用于向现有表追加行,而不是覆盖整个表;重试机制(默认禁用,可在查询的 SETTINGS 部分配置);SYSTEM WAIT VIEW <name>查询,可等待当前正在运行的刷新完成;以及若干修复。 #58934 (Michael Kolupaev). - 新增
min_max作为一种新的(实验性)统计类型。它支持对数值列上的范围谓词进行估算,例如x < 100。 #67013 (JackyWoo). - 改进了从 Variant/Dynamic 列进行的 castOrDefault,使其在内部类型彼此完全不可转换时也能工作。 #67150 (Kruglov Pavel).
- 现在可通过 MaterializedPostgreSQL 实现对列子集的复制。修复了 issue #33748。 #69092 (Kruglov Kirill).
性能改进
- 实现了仅读取 Hive 分区所需的文件。#68963 (Yarik Briukhovetskyi).
- 在
LEFT或INNER哈希 JOIN 中,当表键在右表中是稠密时,通过按键重排右表来提升 JOIN 性能。#60341 (kevinyhzou). - 通过惰性追加行列表的方式,提升
ALL JOIN的性能。#63677 (kevinyhzou). - 在启动过程中异步加载文件系统缓存元数据,以加快重启速度(由设置
load_metadata_asynchronously控制)。#65736 (Daniel Pozo Escalona). - 对函数
array和map进行了优化,使其在处理某些常见场景时快得多。#67707 (李扬). - 对 ORC 字符串读取做了小幅优化,尤其是在列不包含
NULL时。#67794 (李扬). - 通过减少合并调度步骤的开销,提升了合并操作的整体性能。#68016 (Anton Popov).
- 当未设置 profile、未设置凭证且 IMDS 不可用时(例如在云外机器上查询公共 bucket 时),加速对 S3 的请求,从而关闭了 #52771。#68082 (Alexey Milovidov).
- 在
RowInputFormatWithNamesAndTypes中对 format reader 进行去虚函数化,以获得一定的性能提升。#68437 (李扬). - 为
uniq聚合函数在按分组键聚合时增加并行合并,以最大化 CPU 利用率。#68441 (Jiebin Sun). - 新增设置
output_format_orc_dictionary_key_size_threshold,允许用户在ORC输出格式中为字符串列启用字典编码。这有助于显著减小输出ORC文件大小并提升读取性能。#68591 (李扬). - 引入新的 Keeper 请求
RemoveRecursive,用于删除节点及其整个子树。#69332 (Mikhail Artemenko). - 通过并行向向量索引写入数据,加速向具有向量相似度索引的表插入数据。#69493 (flynn).
- 通过自适应写缓冲区大小,降低向 JSON 格式插入数据时的内存使用。JSON 列在宽 part 中创建的许多文件只包含少量数据,为它们分配 1MB 缓冲区没有意义。#69272 (Kruglov Pavel).
- 在并发哈希 JOIN 线程池中避免将线程归还到线程池中,以避免查询过度生成线程。#69406 (Duc Canh Le).
改进
- CREATE TABLE AS 现在会复制 PRIMARY KEY、ORDER BY 等子句。目前仅适用于 MergeTree 系列表引擎。#69076 (sakulali)。
- 强化了与小实体解析相关的代码库部分。发现并修复了以下(次要)错误:- 如果
DeltaLake表按 Bool 类型分区,分区值总是被解释为 false;-ExternalDistributed表在提供的地址中只使用了单个分片;以及max_threads设置及类似参数的值被打印为'auto(N)'而不是auto(N)。#52503(Alexey Milovidov)。 - 使用基于 cgroup 的指标来统计 CPU 使用情况,而不是使用系统范围的指标。#62003 (Nikita Taranov)。
- 现在对远程 S3 磁盘的 I/O 调度改为在 HTTP 套接字流级别进行(而不是在整个 S3 请求级别),以解决
bandwidth_limit限速问题。#65182 (Sergei Trifonov)。 - 函数
upperUTF8和lowerUTF8以前只能对西里尔字母进行大写/小写转换。该限制现已移除,现在可以对任意语言的字符进行大写/小写转换。例如:SELECT upperUTF8('Süden')现在返回SÜDEN。#65761 (李扬). - 当在带有投影的表上执行 lightweight delete 时,此前用户可以选择在将要执行 lightweight delete 时抛出异常(默认行为)或直接删除该投影;现在有了第三种选择:仍然执行 lightweight delete,然后重建投影。 #66169 (jsc0218)。
- 新增了两个选项(
dns_allow_resolve_names_to_ipv4和dns_allow_resolve_names_to_ipv6),以便可以按 IP 协议族允许或阻止连接。#66895 (MikhailBurdukov)。 - 在 clickhouse-client 中使是否忽略 Ctrl-Z(ignore_shell_suspend)可配置。 #67134 (Azat Khuzhin).
- 改进 JSON 输出格式中的 UTF-8 校验,即便结果数据中包含某些字节序列,也能确保生成的 JSON 仍然有效。 #67938 (mwoenker).
- 为合并和变更操作新增了 ProfileEvents 事件,以便进行更好的分析。 #68015 (Anton Popov).
- ODBC:从服务器配置中获取 http_max_tries。#68128 (Rodolphe Dugé de Bernonville)。
- 在 X.509 SubjectAltName 扩展中为用户身份添加通配符支持。#68236(Marco Vilas Boas)。
- 改进日期时间的 schema 推断。现在只有在日期时间包含小数部分时才使用
DateTime64,否则使用常规的DateTime。Date/DateTime 的推断现在更加严格,尤其是在date_time_input_format='best_effort'时,以避免在某些边缘场景下从字符串中错误推断日期时间。#68382(Kruglov Pavel)。 - 删除了字典中命名集合的旧实现,并将其替换为新的实现,使得可以在字典中使用通过 DDL 创建的命名集合。关闭了 #60936 和 #36890。#68412(Kseniia Sumarokova)。
- 对外部 HTTP 认证器使用 HTTP/1.1,而不是默认设置的 HTTP/1.0。#68456(Aleksei Filatov)。
- 新增了一组用于线程池内部观测的指标,以便更深入地了解线程池的性能和行为。 #68674 (filimonov).
- 使用
Values格式的异步插入现在支持查询参数。#68741(Anton Popov)。 - 在
dateTrunc和toStartOfInterval中支持Date32。#68874 (LiuNeng). - 在
system.processors_profile_log中新增plan_step_name和plan_step_description列。#68954(Alexander Gololobov)。 - 为嵌入式字典增加西班牙语支持。#69035(Vasily Okunev)。
- 在简短的错误信息中添加 CPU 架构。#69037(Konstantin Bogdanov)。
- 如果在重试过程中无法建立新的 Keeper 连接,查询将更快失败。 #69148 (Raúl Marín).
- 更新 Database Factory,使用户自定义的数据库引擎可以具有参数、设置以及表级覆盖(类似于 StorageFactory)。#69201 (NikBarykin)。
- 在用于将所有外部表引擎和函数替换为
Null引擎(restore_replace_external_engines_to_null、restore_replace_external_table_functions_to_null设置)的恢复模式下,如果表包含 SETTINGS,则会失败。现在在这种情况下会从表定义中移除相应设置,从而可以恢复此类表。#69253 (Ilya Yatsishin). - CLICKHOUSE_PASSWORD 已在 clickhouse 镜像的 entrypoint 脚本中针对 XML 正确转义。#69301 (aohoyd)。
- 允许
arrayZip/arrayZipUnaligned接受空参数,就像concat在 https://github.com/ClickHouse/ClickHouse/pull/65887 中所做的那样。这是为了在 Gluten CH Backend 中与 Spark 保持兼容。#69576(李扬)。 - 支持 Keeper 内部通信的更高级 SSL 选项(例如使用密码短语保护的私钥)。#69582 (Antonio Andelic)。
- 对于包含许多数据片段或分区的大表,索引分析可能会花费相当长的时间。此更改应当使得可以在该阶段终止开销较大的查询。 #69606 (Alexander Gololobov).
- 在
gcs表函数中对敏感信息进行脱敏处理。#69611(Vitaly Baranov)。 - 在会减少行数的合并过程中重建投影。 #62364 (cangyin).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复在实验性且不受支持的 MaterializedPostgreSQL 引擎中,当 PostgreSQL 数据库名包含 "-" 时执行 ATTACH TABLE 失败的问题。#62730 (takakawa)。
- 修复了在实验性且完全不受支持的 MaterializedPostgreSQL 引擎中,当 adnum 排序异常时与生成列相关的错误 #63161。修复了在实验性且完全不受支持的 MaterializedPostgreSQL 引擎中,当表中存在生成列时,
id列以nextval表达式作为默认值所导致的错误。修复了在删除名称包含除[a-z1-9-]以外其他符号的 publication 时出现的错误。#67664 (Kruglov Kirill)。 - Storage Join 现在支持左表中的 Nullable 列,关闭 #61247。#66926(vdimir)。
- 在使用并行副本(同时分发查询)且
IN运算符中包含向 Decimal() 的转换时,查询结果可能不正确。该缺陷是在引入新的 analyzer 后出现的。#67234 (Igor Nikonov)。 - 修复
ALTER MODIFY ORDER BY导致元数据不一致的问题。 #67436 (iceFireser). - 修复函数
fromModifiedJulianDay的上限。本应为9999-12-31,却被错误地设置为9999-01-01。#67583(PHO)。 - 修复在执行
IN查询时索引不在元组起始位置的问题。#67626 (Yarik Briukhovetskyi)。 - 修复
RoleCache中的过期处理。 #67748 (Vitaly Baranov). - 修复由于向视图刷新延迟而导致窗口视图数据块缺失的问题。 #67983 (Raúl Marín).
- 修复由于日期格式不正确导致的 MSan 问题。#68105 (JackyWoo).
- 修复了在 Parquet 过滤时,当文件中的数据类型与查询中请求的数据类型存在较大差异时导致的崩溃问题(例如
... FROM file('a.parquet', Parquet, 'x String'),但文件中实际为x Int64)。在没有此修复的情况下,可通过将input_format_parquet_filter_push_down设为0来规避该问题。 #68131 (Michael Kolupaev)。 - 修复在 #67091 中引入的
lag/lead函数崩溃问题。#68262 (lgbo). - 尝试修复在查询被取消时 Postgres 崩溃的问题。#68288 (Kseniia Sumarokova)。
- 在 https://github.com/ClickHouse/ClickHouse/pull/61984 之后,
schema_inference_make_columns_nullable=0在 Parquet/Arrow 格式中仍然可能将列推断为Nullable。该变更不向后兼容,用户注意到了行为上的变化。此 PR 使schema_inference_make_columns_nullable=0恢复为之前的行为(不会推断出任何 Nullable 列),并为该设置引入了新的值auto,仅当数据中包含可空性信息时才会将列推断为Nullable。#68298(Kruglov Pavel)。 - 修复了 #50868。在分布式查询中,嵌套子查询返回的较小 DateTime64 常量值被错误地转换为 Null,从而导致报错以及可能产生错误的查询结果。#68323(Shankar)。
- 修复查询
SYSTEM SYNC REPLICA中缺少的同步副本模式。#68326 (Duc Canh Le). - 修复键条件中的问题。 #68354 (Han Fei).
- 修复在删除或重命名被 LDAP 外部用户目录使用的角色时出现的崩溃问题。#68355 (Andrey Zvonov).
- 修复
system.view_refreshes中 Progress 列值大于 1 的问题 #68377。#68378(megao)。 - 正确处理正则表达式标志位。 #68389 (Han Fei).
- PostgreSQL 风格的转换运算符(
::)即使在 SQL 风格的十六进制和二进制字符串字面量上也能正确工作(例如,SELECT x'414243'::String)。此更改修复了 #68324。#68482(Alexey Milovidov)。 - 针对 https://github.com/ClickHouse/ClickHouse/pull/68131 的一个小补丁。#68494(Chang chen)。
- 修复 #68239 中的
SAMPLE n,其中 n 为整数。#68499(Denis Hananein)。 - 修复在两组分布的样本量不相等时
mann-whitney-utest中的缺陷。 #68556 (Han Fei). - 在非预期重启后,由于对被损坏 part 所覆盖的 part 处理异常,导致无法启动 ReplicatedMergeTree 的复制流程。#68584 (baolin)。
- 修复在将函数
sipHash64Keyed、sipHash128Keyed或sipHash128ReferenceKeyed应用于空数组或空元组时会触发LOGICAL_ERROR的问题。#68630 (Robert Schulze)。 - 在为多列建立索引时,由于在不同列之间没有重置
row_id,全文索引可能会错误地过滤掉属于其他列的行。复现步骤见 tests/queries/0_stateless/03228_full_text_with_multi_col.sql。若无此修复,则会出现该问题。#68644 (siyuan). - 修复在创建 Replicated 表时,
replica_name中包含无效字符 '\t' 和 '\n' 的问题,该问题会导致在 LogEntry 中对 'source replica' 的解析不正确。参见 issue #68640。#68645(Zhigao Hong)。 - 已重新在分布式表中提供虚拟列
_table和_database。这些虚拟列在 24.3 版本之前一直可用。#68672(Anton Popov)。 - 修复在 Variant 列重排期间可能出现的
Size of permutation (0) is less than required (...)错误。#68681 (Kruglov Pavel). - 修复因新增 JSON 列导致的潜在错误
DB::Exception: Block structure mismatch in joined block stream: different columns:。#68686(Kruglov Pavel)。 - 修复在函数
sipHash(64/128)Keyed中,对键为数组的map进行哈希时,与物化常量键相关的问题。 #68731 (Salvatore Mesoraca). - 让
ColumnsDescription::toString使用同一IAST::FormatState对象来格式化每一列,从而使写入磁盘和 ZooKeeper 的列元数据保持统一。#68733(Miсhael Stetsyuk)。 - 修复在使用 grouping sets 时合并聚合数据的方式。 #68744 (Nikolai Kochetov).
- 修复在创建
replicated merge tree、修改列并执行modify statistics时出现的逻辑错误。 #68820 (Han Fei). - 修复在分析器中从子查询解析动态子列的问题。 #68824 (Kruglov Pavel).
- 修复 DeltaLake 中复杂类型元数据的解析。关闭 #68739。#68836(Kseniia Sumarokova)。
- 修复了异步插入在以下情况下的问题:在插入之后但在刷新到表之前,通过
ALTER ADD/MODIFY COLUMN查询更改了表的元数据。 #68837 (Anton Popov). - 修复在数组中传递空元组时触发的意外异常。这修复了 #68618。#68848(Amos Bird)。
- 修复对纯元数据 MUTATIONS 命令的解析问题。 #68935 (János Benjamin Antal).
- 修复在合并 anyHeavy 状态时可能产生的错误结果。 #68950 (Raúl Marín).
- 修复了在启用
optimize_functions_to_subcolumns设置时向物化视图写入数据的问题。 #68951 (Anton Popov). - 不要在 const Dynamic 列方法中使用序列化缓存。这可能会导致使用未初始化的值,甚至在聚合时引发竞态条件。#68953 (Kruglov Pavel).
- 修复了在解析 JSON 类型时,在某些情况下本应插入默认值
null却导致的解析错误。 #68955 (Kruglov Pavel)。 - 修复在某些压缩响应中未发送
Content-Encoding的问题。 #64802. #68975 (Konstantin Bogdanov). - 在某些情况下,路径被错误拼接,导致其中包含
//片段,现已通过对路径进行规范化来解决该问题。 #69066 (Yarik Briukhovetskyi). - 修复当异步插入为空时的逻辑错误。#69080 (Han Fei).
- 修复了在取消查询期间,clickhouse-client 中进度指示器的数据竞争问题。#69081 (Sergei Trifonov)。
- 修复了一个 Bug:在使用余弦距离作为距离函数时,未能利用向量相似度索引(目前为实验性功能)。 #69090 (flynn)。
- 此更新修复了这样一个问题:在初始创建过程中服务器发生故障后,再次尝试创建 Replicated 数据库时可能会报错。#69102(Miсhael Stetsyuk)。
- 当
input_format_csv_try_infer_numbers_from_strings = 1时,不再在 CSV 中从 String 推断 Bool 类型,因为我们不允许从字符串读取 bool 值。#69109(Kruglov Pavel)。 - 修复在启用
--multiquery时客户端对EXPLAIN AST INSERT查询的解析错误。#69123 (wxybear). - 在使用并行副本的查询中,子查询中的
UNION子句处理不正确,导致出现 LOGICAL_ERRORDuplicate announcement received for replica。 #69146 (Igor Nikonov)。 - 修复在 s3Cluster 中传递 structure 参数的问题。此前,在将查询发送到 s3Cluster 中的副本时,列的
DEFAULT默认表达式可能会被丢弃。#69147 (Kruglov Pavel)。 - 在将表达式转换为目标类型时,遵循 Values 格式中的格式设置。#69149 (Kruglov Pavel).
- 修复
clickhouse-client --queries-file对于只读用户的行为(此前会因Cannot modify 'log_comment' setting in readonly mode而失败)。 #69175 (Azat Khuzhin). - 修复在通过管道将
clickhouse-client传递给提前退出的进程时出现的数据竞争问题。 #69186 (vdimir). - 修复 JSON/Dynamic 类型中
uniq和GROUP BY结果不正确的问题。#69203 (Kruglov Pavel)。 - 修复异步插入时的 INFILE 格式检测。如果在 FORMAT 子句中未显式定义格式,则可以根据 INFILE 的文件扩展名自动检测格式。#69237 (Julia Kartseva).
- 在此问题之后,生产环境中出现了相当多的表副本,它们的
metadata_version节点值为0,但与对应表的metadata节点版本不一致。这会导致在这些副本上执行的alter查询失败。#69274(Miсhael Stetsyuk)。 - 将 Dynamic 类型标记为不安全的主键类型,以避免在使用 Fields 时出现问题。 #69311 (Kruglov Pavel).
- 改进访问实体相关依赖的恢复。 #69346 (Vitaly Baranov).
- 修复在为插入操作获取连接时,当所有连接尝试都失败时出现的未定义行为。#69390(Pablo Marcos)。
- 关闭 #69135。如果我们尝试在
CROSS JOIN中复用已 join 的数据,但这种情况目前在 ClickHouse 中不会发生。最好在reuseJoinedData中保留have_compressed。#69404(lgbo)。 - 当参数为稀疏列时,使
materialize()函数返回完整的列。#69429 (Alexander Gololobov). - 修复了函数
sqidDecode中的LOGICAL_ERROR(#69450)。#69451(Robert Schulze)。 - 针对 24.6 中 s3queue 问题的快速修复,或在 Replicated 数据库中创建查询。#69454 (Kseniia Sumarokova).
- 修复了在
INSERT INTO ... SELECT或CREATE TABLE AS SELECT查询中进行合并操作时,内存占用过高的问题。#69469 (Yarik Briukhovetskyi)。 - 在表名中包含点号的情况下,
SHOW COLUMNS和SHOW INDEX语句现在可以正常工作。#69514 (Salvatore Mesoraca)。 - 现在不允许对 overflow 模式不等于 'throw' 的查询使用查询缓存。这可以防止可能被截断且不正确的查询结果被存入查询缓存中(问题 #67476)。#69549(Robert Schulze)。
- 在移动到
prewhere时保持条件的原始顺序。此前顺序可能会被打乱,在顺序很重要的情况下可能导致查询失败。#69560 (Kruglov Pavel). - 在出现 ZNOAUTH 错误后,修复 Keeper 中多请求的预处理逻辑。#69627 (Antonio Andelic)。
- 修复在创建新副本时,
DatabaseReplicated中由于带有WHERE子句的 TTL 可能导致的METADATA_MISMATCH。#69736(Nikolay Degterinsky)。 - 修复
StorageS3(Azure)Queue设置中的tracked_file_ttl_sec。我们以键tracked_file_ttl_sec写入到 Keeper,但读取时却使用了tracked_files_ttl_sec,这是一个拼写错误。#69742(Kseniia Sumarokova)。 - 在 gethyperrectangleforrowgroup 中使用 tryconvertfieldtotype。#69745(Miсhael Stetsyuk)。
- 回滚 “Fix prewhere without columns and without adaptive index granularity (almost w/o anything)” 更改。由于回滚了这些更改,在读取由旧版本的 ClickHouse(推测为 2021 年或更早的版本)生成的数据部分时,可能会出现一些错误。#68897(Alexander Gololobov)。
ClickHouse 24.8 LTS 版本,2024-08-20
向后不兼容的变更
clickhouse-client和clickhouse-local现在默认使用多查询模式(而不是单查询模式)。例如,clickhouse-client -q "SELECT 1; SELECT 2"现在可以正常工作,而之前用户必须添加--multiquery(或-n)。--multiquery/-n开关已变得多余。多查询语句中的 INSERT 查询会根据其 FORMAT 子句进行特殊处理:如果 FORMAT 为VALUES(最常见的情况),则 INSERT 语句的结束由查询末尾的分号;表示。对于所有其他 FORMAT(例如CSV或JSONEachRow),INSERT 语句的结束由查询末尾的两个换行符\n\n表示。 #63898(FFish)。- 在先前版本中,可以通过在数据类型名称后附加
WithDictionary来使用LowCardinality数据类型的另一种语法。这是一个最初的工作实现,从未被文档化或公开使用。现在已被弃用。如果你使用了这种语法,必须对表执行 ALTER,并将数据类型重命名为LowCardinality。 #66842(Alexey Milovidov)。 - 修复在将存储
Buffer与分布式目标表一起使用时的逻辑错误。这是一个向后不兼容的变更:如果在查询中同一个表出现多次(例如自连接),使用Buffer与分布式目标表的查询可能会停止工作。 #67015(vdimir)。 - 在先前版本中,针对基于 Gamma 函数的随机分布函数(例如卡方分布、Student t 分布、Fisher 分布),当传入接近零的负参数时,会导致长时间计算或无限循环。在新版本中,使用零或负参数调用这些函数将抛出异常。此变更修复了 #67297。 #67326(Alexey Milovidov)。
- 系统表
text_log现在默认启用。此变更与先前版本完全兼容,但你可能会注意到本地磁盘的使用量略有增加(该系统表仅占用极少量磁盘空间)。 #67428(Alexey Milovidov)。 - 在先前版本中,当被要求生成非常大的数组时,
arrayWithConstant可能会很慢。在新版本中,它被限制为每个数组最多 1 GB。此变更修复了 #32754。 #67741(Alexey Milovidov)。 - 修复 REPLACE 修饰符的格式(禁止省略括号)。 #67774(Azat Khuzhin)。
- 在 #68349 中回溯引入:重新实现
Dynamic类型。现在,当动态数据类型的数量达到上限时,新类型不会再被转换为 String,而是以二进制编码数据类型的形式存储在一个特殊的数据结构中。现在,曾经插入到Dynamic列中的任何类型都可以作为子列从中读取。 #68132(Kruglov Pavel)。
新功能
- 新增了一个
MergeTree设置项deduplicate_merge_projection_mode,用于在合并期间(针对特定引擎)以及执行OPTIMIZE DEDUPLICATE查询时控制 projection 的处理方式。支持的选项包括:throw(当 projection 对 *MergeTree 引擎系列不完全受支持时抛出异常)、drop(如果 projection 本身无法以一致的方式合并,则在合并过程中移除该 projection)以及rebuild(从头重建 projection,此操作开销较大)。#66672 (jsc0218). - 为 S3 表引擎添加
_etag虚拟列。修复 #65312。#65386(skyoct)。 - 为查询缓存添加了标记(命名空间)机制。具有不同标记的相同查询在查询缓存中会被视为不同。例如:
SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc'和SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def'现在会在查询缓存中创建不同的查询缓存条目。#68235 (sakulali). - 在包含左右两侧表列的不等式条件(例如
t1.y < t2.y)下,支持更多 JOIN 严格性变体(LEFT/RIGHT SEMI/ANTI/ANY JOIN)(参见设置allow_experimental_join_condition)。 #64281 (lgbo). - 为不同引擎(
File、URL、S3、AzureBlobStorage、HDFS)解析 Hive 风格分区。Hive 风格分区将数据组织到分区子目录中,从而更高效地查询和管理大规模数据集。目前,它只会创建具有相应名称和数据的虚拟列。后续的 PR 将引入相应的数据过滤(以提升性能)。#65997(Yarik Briukhovetskyi)。 - 新增函数
printf以兼容 Spark(也可以继续使用现有的format函数)。#66257(李扬)。 - 添加选项
restore_replace_external_engines_to_null和restore_replace_external_table_functions_to_null,用于将 external engines 和 table_engines 替换为Null引擎,这在测试中会很有用。该功能应适用于 RESTORE 和显式建表。 #66536 (Ilya Yatsishin). - 新增对使用函数
readWKTLineString读取WKT格式MULTILINESTRING几何类型的支持。 #67647 (Jacob Reckhard). - 新增一个名为
fuzzQuery的表函数。此函数允许对给定的查询字符串进行随机变换。示例:SELECT query FROM fuzzQuery('SELECT 1') LIMIT 5;。#67655(pufit)。 - 新增查询语句
ALTER TABLE ... DROP DETACHED PARTITION ALL,用于删除所有已分离的分区。#67885 (Duc Canh Le)。 - 在启用新的设置项
rows_before_aggregation时,将统计信息rows_before_aggregation_at_least添加到查询响应中。该统计量表示聚合前读取的行数。在分布式查询场景下,当在没有limit的情况下使用group by或max聚合函数时,rows_before_aggregation_at_least可以反映被查询命中的行数。#66084 (morning-color)。 - 支持对
Join表执行OPTIMIZE查询,以减少其内存占用。#67883 (Duc Canh Le)。 - 如果在 URL 中添加
&run=1,即可在 Play 中立即执行查询 #66457 (Aleksandr Musorin)。
实验特性
- 实现新的
JSON数据类型。#66444 (Kruglov Pavel). - 新增
TimeSeries表引擎。#64183 (Vitaly Baranov). - 新增实验性的
Kafka存储引擎,用于将 offset 存储在 Keeper 中,而不是依赖将其提交到 Kafka。这样可以使从队列消费与向 ClickHouse 表提交数据之间实现原子性。#57625 (János Benjamin Antal). - 对并行副本使用自适应读任务大小计算方法(自适应指其取决于读取列的大小)。#60377 (Nikita Taranov).
- 新增统计类型
count_min(count-min sketches),为诸如col = 'val'之类的等值谓词提供选择性估计。支持的数据类型包括字符串、日期、日期时间以及数值类型。#65521 (JackyWoo).
性能改进
- 将设置
optimize_functions_to_subcolumns默认启用。#68053 (Anton Popov). - 将
plain_rewritable磁盘目录元数据存储在__meta布局中,与对象存储中的 MergeTree 数据分离。将plain_rewritable磁盘移至扁平目录结构。#65751 (Julia Kartseva). - 通过为所有子列预先保留所需内存,改进对
String/Array/Map/Variant/Dynamic类型的列合并(发生在 INSERT 查询中的操作)。#67043 (Kruglov Pavel). - 加速
SYSTEM FLUSH LOGS,并在关闭时刷新日志。#67472 (Sema Checherinda). - 通过减少合并调度阶段的开销,提升合并操作的整体性能。#68016 (Anton Popov).
- 加快
DROP DATABASE查询中删除表的速度,将database_catalog_drop_table_concurrency的默认值增加到 16。#67228 (Nikita Mikhaylov). - 在写入 ORC 时避免为数组列分配过大的容量,使 Array 列的性能提升 15%。#67879 (李扬).
- 显著加速非复制的 MergeTree 表上的变更操作(mutations)。#66911 #66909 (Alexey Milovidov).
改进
- 设置项
allow_experimental_analyzer已重命名为enable_analyzer。旧名称作为别名保留。这表明 Analyzer 不再处于 beta 阶段,已完全推广到生产环境。#66438 (Nikita Mikhaylov)。 - 改进了日期时间的模式推断。现在仅在日期时间带有小数部分时才使用 DateTime64,否则使用常规的 DateTime。对 Date/DateTime 的推断现在更加严格,尤其是在
date_time_input_format='best_effort'时,以避免在某些极端情况下从字符串推断出日期时间。 #68382 (Kruglov Pavel). - ClickHouse 服务器现在支持新的设置
max_keep_alive_requests。对于到服务器的 HTTP keep-alive 连接,它与keep_alive_timeout配合工作——如果空闲超时时间尚未过期,但通过该连接已处理的请求数已超过max_keep_alive_requests,则该连接将被服务器关闭。#61793(Nikita Taranov)。 - 高级仪表板中进行了多项改进。从而关闭了 #67697。从而关闭了 #63407。从而关闭了 #51129。从而关闭了 #61204。#67701(Alexey Milovidov)。
- 在创建 Distributed 表时,无需为 REMOTE 单独授权:对 Distributed 引擎授予权限即可。 #65419 (jsc0218)。
- 不要在 Docker 镜像中显式传入 keeper 的日志配置,以便可以在外部覆盖。#65564(Azat Khuzhin)。
- 为
BACKUP和RESTORE查询引入了use_same_password_for_base_backup设置,从而可以在受密码保护的归档中创建和从中恢复增量备份。 #66214 (Samuele)。 - 对
ATTACH查询忽略async_load_databases(此前可能会导致ATTACH在表真正被附加之前就返回)。#66240 (Azat Khuzhin)。 - 为因资源不足而被拒绝的连接添加了日志和指标。 #66410 (Alexander Tokmakov).
- 为 MongoDB 引擎提供对
UUID类型的正确支持。 #66671 (Azat Khuzhin). - 添加复制延迟和恢复时间指标。#66703 (Miсhael Stetsyuk)。
- 添加
DiskS3NoSuchKeyErrors指标。#66704 (Miсhael Stetsyuk)。 - 确保
COMMENT子句在所有表引擎上正常工作。#66832 (Joe Lynch)。 - 函数
mapFromArrays现在可以接受Map(K, V)作为第一个参数,例如:SELECT mapFromArrays(map('a', 4, 'b', 4), ['aa', 'bb'])现在可以正常工作并返回{('a',4):'aa',('b',4):'bb'}。此外,如果第一个参数是 Array,它现在也可以是Array(Nullable(T))或Array(LowCardinality(Nullable(T)))类型,只要数组中的实际值不为NULL即可。#67103(李扬)。 - 从
~/.clickhouse-local读取clickhouse-local的配置。 #67135 (Azat Khuzhin). - 将配置项
input_format_orc_read_use_writer_time_zone重命名为input_format_orc_reader_timezone,并允许用户设置读取端的时区。#67175(kevinyhzou)。 - 当 HTTP 连接在建立后立即被对端重置时,将
Socket is not connected错误的级别降低,修复 #34218。#67177(vdimir)。 - 新增从配置加载
system.dashboards仪表板的功能(设置后将覆盖默认的仪表板预设)。 #67232 (Azat Khuzhin). - SQL 中的窗口函数传统上采用 snake case 命名。ClickHouse 使用
camelCase,因此新增了别名denseRank()和percentRank()。这些新函数的调用方式与原始的dense_rank()和percent_rank()函数完全相同。snake case 和 camelCase 两种语法都仍然可用。还为每个函数新增了一个测试。本次变更关闭了 #67042。#67334 (Peter Nguyen)。 - 如果配置文件格式不是
.xml、.yml或.yaml,则自动检测其格式。如果文件以 < 开头,则可能为 XML,否则可能为 YAML。这在通过管道提供配置文件时非常有用:clickhouse-server --config-file <(echo "hello: world")。 #67391 (sakulali)。 - 函数
formatDateTime和formatDateTimeInJodaSyntax现在将其格式参数视为可选参数。若未指定,则分别假定使用格式字符串%Y-%m-%d %H:%i:%s和yyyy-MM-dd HH:mm:ss。示例:SELECT parseDateTime('2021-01-04 23:12:34')现在会返回 DateTime 值2021-01-04 23:12:34(此前会抛出异常)。#67399(Robert Schulze)。 - 如果 KeeperMap 中的 Keeper 请求因超时或连接丢失而失败,则自动重试这些请求。 #67448 (Antonio Andelic).
- 在 AArch64 Linux 构建中添加
-no-pie,以便在 ClickHouse 重启后能够正确对堆栈跟踪进行分析和符号解析。#67916 (filimonov)。 - 为合并和变更添加了 ProfileEvents 事件,以便更好地进行内部分析。 #68015 (Anton Popov).
- 删除非复制
MergeTree的不必要日志。#68238 (Daniil Ivanik)。
构建/测试/打包改进
- 集成测试中的“flaky 检查”现在会对每个测试用例进行多次运行,以在测试中发现更多问题并提升其可靠性。它使用
pytest-repeat库在同一环境下多次运行测试用例。为了通过测试,务必要在测试用例结束时清理表和其他实体。与多次单独运行 pytest 相比,这种重复运行方式要快得多,因为它只需启动一次所需的容器。#66986 (Ilya Yatsishin). - 解除在 ClickHouse 中使用 CLion 的限制,使其可以正常使用。在之前的版本中,CLion 每次按键都会冻结约一分钟。该更改关闭了 #66994。#66995 (Alexey Milovidov).
- getauxval:在使用 sanitizer 重新执行进程时,避免因较新版 Linux 内核中更高的 ASLR 随机性而导致崩溃。#67081 (Raúl Marín).
- 将部分客户端代码抽取到一个单独文件中,并且即使在调试构建中也对其应用尽可能高的优化级别。此更改关闭了:#65745。#67215 (Nikita Mikhaylov).
错误修复
- 仅与实验性的 Variant 数据类型相关。修复在 Variant + AggregateFunction 类型组合下出现的崩溃问题。#67122(Kruglov Pavel)。
- 修复 DistributedAsyncInsert 在连接为空时发生崩溃的问题。 #67219 (Pablo Marcos).
- 修复在以
tuple()作为参数时uniq和uniqTheta崩溃的问题。已关闭 #67303。#67306(flynn)。 - 修复 #66026。在
ReplaceTableNodeToDummyVisitor中避免遍历尚未解析的表函数参数。#67522(Dmitry Novik)。 - 修复了
JSONMergePatch函数中潜在的栈溢出问题。将该函数从jsonMergePatch重命名为JSONMergePatch,因为之前的命名不正确。之前的名称仍然保留以保持兼容性。改进了该函数的错误诊断。此更改关闭了 #67304。#67756(Alexey Milovidov)。 - 修复了由特制查询触发的 NULL 指针解引用错误,该错误会导致服务器在
hopEnd、hopStart、tumbleEnd和tumbleStart处崩溃。#68098(Salvatore Mesoraca)。 - 在使用子查询进行过滤时,修复了某些系统表中出现的
Not-ready Set问题。#66018 (Michael Kolupaev)。 - 修复了在执行
ALTER ADD COLUMN查询后读取子列时出现的不正确行为。#66243 (Anton Popov)。 - 修复发送到外部数据库(如
PostgreSQL等引擎)时查询中的布尔字面量。#66282 (vdimir)。 - 修复带别名的 JOIN ON 表达式的查询格式问题,例如
... JOIN t2 ON (x = y) AS e ORDER BY x应格式化为... JOIN t2 ON ((x = y) AS e) ORDER BY x。 #66312 (vdimir). - 修复
cluster()在跨服务器密钥场景下的行为(与之前一样保留初始用户)。#66364 (Azat Khuzhin). - 修复在将包含 NULL 的 Array 字段转换为 Array(Variant) 时可能出现的运行时错误。#66727 (Kruglov Pavel)。
- 修复
Context::getDDLWorker中偶发的死锁。#66843 (Alexander Gololobov)。 - 修复在未完成的 DROP 操作后创建 KeeperMap 表的问题。 #66865 (Antonio Andelic).
- 修复在恢复到
s3_plain_rewritable磁盘时出现的 broken part 错误。 #66881 (Vitaly Baranov). - 在极少数情况下,由于磁盘上存在一些异常的投影(projection),ClickHouse 可能会将某些数据分片视为损坏。现在这一问题已修复。#66898 (alesapin)。
- 修复了模式推断中无效格式检测的问题,该问题可能导致出现逻辑错误:'Format doesn't support schema inference.' #66899 (Kruglov Pavel).
- 修复在并行副本场景下取消查询时可能出现的死锁问题。 #66905 (Nikita Taranov).
- 即使设置了 database_replicated_allow_heavy_create,也禁止使用 CREATE AS SELECT。该操作在 23.12 中是无条件禁止的,但在未发布的 24.7 中,在启用该设置时被意外允许。#66980 (vdimir)。
- 在设置
max_rows_to_read限制时,从numbers表读取数据可能会错误地抛出异常。此更改修复了 #66992。#66996(Alexey Milovidov)。 - 为 lagInFrame 和 leadInFrame 窗口函数添加适当的类型转换——修复 msan 测试。#67091 (Yakov Olkhovskiy)。
- 修复了
TRUNCATE DATABASE会像DROP DATABASE查询那样停止复制的问题。#67129 (Alexander Tokmakov)。 - 在
clickhouse-local中使用独立的客户端上下文。#67133(Vitaly Baranov)。 - 修复在通过只有一个分片的
Distriburted表读取Merge表的查询中出现的错误Cannot convert column because it is non constant in source stream but must be constant in result.。 #67146 (Nikolai Kochetov)。 - 修复了在禁用
enable_order_by_all且使用并行副本(以及分布式查询)时ORDER BY all的行为。#67153 (Igor Nikonov)。 - 修复在 schema 缓存中对 input_format_max_bytes_to_read_for_schema_inference 的错误使用。#67157 (Kruglov Pavel)。
- 修复在使用单个可空键进行
GROUP BY时发生异常时,count distinct导致的内存泄漏问题。#67171 (Jet He). - 修复了一个优化错误,该错误会将 OUTER JOIN 转换为 INNER JOIN。此更改关闭了 #67156。此更改关闭了 #66447。该缺陷是在 https://github.com/ClickHouse/ClickHouse/pull/62907 中引入的。#67178(Maksim Kita)。
- 修复了错误
Conversion from AggregateFunction(name, Type) to AggregateFunction(name, Nullable(Type)) is not supported。该缺陷是由optimize_rewrite_aggregate_function_with_if优化引起的。修复了 #67112。#67229(Nikolai Kochetov)。 - 修复在使用空元组作为函数 IN 的左侧操作数时导致查询挂起的问题。#67295(Duc Canh Le)。
- 在跳过未知字段时,可以构造出嵌套层级非常深的 JSON 数据,导致栈溢出。此更改关闭了 #67292。#67324(Alexey Milovidov)。
- 修复在启动期间发生异常后附加 ReplicatedMergeTree 表时的问题。 #67360 (Antonio Andelic).
- 修复由于在
Aggregator中错误地从线程组分离而导致的段错误(segfault)。#67385 (Antonio Andelic)。 - 修复了在主键(PK)中使用非确定性函数的另一个问题。#67395(Nikolai Kochetov)。
- 修复了
bloom_filter索引在包含稍显古怪条件(例如(k=2)=(k=2)或has([1,2,3], k))的查询中导致查询失败的问题。#67423 (Michael Kolupaev). - 如果文件名/URI 含有
::但不是归档文件,则能够被正确解析。 #67433 (Antonio Andelic). - 修复
~WriteBufferFromS3中在WriteBuffer被取消时的任务等待逻辑。#67459(Kseniia Sumarokova)。 - 在 RESTORE 过程中,保护临时 part 目录不被删除。#67491 (Vitaly Baranov)。
- 修复嵌套短路求值函数的执行。#67520 (Kruglov Pavel).
- 修复
Logical error: Expected the argument №N of type T to have X rows, but it has 0。该错误可能会在使用新分析器、且在GROUP BY中包含常量表达式的远程查询中发生。#67536(Nikolai Kochetov)。 - 修复包含 NULL 的元组上的 JOIN:在使用新分析器时,如果
JOIN ON部分的元组中包含NULL,一些查询会返回不正确的结果。#67538(vdimir)。 - 在不可驱逐缓存已满时,修复对 FileCache::freeSpaceRatioKeepingThreadFunc() 的冗余重新调度。 #67540 (Kseniia Sumarokova).
- 修复通过 HTTP 接口向类流式引擎(Kafka、RabbitMQ、NATS)执行 INSERT 时的问题。 #67554 (János Benjamin Antal).
- 修复了函数
toStartOfWeek在较小的DateTime64值情况下返回错误结果的问题。#67558 (Yarik Briukhovetskyi)。 - 修复使用递归 CTE 创建视图时的问题。#67587(Yakov Olkhovskiy)。
- 修复文件系统缓存中的
Logical error: 'file_offset_of_buffer_end <= read_until_position'逻辑错误。关闭 #57508。#67623(Kseniia Sumarokova)。 - 修复了 #62282。移除了对
convertFieldToString()的调用,并添加了针对特定数据类型的序列化代码。当参数值是返回该数据类型实例的函数或表达式时,参数化视图替换在多种数据类型下会失效。 #67654 (Shankar)。 - 修复了
percent_rank的崩溃问题。将percent_rank的默认 frame 类型修改为range unbounded preceding and unbounded following。现在会考虑IWindowFunction的默认 window frame,SQL 中未定义 window frame 的窗口函数也可以被正确地归入不同的WindowTransfomer。#67661 (lgbo). - 修复在使用 UNION 时重新加载 SQL UDF 的问题。之前,重启服务器可能会导致 UDF 失效。#67665(Antonio Andelic)。
- 修复在包含 Tuples 和 Maps 的
if函数中,使用实验性 Variant 类型并启用设置use_variant_as_common_type时可能出现的逻辑错误 "Unexpected return type from if"。#67687 (Kruglov Pavel)。 - 由于 Linux 内核中的一个 bug,可能会导致查询在
TimerDescriptor::drain中挂起。此更改关闭了 #37686。#67702(Alexey Milovidov)。 - 修复
RESTORE ON CLUSTER命令的完成逻辑。 #67720 (Vitaly Baranov). - 修复在加载过程中遇到
CANNOT_SCHEDULE_TASK导致字典卡死的问题。 #67751 (Azat Khuzhin). - 像
SELECT count() FROM t WHERE cast(c = 1 or c = 9999 AS Bool) SETTINGS use_skip_indexes=1这样的查询在列c上使用 Bloom 过滤器索引时现在可以正常工作。#67781(jsc0218)。 - 修复在某些聚合无键且带有过滤条件的查询中出现的错误聚合结果,关闭 #67419。#67804 (vdimir).
- 在 ALTER ADD/MODIFY COLUMN 中对实验性/可疑数据类型进行校验。 #67911 (Kruglov Pavel).
- 修复了在分布式查询中常量折叠后
DateTime64的解析问题,关闭 #66773。#67920(vdimir)。 - 当谓词中包含非确定性函数时,修复
count()结果错误的问题。#67922 (János Benjamin Antal). - 修复了在可用 CPU 数量受限的容器化环境中,最大线程软限制的计算。 #67963 (Robert Schulze).
- 现在,如果磁盘上不存在投影但在
checksums.txt中存在,ClickHouse 不再将该数据块视为损坏。#68003 (alesapin)。 - 修复了在使用新 analyzer 执行 mutation 时,未修改 part 未被正确跳过的问题。之前在启用 analyzer 的情况下,即使根据谓词判断某个 part 不会受到 mutation 影响,该 part 中的数据仍可能会被 mutation 重写。 #68052 (Anton Popov).
- 移除了在使用
OFFSET的子查询中删除排序的错误优化。修复了 #67906。#68099(Graham Campbell)。 - 尝试修复在聚合投影优化中出现的
Block structure mismatch in AggregatingStep stream: different types问题。#68107(Nikolai Kochetov)。 - 尝试修复在取消查询时发生的 Postgres 崩溃。#68288 (Kseniia Sumarokova)。
- 修复查询
SYSTEM SYNC REPLICA中同步副本模式缺失的问题。 #68326 (Duc Canh Le).
ClickHouse 发布 24.7,2024-07-30
向后不兼容的变更
- 禁止在 Replicated 数据库中使用
CRATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ...。 #63963 (vdimir). clickhouse-keeper-client现在只接受字符串字面量形式的路径,例如ls '/hello/world',不再接受裸字符串,例如ls /hello/world。 #65494 (Alexey Milovidov).- 指标
KeeperOutstandingRequets重命名为KeeperOutstandingRequests。 #66206 (Robert Schulze). - 从
system.functions表中移除字段is_deterministic。 #66630 (Alexey Milovidov). - 函数
tuple现在会尝试在查询中构造命名元组(由enable_named_columns_in_function_tuple控制)。新增函数tupleNames,用于从元组中提取名称。 #54881 (Amos Bird). - 修改物化视图的去重机制。修复了许多类似场景:- 在目标表上:数据被拆分为 2 个或更多块,并且当这些块被并行插入时,这些块会被视为重复。- 在物化视图的目标表上:相同的数据块会被去重,这在物化视图由于执行聚合,对不同输入数据经常生成相同结果数据时会发生。- 在物化视图的目标表上:来自不同物化视图的相同数据块会被去重。 #61601 (Sema Checherinda).
- 函数
bitShiftLeft和bitShitfRight在移位位置越界时会返回错误。 #65838 (Pablo Marcos).
新功能
- 为
full_sorting_join算法添加ASOF JOIN支持。#55051 (vdimir). - 在
clickhouse-client中支持 JWT 身份验证(仅在 ClickHouse Cloud 中可用)。#62829 (Konstantin Bogdanov). - 新增 SQL 函数
changeYear、changeMonth、changeDay、changeHour、changeMinute、changeSecond。例如,SELECT changeMonth(toDate('2024-06-14'), 7)返回日期2024-07-14。#63186 (cucumber95). - 引入启动脚本,允许在启动阶段执行预配置的查询。#64889 (pufit).
- 在客户端配置中支持
accept_invalid_certificate,以便客户端可以通过安全 TCP 连接到使用自签名证书运行的服务器——可作为相应openSSL客户端设置verificationMode=none和invalidCertificateHandler.name=AcceptCertificateHandler的简写。#65238 (peacewalker122). - 新增 system.error_log,其中包含来自 system.errors 表的错误值历史记录,并定期刷新到磁盘。#65381 (Pablo Marcos).
- 添加聚合函数
groupConcat。其行为大致等同于arrayStringConcat( groupArray(column), ',')。可以接收 2 个参数:字符串分隔符以及要处理的元素个数。#65451 (Yarik Briukhovetskyi). - 添加 AzureQueue 存储引擎。#65458 (Kseniia Sumarokova).
- 新增设置,用于开启/关闭将页索引写入 Parquet 文件。#65475 (lgbo).
- 引入
logger.console_log_level服务器配置,用于控制输出到控制台的日志级别(如果已启用)。#65559 (Azat Khuzhin). - 使用表函数
file时,自动在目录路径末尾追加通配符*。#66019 (Zhidong (David) Guo). - 在非交互模式下为客户端添加
--memory-usage选项。#66393 (vdimir). - 为 clickhouse-disks 提供交互式客户端,并支持从本地目录添加本地磁盘。#64446 (Daniil Ivanik).
- 当在带有投影的表上执行轻量级删除时,用户可以选择抛出异常(默认)或删除该投影。#65594 (jsc0218).
- 新增 system 表,用于提供所有已分离表的主要信息。#65400 (Konstantin Morozov).
实验特性
- 更改
Variant数据类型的二进制序列化:新增compact模式,以避免在仅包含单一变体或仅包含 NULL 值的 granule 中多次写入相同的 discriminator。新增 MergeTree 设置use_compact_variant_discriminators_serialization,默认启用。请注意,Variant 类型仍为实验性特性,因此对序列化进行不向后兼容的变更是可以接受的。 #62774 (Kruglov Pavel). - 为 clickhouse-keeper 提供基于磁盘的后端存储支持。 #56626 (Han Fei).
- 重构 JSONExtract 函数,支持更多类型,包括实验性的 Dynamic 类型。 #66046 (Kruglov Pavel).
- 为
Variant和Dynamic子列增加对 null map 子列的支持。 #66178 (Kruglov Pavel). - 修复从执行过 ALTER 操作的
Memory表中读取Dynamic子列的问题。之前如果通过 ALTER 修改了 Memory 表中 Dynamic 类型的max_types参数,后续对子列的读取可能会返回错误结果。 #66066 (Kruglov Pavel). - 在使用自定义键的并行副本时增加对
cluster_for_parallel_replicas的支持。这样可以在 MergeTree 表中使用带自定义键的并行副本。 #65453 (Antonio Andelic).
性能改进
- 将整数转字符串的算法替换为更快的实现(从修改版 amdn/itoa 更换为修改版 jeaiii/itoa)。#61661(Raúl Marín)。
- 现在会收集并缓存由
join(parallel_hash算法)创建的哈希表大小。此信息将用于在后续查询执行时为哈希表预先分配空间,从而节省哈希表扩容的时间。#64553(Nikita Taranov)。 - 通过使用缓冲机制,优化带有
ORDER BY主键且WHERE条件具有高选择性的查询。此行为由设置read_in_order_use_buffering控制(默认启用),并且可能增加查询的内存使用量。#64607(Anton Popov)。 - 提升加载
plain_rewritable元数据的性能。#65634(Alexey Milovidov)。 - 在只读磁盘上挂载表时,通过不加载过期的数据部分来减少资源占用。#65635(Alexey Milovidov)。
- 为 Set 索引支持 minmax 超矩形(hyperrectangle)。#65676(AntiTopQuark)。
- 卸载过期数据部分的主索引以降低总体内存使用量。#65852(Anton Popov)。
- 当模式较为简单(即不包含元字符、模式类、标志、分组字符等)时,
replaceRegexpAll和replaceRegexpOne函数现在会显著更快。(感谢 Taiyang Li)。#66185(Robert Schulze)。 - S3 请求:减少查询的重试等待时间,增加备份的重试次数。查询总计重试时间为 8.5 分钟、重试 100 次;备份恢复总计重试时间为 1.2 小时、重试 1000 次。#65232(Sema Checherinda)。
- 支持在查询计划中对 LIMIT 进行优化。为 PostgreSQL 存储和表函数添加 LIMIT 下推支持。#65454(Maksim Kita)。
- 改进了 ZooKeeper 的负载均衡。当前会话在可用的最优节点出现之前不会过期,即使设置了
fallback_session_lifetime。添加了对可用区(AZ)感知均衡的支持。#65570(Alexander Tokmakov)。 - DatabaseCatalog 通过使用最多
database_catalog_drop_table_concurrency个线程来更快地删除表。#66065(Sema Checherinda)。
改进
- 改进了 ZooKeeper 的负载均衡。当前会话在最优节点可用之前不会过期,即使设置了
fallback_session_lifetime。增加了对可用区感知(AZ-aware)负载均衡的支持。#65570 (Alexander Tokmakov)。 - 设置
optimize_trivial_insert_select默认是禁用的。在大多数情况下,启用它应当是有益的。不过,如果你发现INSERT SELECT变慢或者内存使用增加,可以重新启用该设置,或者执行SET compatibility = '24.6'。#58970(Alexey Milovidov)。 - 当
clickhouse-client或clickhouse-local崩溃时,打印堆栈跟踪和诊断信息。#61109 (Alexander Tokmakov)。 SHOW INDEX | INDEXES | INDICES | KEYS的结果此前是按主键列名排序的。由于这种行为不够直观,现在结果改为按这些主键列在主键中的位置进行排序。#61131 (Robert Schulze)。- 更改物化视图的去重机制。修复了许多情况,例如: 对于目标表:数据被拆分为 2 个或更多块,在这些块被并行插入时,它们会被错误地视为重复。 对于物化视图(MV)的目标表:相同的数据块会被去重,这发生在 MV 由于执行聚合操作,对不同的输入数据经常产生相同的结果数据时。 对于物化视图的目标表:来自不同 MV 的相同数据块会被去重。
- 支持读取分区的 DeltaLake 数据。通过读取元数据而非实际数据来推断 DeltaLake 模式。 #63201 (Kseniia Sumarokova).
- 在可组合协议中,TLS 层仅支持
certificateFile和privateKeyFile参数。https://clickhouse.com/docs/operations/settings/composable-protocols。#63985(Anton Ivashkin)。 - 新增 profile event
SelectQueriesWithPrimaryKeyUsage,用于表示有多少 SELECT 查询使用主键来评估 WHERE 子句。#64492 (0x01f)。 - 与
StorageS3Queue相关的修复和改进。根据服务器上物理 CPU 核心数推导出s3queue_processing_threads_num的默认值(而不是之前固定为 1)。将s3queue_loading_retries的默认值设置为 10。修复system.s3queue的异常列中可能出现的含糊错误信息 "Uncaught exception"。在出现MEMORY_LIMIT_EXCEEDED异常时不再增加重试计数。将文件提交操作移动到表数据完全插入完成之后的阶段,以避免在数据尚未插入时文件已经被提交。新增设置s3queue_max_processed_files_before_commit、s3queue_max_processed_rows_before_commit、s3queue_max_processed_bytes_before_commit、s3queue_max_processing_time_sec_before_commit,以便更好地控制提交和刷新时间。#65046 (Kseniia Sumarokova)。 - 在参数化视图函数中支持别名(仅适用于新分析器)。#65190(Kseniia Sumarokova)。
- 已更新,在
azureBlobStorage的日志中隐藏账户密钥。#65273 (SmitaRKulkarni). - 当过滤表达式是
PARTITION BY表达式的一部分时,对IN谓词执行分区剪枝。#65335 (Eduard Karacharov)。 arrayMin/arrayMax可适用于所有可比较的数据类型。#65455(pn)。- 改进了针对 cgroups v2 的内存核算,不再将页缓存占用的内存量计入其中。#65470 (Nikita Taranov)。
- 在将数据块序列化以插入 EmbeddedRocksDB 表时,避免为每一行创建格式设置。#65474 (Duc Canh Le)。
- 将
clickhouse-local提示符简化为:)。getFQDNOrHostName()在 macOS 上耗时过长,而且我们本来也不希望在clickhouse-local的提示符中显示主机名。#65510(Konstantin Bogdanov)。 - 避免在低端虚拟机上打印 jemalloc 关于每 CPU arena 的消息。#65532(Alexey Milovidov)。
- 默认禁用文件系统缓存的后台下载功能。等我们修复在使用后台下载线程时,由于内存释放在查询上下文之外进行(而缓冲区在查询上下文之内分配),可能导致的 “Memory limit exceeded” 问题后,再重新启用该功能。此外,我们需要新增一个单独的设置,用于设置后台 worker 的单次最大下载大小(目前受限于
max_file_segment_size,这可能过大)。 #65534 (Kseniia Sumarokova). - 在配置中新增选项
<config_reload_interval_ms>,用于指定 ClickHouse 重新加载配置文件的时间间隔。#65545 (alesapin). - 为 ClickHouse 数据类型实现二进制编码,并在文档中补充其规范说明。在 Dynamic 二进制序列化中使用该编码,并通过 settings 配置项允许在 RowBinaryWithNamesAndTypes 和 Native 格式中使用它。 #65546 (Kruglov Pavel).
- 服务器设置
compiled_expression_cache_size和compiled_expression_cache_elements_size现在可以在system.server_settings中查看。#65584(Robert Schulze)。 - 添加基于 x509 SubjectAltName 扩展的用户身份识别支持。#65626(Anton Kozlov)。
clickhouse-local会遵从配置文件中的max_server_memory_usage和max_server_memory_usage_to_ram_ratio设置。它也会像clickhouse-server一样,默认将最大内存使用量设置为系统内存的 90%。#65697(Alexey Milovidov)。- 添加脚本,用于将文件备份到 ClickHouse。#65699(Alexey Milovidov)。
- 为 PostgreSQL 源添加了查询取消支持。#65722(Maksim Kita)。
- 使
allow_experimental_analyzer在分布式查询中由发起端控制。这可确保在混合版本集群中执行操作时的兼容性和正确性。#65777 (Nikita Mikhaylov). - 在 Keeper 中遵守 cgroup CPU 限制。 #65819 (Antonio Andelic).
- 允许在无参数时使用
concat函数:) select concat();。 #65887 (李扬). - 允许在
clickhouse-local中管理命名集合。#65973 (Alexey Milovidov). - 改进与 Azure 相关的 Profile 事件。#65999 (alesapin).
- 支持按写入端时区读取 ORC 文件。 #66025 (kevinyhzou).
- 添加用于控制 PostgreSQL 连接的配置项。配置项
postgresql_connection_attempt_timeout指定传递给连接 URL 中的connect_timeout参数的值。配置项postgresql_connection_pool_retries指定为建立与 PostgreSQL 端点连接而进行重试的次数。#66232(Dmitry Novik)。 - 降低
system.processors_profile_log中input_wait_elapsed_us/elapsed_us的误差。#66239 (Azat Khuzhin)。 - 改进与文件系统缓存相关的 ProfileEvents。 #66249 (zhukai).
- 添加配置项,使在使用复制存储进行命名集合管理时忽略查询中的
ON CLUSTER子句。#66288 (MikhailBurdukov)。 - 函数
generateSnowflakeID现在允许将机器 ID 作为参数指定,以防止在大型集群中出现冲突。#66374 (ZAWA_ll)。 - 在交互模式下禁用通过
Ctrl+Z将进程挂起。这是一个常见陷阱,对几乎所有用户来说都不是预期行为。我想只有极少数追求极致的高级用户才会欣赏把终端应用挂起到后台这种做法,但我并不认识任何这样的人。#66511(Alexey Milovidov)。 - 在 Dictionaries 中新增用于验证主键类型的选项。对于简单布局,如果没有该选项,任何列类型都会被隐式转换为 UInt64。#66595 (MikhailBurdukov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 在执行 CREATE/REPLACE/RENAME/EXCHANGE 查询时检查是否存在循环依赖,如果存在则抛出异常。此前,此类循环依赖可能会在服务器启动期间导致死锁。同时修复了在创建依赖关系时的一些缺陷。#65405 (Kruglov Pavel)。
- 修复在函数调用中
LowCardinality列意外的大小问题。#65298 (Raúl Marín)。 - 修复 maxIntersections 中的崩溃。#65689 (Raúl Marín).
- 修复用户定义中
VALID UNTIL子句在重启后会被重置的问题。#66409 (Nikolay Degterinsky)。 - 修复
SHOW MERGES中的剩余时间列。#66735 (Alexey Milovidov)。 Query was cancelled可能会在 clickhouse-client 中打印两次。该问题已修复。#66005 (Nikita Mikhaylov)。- 修复了在使用
MaterializedMySQL(一个不受支持的实验性功能)并配合 TABLE OVERRIDE 时出现的崩溃问题,该问题发生在将 MySQL 的 NULL 字段映射到 ClickHouse 中非 NULL 的字段的场景中。#54649 (Filipp Ozinov). - 修复了当
PREWHERE表达式不读取任何列且表没有自适应索引粒度(非常老的表)时出现的逻辑错误。#59173 (Alexander Gololobov)。 - 修复在取消查询时的取消缓冲区 Bug。 #64478 (Sema Checherinda).
- 修复在 columns.txt 不存在时从元数据填充 part 列的逻辑。 #64757 (Azat Khuzhin).
- 修复执行
ALTER TABLE ... ON CLUSTER ... MODIFY SQL SECURITY时导致的崩溃。 #64957 (pufit). - 修复在销毁 AccessControl 时发生的崩溃:添加显式关闭。#64993(Vitaly Baranov)。
- 递归地在函数
uniq*的参数中去除单射函数。此前工作正常,但在新的分析器中出现了问题。#65140(Duc Canh Le)。 - 修复在使用 CTE 查询时出现的意外投影名称问题。#65267 (wudidapaopao).
- 在通过直接查询或
Dictionary表引擎访问字典时,需要具备dictGet权限。#65359 (Joe Lynch)。 - 修复了增量备份中基于用户的 S3 身份验证问题。 #65481 (Antonio Andelic).
- 在启用了
read-in-order优化的情况下,对包含FINAL的查询禁用non-intersecting-parts优化。否则可能会导致查询结果不正确。作为临时规避方案,在此修复合并之前,请禁用do_not_merge_across_partitions_select_final和split_parts_ranges_into_intersecting_and_non_intersecting_final。#65505 (Nikolai Kochetov)。 - 修复当列表批中的所有文件都被过滤掉时抛出
Index out of bound for blob metadata异常的问题。#65523(Kseniia Sumarokova)。 - 修复在投影去重合并过程中出现的 NOT_FOUND_COLUMN_IN_BLOCK 问题。#65573 (Yakov Olkhovskiy).
- 修复了 MergeJoin 中的一个缺陷:稀疏序列化中的列在未执行所需转换的情况下,可能会被当作其嵌套类型的列进行处理。#65632 (Nikita Taranov)。
- 修复了兼容性级别 '23.4' 未正确生效的问题。#65737 (cw5121)。
- 修复包含可为 NULL 字段的 ODBC 表。#65738 (Rodolphe Dugé de Bernonville).
- 修复在发生致命错误时可能出现的
TCPHandler数据竞争问题。#65744 (Kseniia Sumarokova). - 修复函数
parseDateTime在处理占位符%F和%D时抛出的错误异常。#65768 (Antonio Andelic)。 - 对于从
PostgreSQL读取数据的查询,如果ClickHouse查询已完成,则会取消内部的PostgreSQL查询。否则,在内部的PostgreSQL查询完成前,ClickHouse查询无法被取消。 #65771 (Maksim Kita)。 - 修复在同时使用旧版分析器和 dictGetOrDefault 时短路逻辑中的一个 Bug。#65802(jsc0218)。
- 修复导致 EmbeddedRocksDB 在启用 TTL 写入时生成损坏 SST 文件的问题。#65816 (Duc Canh Le).
- 函数
bitTest、bitTestAll和bitTestAny现在在指定的位索引超出范围时会返回错误 #65818 (Pablo Marcos)。 - 在任何使用哈希 JOIN 的查询中都支持设置
join_any_take_last_row。 #65820 (vdimir)。 - 更好地处理包含
IS NULL检查的 JOIN 条件(例如ON (a = b AND (a IS NOT NULL) AND (b IS NOT NULL) ) OR ( (a IS NULL) AND (b IS NULL) )会被重写为ON a <=> b),并修复在同时存在除IS NULL之外的其他条件时出现的不正确优化。#65835 (vdimir)。 - 修复 S3Queue 中内存占用持续增长的问题。#65839 (Kseniia Sumarokova).
- 修复
arrayAUC中对相同值(tie)的处理,使其与 sklearn 一致。#65840 (gabrielmcg44)。 - 修复 MySQL 服务器协议 TLS 连接的潜在问题。#65917(Azat Khuzhin)。
- 修复 MySQL 客户端协议 TLS 连接可能存在的问题。#65938(Azat Khuzhin)。
- 修复在超时时间为 0 时处理
SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE的方式。#65941 (Azat Khuzhin). - 在模式推断缓存中添加缺失的设置
input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines/input_format_csv_try_infer_numbers_from_strings/input_format_csv_try_infer_strings_from_quoted_tuples,因为它们会改变最终推断出的模式。这样可以避免在这些设置被修改时产生错误的模式推断结果。 #65980 (Kruglov Pavel). - 在 S3 引擎和 S3 表函数中,Column _size 表示归档文件中单个文件的大小,而不是整个归档文件的大小。#65993 (Daniil Ivanik)。
- 修复在分析器中解析动态子列的问题,避免在读取动态子列时对整列进行扫描读取。#66004(Kruglov Pavel)。
- 修复 from_env 在使用 replace 覆盖时的配置合并问题。#66034 (Azat Khuzhin)。
- 修复在关闭过程中
GRPCServer可能出现的挂起问题。#66061 (Vitaly Baranov)。 - 修复了函数
has在使用非常量LowCardinality参数时的多个问题。#66088 (Anton Popov). - 修复了
groupArrayIntersect在merge()函数中的不正确行为。同时修正了deserialise()对数值和通用数据的处理行为。#66103 (Yarik Briukhovetskyi)。 - 修复了
unbin/unhex实现中的缓冲区溢出漏洞。#66106 (Nikita Taranov). - 禁用在 #64760 中引入的
merge-filters优化。如果该优化在合并两个过滤表达式时未执行短路求值,可能会导致异常。#66126(Nikolai Kochetov)。 - 修复了服务器在解析包含使用负块大小数组编码的数据的 Avro 文件时失败的问题,此类编码现在已被 Avro 规范允许。#66130 (Serge Klochkov)。
- 修复了 ZooKeeper 客户端中的一个缺陷:在从 ZooKeeper 收到硬件错误后,会话可能会陷入不可用状态。例如,这可能是由于 ClickHouse Keeper 中的“软内存限制”导致的。#66140(Alexander Tokmakov)。
- 修复
SumIfToCountIfVisitor与有符号整数相关的问题。#66146(Raúl Marín)。 - 修复极少数情况下分布式查询结果中数据缺失的问题。 #66174 (vdimir)。
- 修复 StorageDeltaLake 中解析元数据字段的顺序。 #66211 (Kseniia Sumarokova).
- 当
distributed_ddl_output_mode处于none_only_active模式时,不要抛出TIMEOUT_EXCEEDED。 #66218 (Alexander Tokmakov). - 修复在无法使用索引时对
system.numbers_mt的 LIMIT 子句处理。#66231(János Benjamin Antal)。 - 修复了当 ClickHouse 服务器在 Docker 等容器中运行时,根据 cgroups v2 指定的最大可用 CPU 核心数进行检测的方式。更具体地说,容器通常在名称为空的根 cgroup 中运行其进程。在这种情况下,ClickHouse 会忽略 cgroups v2 设置的 CPU 限制。#66237 (filimonov)。
- 修复在约束条件中使用带有
IN的子查询时出现的Not-ready set错误。#66261 (Nikolai Kochetov)。 - 修复在复制到 S3 或 Azure Blob Storage 时的错误报告问题。#66295 (Vitaly Baranov)。
- 防止 watchdog 保留已解除链接(已轮转)日志文件的文件描述符。#66334 (Aleksei Filatov).
- 修复
logicalexpressionoptimizerpass导致常量逻辑类型丢失的错误。 #66344 (pn). - 修复在使用
group_by_use_nulls=true和新的 analyzer 时出现的Column identifier is already registered错误。#66400 (Nikolai Kochetov). - 修复在查询带有
PostgreSQL等外部引擎的表并进行联接和过滤时,因过于激进的过滤下推而可能产生错误结果的问题。现在,在与外部表进行外连接的情况下,WHERE子句中的条件将不会再被下推到外部数据库。#66402 (vdimir). - 为 cross join 补上了缺失的列物化。#66413 (lgbo).
- 修复在启用新 analyzer 时,在
GROUP BY键中包含常量表达式的查询出现的Cannot find column错误。#66433 (Nikolai Kochetov)。 - 在从 Npy 格式导入时,避免在数组嵌套层级不正确的情况下产生潜在的逻辑错误,并修复对其他类型错误的测试。#66461 (Yarik Briukhovetskyi)。
- 修复在谓词中存在非确定性函数时导致
count()结果错误的问题。#66510 (Duc Canh Le). - 正确跟踪
Allocator::realloc的内存使用。 #66548 (Antonio Andelic)。 - 修复在对空元组进行哈希时读取未初始化的内存的问题。 #66562 (Alexey Milovidov).
- 修复在使用
WINDOW的查询中返回无效结果的问题。当PARTITION列使用稀疏序列化方式且窗口函数并行执行时,可能会出现此问题。#66579 (Nikolai Kochetov)。 - 修复删除本地存储中的命名集合时的问题。#66599 (János Benjamin Antal).
- 修复在
ColumnTuple::insertManyFrom中未更新column_length的问题。#66626 (lgbo)。 - 修复在包含表达式
(column IS NULL)的查询中出现的Unknown identifier和Column is not under aggregate function错误。该错误仅在禁用 analyzer 的情况下才会被 #65088 触发。#66654(Nikolai Kochetov)。 - 修复在使用新分析器时,如果将标量子查询用作
IN的第一个参数,会触发Method getResultType is not supported for QUERY query node错误的问题。 #66655 (Nikolai Kochetov). - 修复在读取 variant 子列时可能触发的 PARAMETER_OUT_OF_BOUND 错误。#66659 (Kruglov Pavel).
- 修复删除列后合并卡住的罕见问题。#66707 (Raúl Marín).
- 修复在从远程源执行
INSERT SELECT时的断言isUniqTypes。 #66722(Sema Checherinda)。 - 修复 PrometheusRequestHandler 中的逻辑错误。#66621 (Vitaly Baranov).
- 修复由模糊测试工具发现的
indexHint函数问题。#66286 (Anton Popov)。 - 修复
create table b empty as a的 AST 格式化问题。#64951(Michael Kolupaev)。
ClickHouse release 24.6, 2024-07-01
向后不兼容的变更
- 默认启用异步加载数据库和表。参见 config.xml 中的
async_load_databases。尽管此变更整体上完全兼容,但可能会带来行为差异。当async_load_databases为 false(与之前版本相同)时,服务器在所有表加载完成之前不会接受连接。当async_load_databases为 true(即新版本的行为)时,服务器可以在所有表尚未完全加载之前就接受连接。如果对尚未加载完成的表发起查询,该查询会等待表完成加载,这可能会花费相当长的时间。如果服务器是大型分布式系统的一部分并位于负载均衡器之后,这将改变服务器的行为。在第一种情况下,负载均衡器会收到连接被拒绝,并快速切换到其他服务器。在第二种情况下,负载均衡器可能连接到仍在加载表的服务器,此时查询的延迟会更高。此外,如果有大量查询积压在等待状态,当它们开始同时处理时,可能会导致“惊群问题(thundering herd)”。这一差异仅会影响高负载的分布式后端。你可以将async_load_databases设置为 false 以避免该问题。#57695(Alexey Milovidov)。 - 默认对
MergeTree表启用replace_long_file_name_to_hash设置。#64457(Anton Popov)。该设置完全兼容,升级时无需额外操作。新的数据格式从 23.9 起的所有版本均已支持。启用此设置后,你将无法再降级到 23.8 或更早的版本。 - 一些无效查询会在解析阶段更早失败。注意:当
kql表函数中未使用字符串字面量时,已禁用对内联 KQL 表达式(实验性的 Kusto 语言)的支持,例如kql(garbage | trash)不再被支持,必须使用kql('garbage | trash')或kql($$garbage | trash$$)。此特性是无意间引入的,本不应该存在。#61500(Alexey Milovidov)。 - 重构存储引擎
S3Queue在Ordered模式下的并行处理逻辑。如果你在 Ordered 模式中使用了s3queue_processing_threads_num或s3queue_total_shards_num设置,此 PR 将不向后兼容。设置s3queue_total_shards_num已被删除,此前它只允许在s3queue_allow_experimental_sharded_mode下使用,而该设置现在已废弃。新增了一个设置 ——s3queue_buckets。#64349(Kseniia Sumarokova)。 - 新增函数
snowflakeIDToDateTime、snowflakeIDToDateTime64、dateTimeToSnowflakeID和dateTime64ToSnowflakeID。与现有的snowflakeToDateTime、snowflakeToDateTime64、dateTimeToSnowflake和dateTime64ToSnowflake函数不同,新函数与generateSnowflakeID函数兼容,即它们接受由generateSnowflakeID生成的 snowflake ID,并生成与generateSnowflakeID相同类型(即UInt64)的 snowflake ID。此外,新函数默认使用 UNIX 纪元(即 1970-01-01),与generateSnowflakeID相同。如有需要,可以传入不同的纪元,例如 Twitter/X 的纪元 2010-11-04(即自 UNIX 纪元以来的 1288834974657 毫秒)。旧的转换函数已被弃用,并将在过渡期后移除:如果仍需继续使用它们,请启用设置allow_deprecated_snowflake_conversion_functions。#64948(Robert Schulze)。
新功能
- 支持在 ClickHouse Keeper 中存储具名集合。 #64574 (Kseniia Sumarokova).
- 支持空元组。 #55061 (Amos Bird).
- 新增 Hilbert 曲线编码和解码函数。#60156(Artem Mustafin)。
- 为
hilbertEncode添加索引分析支持。#64662(Artem Mustafin)。 - 新增对通过函数
readWKTLineString读取 WKT 格式LINESTRING几何对象的支持。#62519 (Nikita Mikhaylov)。 - 允许从其他磁盘附加数据分片。 #63087 (Unalian).
- 新增 SQL 函数
generateSnowflakeID,用于生成 Twitter 风格的 Snowflake ID。#63577 (Danila Puzov)。 - 新增了
merge_workload和mutation_workload设置,用于调节资源在合并、变更及其他工作负载之间的使用和共享方式。 #64061 (Sergei Trifonov). - 新增对使用
=运算符比较IPv4和IPv6类型的支持。#64292(Francisco J. Jurado Moreno)。 - 在二元数学函数(pow、atan2、max2、min2、hypot)中支持 Decimal 参数。#64582(Mikhail Gorshkov)。
- 新增 SQL 函数
parseReadableSize(及其OrNull和OrZero变体)。#64742 (Francisco J. Jurado Moreno)。 - 添加了服务器设置
max_table_num_to_throw和max_database_num_to_throw,用于限制在执行CREATE查询时可创建的数据库或表数量上限。#64781 (Xu Jia)。 - 为类文件存储(S3/file/hdfs/url/azureBlobStorage)添加
_time虚拟列。 #64947 (Ilya Golshtein)。 - 新增了新函数
base64URLEncode、base64URLDecode和tryBase64URLDecode。 #64991 (Mikhail Gorshkov). - 新增函数
editDistanceUTF8,用于计算两个 UTF-8 字符串的编辑距离。#65269(LiuNeng)。 - 添加
http_response_headers配置,以支持在自定义 HTTP 处理程序中设置自定义响应头。 #63562 (Grigorii)。 - 新增了一个名为
loop的表函数,用于以无限循环的方式返回查询结果。#63452 (Sariel)。这对测试很有帮助。 - 在
system.query_log中新增了两个列:used_privileges和missing_privileges。used_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)。
实验特性
- 引入“不同值个数”类型的统计信息。#59357 (Han Fei).
- 支持在 ReplicatedMergeTree 中使用统计信息。#64934 (Han Fei).
- 如果为
Replicated数据库配置了“副本组(replica group)”,则会自动创建一个包含所有组中副本的集群。#64312 (Alexander Tokmakov). - 新增设置
parallel_replicas_custom_key_range_lower和parallel_replicas_custom_key_range_upper,用于在使用范围过滤条件时控制动态分片的并行副本如何并行执行查询。#64604 (josh-hildred).
性能优化
- 在插入时添加对行重新排序的能力,以在不违反由
PRIMARY KEY设定的顺序的前提下优化数据大小。该行为由设置项optimize_row_order控制(默认关闭)。#63578(Igor Markelov)。 - 新增原生 Parquet 读取器,可直接将 Parquet 二进制数据读入 ClickHouse 列。该功能由设置项
input_format_parquet_use_native_reader控制(默认禁用)。#60361 (ZhiHong Zhang)。 - 当查询过滤条件能够从 MergeTree 表中精确选定范围时,支持部分 trivial count 优化。 #60463 (Amos Bird).
- 通过在单个 transform 中汇集多个线程的数据块,降低多线程
INSERT的最大内存占用。#61047 (Yarik Briukhovetskyi). - 在使用 Azure 对象存储时,通过采用固定内存分配来减少内存使用量,避免分配额外的缓冲区。#63160 (SmitaRKulkarni)。
- 减少
ColumnNullable::size中的虚函数调用次数。 #60556 (HappenLee). - 当正则表达式参数为单字符时,优化
splitByRegexp的性能。#62696 (Robert Schulze). - 通过跟踪已使用键的最小值和最大值,加速对 8 位和 16 位键的聚合。这可以减少需要验证的单元数量。#62746(Jiebin Sun)。
- 当左侧为
LowCardinality类型且右侧为常量集合时,对IN运算符进行优化。 #64060 (Zhiguo Zhou). - 在
ConcurrentHashJoin中使用线程池来初始化和销毁哈希表。#64241 (Nikita Taranov)。 - 优化了包含稀疏列的表的纵向合并。 #64311 (Anton Popov)。
- 在垂直合并期间启用了从远程文件系统进行数据预取的功能,从而降低了数据存储在远程文件系统上的表执行垂直合并时的延迟。 #64314 (Anton Popov).
- 减少对
ColumnSparse::filter中isDefault的冗余调用,以提升性能。#64426 (Jiebin Sun)。 - 通过对
getChildren发起多个异步请求,加速find_super_nodes和find_big_familyKeeper 客户端命令。 #64628 (Alexander Gololobov). - 改进函数
least/greatest对可为空的数值类型参数的支持。#64668 (KevinyhZou). - 允许合并查询计划中相邻的两个过滤步骤。如果可以将过滤条件从父步骤下推,则可以提升过滤下推(filter push-down)优化效果。#64760(Nikolai Kochetov)。
- 移除 vertical final 实现中的不良优化,并默认重新启用 vertical final 算法。 #64783 (Duc Canh Le).
- 从过滤表达式中移除 ALIAS 节点。对于带有
PREWHERE(使用新分析器)的查询,这可以略微提升性能。#64793(Nikolai Kochetov)。 - 重新启用 OpenSSL 会话缓存。#65111 (Robert Schulze)。
- 添加了用于在插入时禁用跳过索引和统计信息物化的设置(
materialize_skip_indexes_on_insert和materialize_statistics_on_insert)。#64391 (Anton Popov)。 - 使用已分配的内存大小来计算行组大小,并在单线程模式下降低 Parquet 写入器的峰值内存占用。#64424 (LiuNeng)。
- 改进稀疏列的迭代器,以减少对
size的调用次数。#64497 (Jiebin Sun). - 更新条件,以在备份到 Azure Blob Storage 时使用服务器端复制。#64518(SmitaRKulkarni)。
- 优化了针对包含大量 skip 索引的表进行纵向合并时的内存使用。#64580 (Anton Popov).
改进
- 现在对系统表执行
SHOW CREATE TABLE时,会显示每个表特有的、非常实用的注释,用于说明该表的用途和存在的原因。#63788(Nikita Mikhaylov)。 - 函数
round(),roundBankers(),floor(),ceil()和trunc()的第二个参数(scale)现在可以是非常量了。#64798(Mikhail Gorshkov)。 - 为
Distributed表在添加新磁盘时支持存储策略热重载。#58285(Duc Canh Le)。 - 在服务饱和时进行线程调度的场景下,避免在 MergeTree 索引分析过程中可能发生的死锁。#59427(Sean Haynes)。
- 修复了若干与 S3 代理支持和隧道相关的次要边界情况。#63427(Arthur Passos)。
- 改进 io_uring 重新提交(resubmit)的可见性。将性能分析事件从
IOUringSQEsResubmits重命名为IOUringSQEsResubmitsAsync,并新增一个事件IOUringSQEsResubmitsSync。 #63699 (Tomer Shafir). - 添加了一个新的设置项
metadata_keep_free_space_bytes,用于在元数据存储磁盘上保留空闲空间。#64128(MikhailBurdukov)。 - 为
plain_rewritable元数据存储新增指标,用于跟踪创建和删除的目录数量,以及本地到远程内存映射表中的条目数量。#64175 (Julia Kartseva)。 - 查询缓存现在会将设置不同但语句相同的查询视为不同的查询。这样在不同设置(例如
limit或additional_table_filters)会影响查询结果的情况下,提高了系统的健壮性。 #64205 (Robert Schulze). - 在对象存储中支持将非标准错误码
QpsLimitExceeded作为可重试错误处理。 #64225 (Sema Checherinda). - 如果该表对应的 ZooKeeper 路径已存在,则禁止将 MergeTree 表转换为复制表(ReplicatedMergeTree)。 #64244 (Kirill).
- 添加了一个新的设置项
input_format_parquet_prefer_block_bytes用于控制平均输出数据块的字节数,并将input_format_parquet_max_block_size的默认值修改为 65409。#64427 (LiuNeng)。 - 允许对在
no_proxy环境变量和 ClickHouse 代理配置中指定的主机跳过代理。#63314(Arthur Passos)。 - 启动 Keeper 时,始终为全局线程池配置足够数量的线程。#64444 (Duc Canh Le)。
- 用户配置文件中的设置不会影响使用对象存储的
MergeTree的合并(merge)和变更(mutation)。 #64456 (alesapin). - 将对象存储中的非标准错误码
TotalQpsLimitExceeded视为可重试错误并予以支持。 #64520 (Sema Checherinda). - 为开源版和 ClickHouse Cloud 版本更新了高级仪表板,新增“最大并发网络连接数”图表。#64610 (Thom O'Connor)。
- 改进
zeros_mt和generateRandom的进度报告功能。 #64804 (Raúl Marín). - 新增一个异步指标
jemalloc.profile.active,用于指示当前采样是否处于激活状态。它是对prof.active的补充激活机制;只有两者都为激活状态时,调用线程才会进行采样。#64842 (Unalian)。 - 移除了对
allow_experimental_join_condition的重要性标记。该标记可能导致在混合版本集群中,分布式查询无法成功执行。#65008(Nikita Mikhaylov)。 - 新增了服务器异步指标
DiskGetObjectThrottler*和DiskGetObjectThrottler*,用于反映通过磁盘设置s3_max_get_rps和s3_max_put_rps定义的每秒请求速率上限,以及当前在不触发该磁盘限流上限的情况下仍可发送的请求数量。对于每个配置了速率限制的磁盘,都会定义这些指标。#65050(Sergei Trifonov)。 - 为
Poco::ThreadPool初始化全局 trace 采集器(Keeper 等组件需要)。#65239 (Kseniia Sumarokova)。 - 在使用
bcrypt_hash创建用户时添加验证。#65242(Raúl Marín)。 - 为在
PREWHERE阶段/之后读取的行数添加 ProfileEvents 统计。#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)时可能会导致意外的数据删除。#65356(Dmitry Novik)。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复了 Apache ORC 库中的一个缺陷:修正了在所有平台上写入无符号类型,以及在 ARM 上写入 Int8 时的 ORC 统计信息计算错误。#64563 (Michael Kolupaev)。
- 恢复了 ClickHouse 在 CSV 格式中处理和解释 Tuple 的原有行为。此更改实际上回滚了 https://github.com/ClickHouse/ClickHouse/pull/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)。 - 修复一个权限错误,该错误会导致在特定情况下,用户无需获得必要授权即可在默认数据库上提升其权限。#64769 (pufit).
- 修复在使用 UniqInjectiveFunctionsEliminationPass 和 uniqCombined 时出现的崩溃问题。#65188 (Raúl Marín).
- 修复 ClickHouse Keeper 中在关闭会话时导致摘要不一致的错误。 #65198 (Aleksei Filatov).
- 为 Distinct 组合器使用正确的内存对齐方式。此前在使用该组合器时,可能由于无效的内存分配而导致崩溃。#65379(Antonio Andelic)。
- 修复
DISTINCT与窗口函数一起使用时的崩溃问题。#64767 (Igor Nikonov)。 - 修复了与 IN 和 indexHint() 搭配使用时 'set' 跳过索引不起作用的问题。#62083 (Michael Kolupaev).
- 在为参数化视图设置值时支持执行函数。#63502 (SmitaRKulkarni)。
- 修复了 Parquet 内存跟踪。 #63584 (Michael Kolupaev).
- 修复了对类型为
Tuple(Map(LowCardinality(String), String), ...)的列的读取。#63956 (Anton Popov). - 修复在不同类型(表达式和函数)的循环别名时出现的
Cyclic aliases错误。 #63993 (Nikolai Kochetov). - 此修复将在查询管道中,为每个独立视图使用重新定义后的正确上下文,并为其设置正确的定义者。 #64079 (pufit).
- 修复 analyzer:修正了在使用 INTERPOLATE 时出现的 “Not found column” 错误。#64096 (Yakov Olkhovskiy)。
- 修复了在将文件备份到使用与包含该文件的磁盘不同凭证的 S3 存储桶时的问题。 #64153 (Antonio Andelic).
- 查询缓存现在会将针对不同数据库的两个相同查询视为不同的查询。先前的行为可能被利用来绕过对表的读取权限限制。#64199(Robert Schulze)。
- 修复在 StatusFile 中,因 ~WriteBufferFromFileDescriptor 未捕获异常导致可能中止的问题。#64206 (Kruglov Pavel)。
- 修复在使用
ARRAY JOIN的分布式查询中出现的duplicate alias错误。#64226(Nikolai Kochetov)。 - 修复从字符串到整数的意外 accurateCast。 #64255 (wudidapaopao).
- 修复了在任意 OR 组包含互斥原子时的 CNF 简化问题。 #64256 (Eduard Karacharov).
- 修复 Query Tree 的大小校验。#64377(Dmitry Novik)。
- 修复在
Buffer表上使用PREWHERE时出现的Logical error: Bad cast问题。#64388(Nikolai Kochetov)。 - 当
blob_storage_log存储在对象存储上时,防止发生递归日志记录。 #64393 (vdimir)。 - 修复了在具有默认表达式的表上执行的
CREATE TABLE AS查询。#64455 (Anton Popov)。 - 修复了在具有可为 NULL 键的表上,
optimize_read_in_order在 ORDER BY ... NULLS FIRST / LAST 情况下的行为。#64483(Eduard Karacharov)。 - 修复在包含
GLOBAL IN别名的查询中出现的Expression nodes list expected 1 projection names和Unknown expression or identifier错误。#64517(Nikolai Kochetov)。 - 修复在分布式查询中,当常量 CTE 用作
GROUP BY键时出现的Cannot find column错误。#64519 (Nikolai Kochetov)。 - 修复从备份恢复时,如果创建了其定义者尚未恢复的 MV,会导致恢复被阻塞并陷入崩溃循环的问题。#64595 (pufit)。
- 修复了函数
formatDateTimeInJodaSyntax的输出问题:当格式化器生成的字符数为奇数且最后一个字符为0时会出错。例如,SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D')现在会正确返回150,而不是之前的15。#64614(LiuNeng)。 - 如果已经使用了
-If组合器,则不要重写聚合操作。 #64638 (Dmitry Novik). - 修复在缓冲区较小时(例如
--max_read_buffer_size 1)对 float 类型的推断问题。#64641 (Azat Khuzhin). - 修复了一个可能导致基于表达式的 TTL 无法正常工作的错误。#64694 (alesapin).
- 修复新分析器中对始终为真的
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). - Keeper 修复:在
mntr命令中为zk_latest_snapshot_size返回正确的值。#64784 (Antonio Andelic). - 修复在对
Nested列执行ARRAY JOIN的分布式查询中出现的Cannot find column错误。修复了 #64755。#64801(Nikolai Kochetov)。 - 修复 SLRU 缓存策略中的内存泄漏。#64803 (Kseniia Sumarokova)。
- 修复了多种查询中可能存在的不正确内存跟踪问题:从 S3 读取任意数据的查询、通过 HTTP 协议的查询,以及异步插入操作。 #64844 (Anton Popov).
- 修复在使用
PREWHERE从物化视图读取时,当物化视图中的列类型与源表不同时出现的Block structure mismatch错误。修复了 #64611。#64855(Nikolai Kochetov)。 - 修复在表定义了带子查询的 TTL、数据库为 replicated、启用 parallel replicas 且使用 analyzer 时可能出现的罕见崩溃。这种情况虽然非常罕见,但请不要在 TTL 中使用子查询。#64858 (alesapin)。
- 在删除大批量数据时,修复
blob_storage_log中重复记录的Delete事件。#64924 (vdimir)。 - 修复了在服务器启动后,当配置中包含从 [Zoo]Keeper 获取的 include 片段时,可能由 [Zoo]Keeper 报出的
Session moved to another server错误。#64986 (Alexander Tokmakov)。 - 修复在参数化
VIEW上失效的ALTER MODIFY COMMENT查询,该问题出现在 https://github.com/ClickHouse/ClickHouse/pull/54211 中。#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 (alias)(新分析器)执行远程查询时出现的Unknown expression identifier错误,解决了 #64636。#65090(Nikolai Kochetov)。 - 修复将算术运算下推到聚合运算外部的问题。在新的 analyzer 中,该优化此前仅会被应用一次。#65104 (Dmitry Novik)。
- 修复在新分析器中对聚合函数名称的重写问题。 #65110 (Dmitry Novik).
- 如果在从客户端套接字读取(部分)请求体时发生接收超时,则返回 5xx,而不是 200 OK。#65118 (Julian Maicher)。
- 修复对冲请求可能导致的崩溃。#65206 (Azat Khuzhin).
- 修复 Hashed 和 Hashed_Array 字典在短路求值中的一个缺陷,该问题可能导致读取未初始化的数值,从而引发各种错误。#65256 (jsc0218)。
- 此 PR 确保在 IN 运算符的类型转换过程中,常量(IN 运算符的第二个参数)的类型始终是可见的。否则,类型信息的丢失可能会导致某些转换失败,例如从 DateTime 到 Date 的转换。此更改修复了 #64487。#65315(pn)。
构建/测试/打包改进
- 增加对 LLVM XRay 的支持。#64592 #64837 (Tomer Shafir).
- 将 S3/HDFS/Azure 存储实现统一为一个使用 IObjectStorage 的单一类。
*Cluster、数据湖和 Queue 存储也采用相同方式统一。#59767 (Kseniia Sumarokova). - 重构数据 part 写入器,去除对 MergeTreeData 和 DataPart 的依赖。#63620 (Alexander Gololobov).
- 重构
KeyCondition和键分析逻辑,以改进 PartitionPruner 和 trivial count 优化。此变更从 #60463 中拆分出来。#61459 (Amos Bird). - 引入断言来验证所有函数都在使用正确大小的列进行调用。#63723 (Raúl Marín).
- 在使用
rc初始化脚本启动 ClickHouse 服务器守护进程时,将network服务设为必需项。#60650 (Chun-Sheng, Li). - 缩小部分慢测试的规模。#64387 #64452 (Raúl Marín).
- 使用 keeper-bench 回放 ZooKeeper 日志。#62481 (Antonio Andelic).
ClickHouse 24.5 版本发布,2024-05-30
不向后兼容的更改
- 将 “inverted indexes”(倒排索引)重命名为 “full-text indexes”(全文索引),这是一个技术性较弱、更易于用户理解的名称。这也会更改内部表元数据,并导致包含现有(实验性)倒排索引的表无法正常工作。请务必在升级前删除此类索引,并在升级后重新创建。#62884 (Robert Schulze).
- 函数
neighbor、runningAccumulate、runningDifferenceStartingWithFirstValue、runningDifference的使用已被弃用(因为容易出错)。应改用合适的窗口函数。若要重新启用这些函数,请设置allow_deprecated_error_prone_window_functions = 1或将compatibility设置为24.4或更低版本。#63132 (Nikita Taranov). - 当列数量很多,但许多数据库或表没有被授予
SHOW TABLES权限时,对system.columns的查询现在会执行得更快。请注意,在之前的版本中,如果仅对单独的列授予SHOW COLUMNS权限,而未对相应的表授予SHOW TABLES权限,则system.columns表仍会显示这些列,但在新版本中,将会完全跳过该表。移除了减慢查询的 “Access granted” 和 “Access denied” 跟踪日志消息。#63439 (Alexey Milovidov).
新功能
- 新增
Form格式,用于以application/x-www-form-urlencoded格式读写单条记录。#60199 (Shaun Struwig)。 - 新增了在 CROSS JOIN 中进行压缩的能力。 #60459 (p1rattttt).
- 当大小超过限制时,新增支持在临时文件中执行
CROSS JOIN。#63432 (p1rattttt)。 - 支持在 JOIN 中使用涉及左右表列的不等条件,例如
t1.y < t2.y。要启用该功能,执行SET allow_experimental_join_condition = 1。#60920 (lgbo)。 - 现在
Map类型可以使用Float32、Float64、Array(T)、Map(K, V)和Tuple(T1, T2, ...)作为键。解决了 #54537。 #59318 (李扬). - 通过创建并摄取 SST 文件,而不是依赖 RocksDB 内置的 memtable,为
EmbeddedRocksDB引入批量加载功能。这有助于提高导入速度,尤其是针对 StorageEmbeddedRocksDB 表的长时间运行插入查询。同时引入了EmbeddedRocksDB表设置。#59163 #63324 (Duc Canh Le)。 - 用户现在可以通过设置
input_format_tsv_crlf_end_of_line在解析 TSV 格式时支持 CRLF 行结束符。修复了 #56257。#59747(Shaun Struwig)。 - 新增了设置
input_format_force_null_for_omitted_fields,用于将被省略的字段强制设为 NULL。 #60887 (Constantine Peresypkin). - 此前我们的 S3 存储和
s3表函数不支持从归档文件(例如 tar 包、zip、7z 压缩包)中进行查询。现在它们已经支持在 S3 中遍历归档内的文件。#62259(Daniil Ivanik)。 - 添加对条件函数
clamp的支持。#62377 (skyoct)。 - 添加
NPy输出格式。#62430(豪肥肥)。 Raw格式作为TSVRaw的别名。#63394 (Unalian)。- 新增了 SQL 函数
generateUUIDv7,用于生成第 7 版 UUID,即带有随机部分的基于时间戳的 UUID。同时新增函数UUIDToNum用于从 UUID 中提取字节数据,以及函数UUIDv7ToDateTime用于从第 7 版 UUID 中提取时间戳部分。#62852 (Alexey Petrunyaka)。 - 在 Linux 和 macOS 上,如果程序的 stdout 被重定向到带有压缩扩展名的文件,则自动使用对应的压缩方式,而不是不进行压缩(从而使其行为类似于
INTO OUTFILE)。#63662 (v01dXYZ)。 - 更改在附加表数量较多时显示的警告信息,以便区分表、视图和字典。#64180(Francisco J. Jurado Moreno)。
- 在 ClickHouse 服务器中为
azureBlobStorage函数增加对 Azure Workload Identity 的支持,从而可以使用 Azure Workload Identity 对 Azure Blob Storage 进行身份验证。如果在配置中设置了use_workload_identity参数,则会使用 workload identity 进行身份验证。#57881(Vinay Suryadevara)。 - 在
system.parts_columns表中添加 TTL 信息。 #63200 (litlig).
实验性特性
- 实现了
Dynamic数据类型,它允许在事先不知道所有可能类型的情况下,在其中存储任意类型的值。Dynamic类型可通过设置allow_experimental_dynamic_type启用。参考:#54864、#63058(Kruglov Pavel)。 - 允许在未连接 MySQL 的情况下创建
MaterializedMySQL数据库。#63397(Kirill)。 - 当某个 DDL 任务以相同错误连续失败次数超过
max_retries_before_automatic_recovery(默认 100)时,会自动将某个 Replicated 数据库的副本标记为丢失并启动恢复。同时,修复了一个 bug:在执行某个条目的早期阶段抛出异常时,可能会导致 DDL 条目被跳过。#63549(Alexander Tokmakov)。 - 在
StorageS3Queue中,失败的文件也会计入s3queue_tracked_file_ttl_sec和s3queue_traked_files_limit的统计。#63638(Kseniia Sumarokova)。
性能改进
- 减少对文件系统缓存(第 4 部分)的争用。通过在后台执行额外的淘汰(由
keep_free_space_size(elements)_ratio控制),避免将文件系统缓存填满至上限。这样可以减轻查询空间预留(在tryReserve方法中)的压力。同时尽可能以无锁方式完成,即不应阻塞正常的缓存使用。#61250(Kseniia Sumarokova)。 - 在执行
INSERT时,跳过对新创建的 projection 块的合并。#59405(Nikita Taranov)。 - 当输入字符串全部为 ASCII 字符时,将字符串函数
...UTF8按 ASCII 方式处理。灵感来自 https://github.com/apache/doris/pull/29799。整体提速约为 1.07x~1.62x。注意某些情况下峰值内存使用有所降低。#61632(李扬)。 - 提升 StorageS3 中选择 (
{}) 通配模式的性能。#62120(Andrey Zvonov)。 - HostResolver 中每个 IP 地址可能会出现多次。如果远程主机有多个 IP,并且由于某些原因(例如防火墙规则)其中部分 IP 允许访问而其他 IP 被禁止,那么只有第一个被禁止的 IP 记录会被标记为失败,在每次尝试中这些 IP 都有机会被再次选择(并再次失败)。即使修复这一点,每 120 秒 DNS 缓存也会被清空,IP 仍可能再次被选中。#62652(Anton Ivashkin)。
- 新增配置项
prefer_merge_sort_block_bytes,用于控制内存使用,并在列很多时将合并阶段的排序加速至 2 倍左右。#62904(LiuNeng)。 clickhouse-local启动速度将更快。在之前版本中,它不会按预期删除临时目录,现在会删除。此更改关闭了 #62941。#63074(Alexey Milovidov)。- 针对新分析器的一些微优化。#63429(Raúl Marín)。
- 当
DateTime与DateTime64比较时,索引分析现在可以正常工作。此更改关闭了 #63441。#63443 #63532(Alexey Milovidov)。 - 通过去除冗余数据,略微加速
set类型索引(约 1.5 倍)。#64098(Alexey Milovidov)。 - 写入文件系统缓存时取消数据拷贝操作。#63401(Kseniia Sumarokova)。
- 使用 Azure Blob Storage 的备份现在将使用多副本拷贝(multicopy)。#64116(alesapin)。
- 即使在不同的容器之间,也允许对 Azure 使用原生拷贝(native copy)。#64154(alesapin)。
- 最终为 Azure 启用了原生拷贝(native copy)。#64182(alesapin)。
改进
- 允许使用
clickhouse-local及其快捷方式clickhouse和ch,并将查询语句或查询文件作为位置参数传入。示例:ch "SELECT 1"、ch --param_test Hello "SELECT {test:String}"、ch query.sql。此更改解决了 #62361。#63081(Alexey Milovidov)。 - 为本地和 Azure(azure_blob_storage)对象存储启用 plain_rewritable 元数据。#63365 (Julia Kartseva)。
- 支持英文风格的 Unicode 引号,例如 “Hello”、'world'。一般来说这并不算理想,但当你在诸如 Google Docs 之类的文字处理器中编写查询时会很有帮助。本次更改修复了 #58634。#63381(Alexey Milovidov)。
- 在
INSERT查询的列列表中允许使用末尾逗号。例如:INSERT INTO test (a, b, c, ) VALUES ...。#63803(Alexey Milovidov)。 - 改进
Regexp格式的异常信息。#63804 (Alexey Milovidov). - 允许在
Values格式中使用尾随逗号。例如,可以执行如下查询:INSERT INTO test (a, b, c) VALUES (4, 5, 6,);。 #63810 (Alexey Milovidov). - 使 RabbitMQ 对损坏消息返回 nack。关闭 #45350。#60312(Kseniia Sumarokova)。
- 修复在解析调试信息时发生的异步栈展开崩溃(例如使用采样查询分析器时)。此修复关闭了 #60460。#60468(Alexey Milovidov)。
- 为 S3 错误 'no key' 在磁盘和存储场景中提供不同的错误消息。 #61108 (Sema Checherinda).
- 进度条现在也适用于对
system.zeros、system.zeros_mt(此前已支持system.numbers和system.numbers_mt)以及generateRandom表函数执行带 LIMIT 的简单查询。另外,如果记录总数大于max_rows_to_read限制,它会更早抛出异常。此更改关闭了 #58183。#61823(Alexey Milovidov)。 - 在 YAML 配置中添加对 "Merge Key" 的支持(这是 YAML 的一个奇怪特性,请不用在意)。#62685 (Azat Khuzhin).
- 当在 Replicated 源中使用非确定性函数时,改进错误信息。 #62896 (Grégoire Pineau).
- 修复通过
remote使用 Distributed over Distributed 时的 interserver secret 问题。 #63013 (Azat Khuzhin). - 为 YAML 文件新增对
include_from的支持,但更推荐使用config.d#63106 (Eduard Karacharov)。 - 从 skim 建议中选择后,保留终端中先前的数据。 #63261 (FlameFactory).
- 在 Pretty 系列格式或
visibleWidth函数中,字段宽度现在会正确忽略 ANSI 转义序列。#63270 (Shaun Struwig)。 - 在合适的情况下,将错误代码
NUMBER_OF_ARGUMENTS_DOESNT_MATCH替换为更精确的错误代码。#63406(Yohann Jardin)。 - 现在在 clickhouse-client 中,用于命令行提示的查询会正确设置
os_user和client_hostname。从而关闭了 #63430。#63433(Alexey Milovidov)。 - 如果
max_block_size为零,则自动将其恢复为默认值。#63587(Antonio Andelic)。 - 向 trace_log 添加一个 build_id 的 ALIAS 列,以便在检测到二进制文件变更时自动重命名。此更改用于解决 #52086。#63656(Zimu Li)。
- 为对象存储磁盘启用 truncate 操作。#63693(MikhailBurdukov)。
- 关键字列表的加载现在取决于服务器修订版本,并将在旧版 ClickHouse 服务器中被禁用。CC @azat。 #63786 (Nikita Mikhaylov)。
- ClickHouse 磁盘必须读取服务器配置才能获取实际的元数据格式版本。#63831 (Sema Checherinda)。
- 当 stdout 不是 TTY 时,取消美观输出格式的限制(
output_format_pretty_max_rows/output_format_pretty_max_value_width)。#63942 (Azat Khuzhin)。 - 现在在 AWS Lambda 中使用 ClickHouse 时,异常处理已能正常工作。作者:Alexey Coolnev。#64014(Alexey Milovidov)。
- 当通过 HTTP 传入的压缩数据无效时,抛出
CANNOT_DECOMPRESS而不是CORRUPTED_DATA。#64036 (vdimir)。 - 在 Pretty 格式中针对单个大数值的提示现在也适用于
Nullable和LowCardinality。由此关闭了 #61993。#64084(Alexey Milovidov)。 - 在基于索引的数据分片过滤相关位置添加指标、日志和线程名称。 #64130 (Alexey Milovidov).
- 在
ATTACH时忽略allow_suspicious_primary_key,并在ALTER时进行验证。#64202(Azat Khuzhin)。
构建 / 测试 / 打包改进
- ClickHouse 现使用 clang-18 构建,并启用了 clang-tidy-18 中的许多新检查。#60469 (Alexey Milovidov)。
- 实验性地支持 loongarch64 作为 ClickHouse 的新平台。#63733 (qiangxuhui)。
Dockerfile已在 https://github.com/docker-library/official-images/pull/15846 中通过 Docker 官方镜像库的审查。#63400 (Mikhail f. Shiryaev)。- 在 CI 中的每次构建中,会将每个翻译单元中每个符号的信息收集到 CI 数据库中。此更改关闭了 #63494。#63495 (Alexey Milovidov)。
- 更新 Apache Datasketches 库,解决了 #63858。#63923 (Alexey Milovidov)。
- 在交叉编译二进制文件时,为 aarch64 Linux 启用 GRPC 支持。#64072 (alesapin)。
- 修复 aarch64 上因信号栈过小导致在 SIGSEGV 时无法展开调用栈的问题。#64058 (Azat Khuzhin)。
错误修复
- 默认禁用
enable_vertical_final设置。由于该功能存在一个 bug,因此不应使用: #64543。#64544 (Alexander Tokmakov)。 - 修复在使用多个分片时创建备份的问题 #57684 (Vitaly Baranov)。
- 修复在
CREATE查询的列列表中定义的投影/索引/主键传递到物化视图内部表时的处理问题 #59183(Azat Khuzhin)。 - 修复 boundRatio 合并错误的问题 #60532 (Tao Wang)。
- 修复在对常量低基数列调用某些函数时发生的崩溃 #61966 (Michael Kolupaev)。
- 修复在表未使用 adaptive granularity 时,带 FINAL 的查询返回错误结果的问题 #62432 (Duc Canh Le).
- 改进对 cgroups v2 内存控制器支持的检测 #62903 (Robert Schulze)。
- 修复在客户端中后续使用外部表的问题 #62964 (Azat Khuzhin)。
- 修复在使用 untuple 和未解析的 lambda 表达式时发生的崩溃 #63131 (Raúl Marín)。
- 修复服务器过早开始监听连接的问题 #63181 (alesapin).
- 在执行 DROP PART 命令后重启时,修复相交的数据分片 #63202 (Han Fei)。
- 在启动时正确加载 SQL 安全默认值 #63209 (pufit).
- 修复用于过滤 JOIN 的 JOIN 过滤下推问题 #63234 (Maksim Kita).
- 修复 AzureObjectStorage::listObjects 中的死循环 #63257 (Julia Kartseva).
- CROSS JOIN 时忽略 join_algorithm 设置 #63273 (vdimir)。
- 修复 finalize WriteBufferToFileSegment 和 StatusFile 的问题 #63346 (vdimir).
- 在极少数情况下,修复了在执行 ALTER 后进行 SELECT 查询时可能出现的逻辑错误 #63353 (alesapin)。
- 使用
session_timezone修复X-ClickHouse-Timezone请求头 #63377 (Andrey Zvonov)。 - 修复在使用
WITH ROLLUP分组及 LowCardinality 类型时触发的调试断言 #63398 (Raúl Marín)。 - 针对
group_by_use_nulls的若干小修复 #63405 (vdimir)。 - 修复以下情况中的投影分片备份/恢复问题:投影已从表元数据中移除,但数据分片仍包含该投影时 #63426 (Kseniia Sumarokova).
- 修复 MySQL 字典数据源 #63481 (vdimir).
- 在 AsyncInsertFlush 未包含数据时插入 QueryFinish #63483 (Raúl Marín).
- 修复:
system.query_log中空的used_dictionaries字段 #63487(Eduard Karacharov)。 - 提高
MergeTreePrefetchedReadPool的安全性 #63513 (Antonio Andelic)。 - 修复在启用 Sentry 时程序退出时发生的崩溃(因为 OpenSSL 在 Sentry 之前被销毁)#63548(Azat Khuzhin)。
- 修复 Array 和 Map 在键控哈希中的支持 #63628 (Salvatore Mesoraca)。
- 修复 Parquet(以及可能是 StorageMerge)的过滤下推问题 #63642 (Michael Kolupaev).
- 在 ZooKeeper 路径已存在时防止转换为 Replicated #63670 (Kirill).
- Analyzer:视图只读取必要的列 #63688 (Maksim Kita)。
- Analyzer:禁止重新定义 WINDOW 子句 #63694 (Dmitry Novik)。
- flatten_nested 在实验性的 Replicated 数据库中存在问题。#63695 (Nikolai Kochetov).
- 修复 #63653 #63722(Nikolai Kochetov)。
- 允许将 Array(Nothing) 类型转换为 Map(Nothing, Nothing) #63753 (Nikolai Kochetov).
- 修复 partial_merge join 中的 ILLEGAL_COLUMN 错误 #63755 (vdimir).
- 修复:在窗口函数中移除冗余的 DISTINCT #63776(Igor Nikonov)。
- 修复可能在执行 SYSTEM UNLOAD PRIMARY KEY 时出现的崩溃 #63778 (Raúl Marín)。
- 修复一个包含循环重复别名的查询。 #63791 (Nikolai Kochetov).
- 将
TokenIterator按预期改为惰性迭代器 #63801 (Alexey Milovidov). - 添加用于 S3 URI 的
endpoint_subpath设置 #63806 (Julia Kartseva)。 - 修复
ParallelReadBuffer中的死锁问题 #63814(Antonio Andelic)。 - 修复 JOIN 过滤下推到等价列的问题 #63819 (Maksim Kita).
- 在 Lazy 数据库中执行 DROP 后,从所有磁盘删除数据。 #63848 (MikhailBurdukov).
- 修复在结合并行副本和新分析器从物化视图(MV)读取时会产生错误结果的问题 #63861(Nikita Taranov)。
- 修复 keeper-client 中
find_super_nodes和find_big_family命令的问题 #63862(Alexander Gololobov)。 - 更新 Lambda 执行名称 #63864 (Nikolai Kochetov).
- 修复 CPU/Real 分析器导致的 SIGSEGV 问题 #63865 (Azat Khuzhin).
- 修复
EXPLAIN CURRENT TRANSACTION查询 #63926 (Anton Popov). - 修复 analyzer:避免出现“无限递归”问题…… #63930 (Yakov Olkhovskiy).
- 允许在
plain_rewritable磁盘上使用某些 ALTER TABLE 命令 #63933(Julia Kartseva)。 - 修复递归 CTE 在分布式场景下的问题 #63939 (Maksim Kita)。
- Analyzer:修复 COLUMNS 解析 #63962 (Dmitry Novik).
- 在 analyzer 中新增对 LIMIT BY 和 skip_unused_shards 的支持 #63983(Nikolai Kochetov)。
- 修复 experimental Kusto 中的一些问题 #63992 (Yong Wang).
- 更安全地反序列化不受信任的二进制输入 #64024 (Robert Schulze)。
- 修复在底层表不属于 MergeTree 系列的 Distributed 表上,对设置
final= 1 的查询的分析问题。#64037(Nikolai Kochetov)。 - 为 recoverLostReplica 添加缺失的设置项 #64040 (Raúl Marín)。
- 通过 analyzer 修复 SQL 安全访问检查 #64079(pufit)。
- 修复 analyzer:DAG 中仅应使用插值表达式 #64096(Yakov Olkhovskiy)。
- 修复 Azure 备份在非原生复制场景下的问题:按 1 MiB(读取缓冲区大小)而不是
max_upload_part_size写入多部分块 #64117(Kseniia Sumarokova)。 - 在进行备份拷贝时正确回退 #64153(Antonio Andelic)。
- 防止在使用 CREATE TABLE 创建物化视图时出现 LOGICAL_ERROR #64174(Raúl Marín)。
- Query Cache:将针对不同数据库的相同查询视为不同的查询 #64199(Robert Schulze)。
- 在 Keeper 中忽略
text_log#64218 (Antonio Andelic)。 - 修复逻辑错误:在带有 PREWHERE 的 Buffer 表上进行了错误的类型转换。#64388 (Nikolai Kochetov).
ClickHouse 版本 24.4,2024-04-30
升级说明
clickhouse-odbc-bridge和clickhouse-library-bridge现在拆分为单独的包。已关闭 #61677。#62114(Alexey Milovidov)。- 不再允许将 max_parallel_replicas(用于实验性的副本并行读取)设置为
0,因为这没有意义。已关闭 #60140。#61201(Kruglov Pavel)。 - 移除了对
INSERT WATCH查询的支持(属于已弃用的LIVE VIEW功能的一部分)。#62382(Alexey Milovidov)。 - 移除了
optimize_monotonous_functions_in_order_by设置。#63004(Raúl Marín)。 - 从
Replicated数据库引擎中移除了 experimental 标记。现在它处于 Beta 阶段。#62937(Justin de Guzman)。
新功能
- 支持递归 CTE。 #62074 (Maksim Kita).
- 支持
QUALIFY子句。修复 #47819。 #62619 (Maksim Kita). - 现在表引擎可以被授予权限,并且这不会影响现有用户的行为。#60117 (jsc0218).
- 新增支持重写的 S3 磁盘,它支持 INSERT 操作且不需要在本地存储元数据。 #61116 (Julia Kartseva). 其主要用例是系统表。
- 客户端在输入时的语法高亮现在在语法级别生效(之前在词法分析级别生效)。 #62123 (Alexey Milovidov).
- 支持同时删除多个表,例如
DROP TABLE a, b, c。 #58705 (zhongyuankai). - 现在支持通过
ALTER MODIFY SETTING修改 memory 表的设置。例如:ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;。 #62039 (zhongyuankai). - 在 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). - 向
system.text_log添加了value1、value2、...、value10列。这些列包含用于格式化消息的值。 #59619 (Alexey Katsman). - 新增持久化虚拟列
_block_offset,用于存储在插入时分配的块中原始行号。可以通过 MergeTree 设置enable_block_offset_column启用_block_offset列的持久化。新增虚拟列_part_data_version,其中包含 part 的最小块号或 mutation 版本。持久化虚拟列_block_number不再被视为实验特性。 #60676 (Anton Popov). - 新增设置
input_format_json_throw_on_bad_escape_sequence,禁用该设置可以在 JSON 输入格式中保留错误的转义序列。 #61889 (Kruglov Pavel).
性能优化
- 基于等价集改进 JOIN 过滤下推。 #61216 (Maksim Kita).
- 如果在
JOIN之后的过滤条件总是过滤掉默认值,则会将OUTER JOIN优化为INNER JOIN。该优化可通过设置query_plan_convert_outer_join_to_inner_join来控制,默认启用。#62907(Maksim Kita)。 - 对 AWS S3 的改进。客户端必须向服务器发送
Keep-Alive: timeout=X头部。如果客户端从服务器接收到带有该头部的响应,则必须使用服务器返回的值。另外,为了避免因连接关闭竞态条件导致的问题,客户端最好不要使用即将过期的连接。 #62249 (Sema Checherinda). - 降低变更操作对 SELECT 的开销(v2)。 #60856 (Azat Khuzhin).
- PODArray 中更频繁调用的函数现在被强制内联。#61144(李扬)。
- 在读取完所有所需列后跳过对象的剩余部分,从而加速 JSON 解析。#62210 (lgbo).
- 改进使用 file/s3/hdfs/url/... 表函数从文件执行的简单 INSERT SELECT 操作。新增独立的 max_parsing_threads 设置项,用于控制并行解析时使用的线程数量。#62404 (Kruglov Pavel).
- 函数
to_utc_timestamp和from_utc_timestamp的执行速度现在提升了约 2 倍。#62583(KevinyhZou)。 - 当输入值大多无法解析时,函数
parseDateTimeOrNull、parseDateTimeOrZero、parseDateTimeInJodaSyntaxOrNull和parseDateTimeInJodaSyntaxOrZero的运行速度现在显著提升(提高 10 到 1000 倍)。#62634(LiuNeng)。 - 当
system.query_cache中包含大量条目(例如超过 100,000 条)时,对其执行的 SELECT 查询现在会明显更快。#62671(Robert Schulze)。 - 减少文件系统缓存争用(第 3 部分):在尝试预留空间时,无锁执行文件系统删除操作。 #61163 (Kseniia Sumarokova).
- 加速文件系统缓存大小的动态调整。 #61723 (Kseniia Sumarokova).
- 带有
INVALIDATE_QUERY的字典源在启动时不再被重新加载两次。#62050 (vdimir)。 - 修复了一个问题:当在涉及主键的布尔表达式后添加多余的
= 1或= 0时,主键索引不会被使用。例如,SELECT * FROM <table> WHERE <primary-key> IN (<value>) = 1和SELECT * FROM <table> WHERE <primary-key> NOT IN (<value>) = 0都会进行全表扫描,而本可以使用主键索引。#62142 (josh-hildred)。 - 从
system.remote_data_paths返回数据块流,而不是将整个结果累积为一个大块。这样可以减少内存使用、显示中间进度并允许取消查询。#62613 (Alexander Gololobov)。
实验特性
- 通过设置
azure_allow_parallel_part_upload,支持 Azure Blob Storage 的并行写入缓冲。#62534 (SmitaRKulkarni). - 用户态页缓存现在可以与静态 Web 存储(
disk(type = web))一起使用。通过将客户端设置use_page_cache_for_disks_without_file_cache设为1来启用。#61911 (Michael Kolupaev). - 在
Variant类型中,不再将 Bool 和数值分支视为可疑。#61999 (Kruglov Pavel). - 通过解析实现从 String 到
Variant的更优转换。#62005 (Kruglov Pavel). - 在 JSONExtract 函数中支持
Variant。#62014 (Kruglov Pavel). - 将类型
Variant标记为可比较类型,以便可以在主键中使用。#62693 (Kruglov Pavel).
改进
- 为方便起见,
SELECT * FROM numbers()将与SELECT * FROM system.numbers以相同方式工作——不会有任何限制。#61969(YenchangChan)。 - 为 Kafka 配置引入独立的 consumer/producer 标签。这样可以避免来自 librdkafka(一个有很多 bug 的质量较差的 C 库)的警告,即为 producer 实例指定了 consumer 属性,反之亦然(例如
Configuration property session.timeout.ms is a consumer property and will be ignored by this producer instance)。关闭问题:#58983。#58956(Aleksandr Musorin)。 - 函数
date_diff和age现在以纳秒级而非微秒级精度计算结果。它们现在还为参数unit提供nanosecond(或nanoseconds或ns)作为可选值。#61409 (Austin Kothig)。 - 为
date_trunc新增了纳秒、微秒和毫秒单位。 #62335 (Misz606). - 在重新加载证书时同时重新加载证书链。 #61671 (Pervakov Grigorii).
- 通过在该副本路径存在活动副本时禁止附加表,来尝试防止错误 #60432。#61876(Arthur Passos)。
- 为
clickhouse-local添加对input的支持。 #61923 (Azat Khuzhin). - 严格性为
ANY的Join表引擎在重新加载后保持一致性。当插入多行具有相同键的记录时,第一行将具有更高优先级(之前是在表加载时随机选择其中一行)。修复 #51027。#61972(vdimir)。 - 根据 Apache Arrow 模式自动推断 Nullable 列类型。#61984 (Maksim Kita)。
- 支持在聚合过程中取消聚合状态的并行合并。例如:
uniqExact。#61992 (Maksim Kita)。 - 使用
system.keywords来填充这些建议,并在所有内部位置统一使用它们。#62000(Nikita Mikhaylov)。 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)。 CREATE AS语句会复制表的注释。 #62117 (Pablo Marcos)。- 为 zookeeper 表添加查询进度信息。 #62152 (JackyWoo).
- 新增在服务器范围内启用 trace collector(Real 和 CPU)的功能。 #62189 (alesapin).
- 新增设置项
lightweight_deletes_sync(默认值:2 —— 同步等待所有副本)。它类似于设置项mutations_sync,但只影响轻量级删除的行为。#62195 (Anton Popov). - 在为自定义设置解析值时,区分布尔值和整数:
SET custom_a = true; SET custom_b = 1;。#62206(Vitaly Baranov)。 - 通过 AWS PrivateLink 接口端点支持访问 S3。解决了 #60021、#31074 和 #53761。#62208(Arthur Passos)。
- 不要在 clickhouse-client 中为 UDF 创建不存在的目录。此更改修复了 #59597。#62366(Alexey Milovidov)。
- 查询缓存现在不再缓存对系统表(
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).- 在 macOS 上将默认安装目录从
/usr/bin更改为/usr/local/bin。这是必要的,因为自 macOS El Capitan(2015)起引入的 Apple 系统完整性保护功能(System Integrity Protection)会阻止向/usr/bin写入内容,即使使用sudo也不行。#62489 (haohang)。 - 让 transform 始终返回第一个匹配结果。#62518 (Raúl Marín)。
- 为系统表
blob_storage_log添加了缺失的hostname列。#62456 (Jayme Bird)。 - 为了与其他系统表保持一致,
system.backup_log现在包含一列event_time。#62541 (Jayme Bird). - 表
system.backup_log现在具有默认排序键event_date, event_time,与其他_log表引擎相同。#62667(Nikita Mikhaylov)。 - 避免在执行
RESTORE时对表的 DEFAULT 表达式进行求值。 #62601 (Vitaly Baranov). - S3 存储和备份也需要与 S3 磁盘相同的默认 keep-alive 设置。#62648 (Sema Checherinda)。
- 将以 Bug 众多而臭名昭著的 C 库 librdkafka 的客户端标识符添加到日志消息中,以便区分同一张表中来自不同消费者的日志消息。#62813 (János Benjamin Antal)。
- 在 Replicated 数据库的 ZooKeeper 路径中允许使用特殊宏
{uuid}和{database}。 #62818 (Vitaly Baranov). - 允许在 HTTP 请求中为不同的身份验证方案使用配额键。#62842(Kseniia Sumarokova)。
- 降低
clickhouse client和clickhouse local中命令行参数--help的输出详细程度。此前的输出现在可通过--help --verbose生成。#62973 (Yarik Briukhovetskyi). log_bin_use_v1_row_events在 MySQL 8.3 中被移除,我们针对此对实验性的MaterializedMySQL引擎进行了调整 #60479。#63101(Eugene Klimov)。作者:Nikolay Yankin。
构建/测试/打包改进
- 对 Rust 依赖进行 vendoring,这样我们为了一些“博眼球和图一乐”的小功能而使用的 Rust 代码,就可以像 C++ 一样以合理的方式完成构建。#62297(Raúl Marín)。
- ClickHouse 现在使用 OpenSSL 3.2,而不再使用 BoringSSL。#59870(Robert Schulze)。请注意,OpenSSL 整体而言在工程实践方面略逊一筹(例如存在一定数量的 sanitizer 报告,需要我们打补丁处理,以及依赖大量生成文件的复杂构建系统等),但在兼容性方面表现更好。
- 在压力测试中以 1/2 的概率忽略 DROP 查询,在对 Memory/JOIN 表进行升级检查时改为使用 TRUNCATE,而不是忽略 DROP。 #61476 (Kruglov Pavel).
- 将位于 /etc/clickhouse-keeper 和 /var/log/clickhouse-keeper 的卷从 Keeper Docker 镜像中移除。 #61683 (Tristan).
- 为默认启用 Analyzer 后已不再相关的所有问题添加测试。 Closes: #55794 Closes: #49472 Closes: #44414 Closes: #13843 Closes: #55803 Closes: #48308 Closes: #45535 Closes: #44365 Closes: #44153 Closes: #42399 Closes: #27115 Closes: #23162 Closes: #15395 Closes: #15411 Closes: #14978 Closes: #17319 Closes: #11813 Closes: #13210 Closes: #23053 Closes: #37729 Closes: #32639 Closes: #9954 Closes: #41964 Closes: #54317 Closes: #7520 Closes: #36973 Closes: #40955 Closes: #19687 Closes: #23104 Closes: #21584 Closes: #23344 Closes: #22627 Closes: #10276 Closes: #19687 Closes: #4567 Closes: #17710 Closes: #11068 Closes: #24395 Closes: #23416 Closes: #23162 Closes: #25655 Closes: #11757 Closes: #6571 Closes: #4432 Closes: #8259 Closes: #9233 Closes: #14699 Closes: #27068 Closes: #28687 Closes: #28777 Closes: #29734 Closes: #61238 Closes: #33825 Closes: #35608 Closes: #29838 Closes: #35652 Closes: #36189 Closes: #39634 Closes: #47432 Closes: #54910 Closes: #57321 Closes: #59154 Closes: #61014 Closes: #61950 Closes: #55647 Closes: #61947. #62185 (Nikita Mikhaylov).
- 从已不再适用或已被 analyzer 修复的问题中添加更多测试用例。关闭:#58985 关闭:#59549 关闭:#36963 关闭:#39453 关闭:#56521 关闭:#47552 关闭:#56503 关闭:#59101 关闭:#50271 关闭:#54954 关闭:#56466 关闭:#11000 关闭:#10894 关闭:https://github.com/ClickHouse/ClickHouse/issues/448 关闭:#8030 关闭:#32139 关闭:#47288 关闭:#50705 关闭:#54511 关闭:#55466 关闭:#58500 关闭:#39923 关闭:#39855 关闭:#4596 关闭:#47422 关闭:#33000 关闭:#14739 关闭:#44039 关闭:#8547 关闭:#22923 关闭:#23865 关闭:#29748 关闭:#4222。#62457(Nikita Mikhaylov)。
- 修复了在 OpenSSL 采用动态链接方式时的构建错误(注意:这通常不受支持,仅在 IBM 的 s390x 平台上才需要)。#62888 (Harry Lee)。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复在回滚仲裁插入事务时出现的逻辑错误。 #61953 (Han Fei).
- 修复在将 COUNT(*) 与 FILTER 子句一起使用时出现的解析错误 #61357(Duc Canh Le)。
- 修复在同时使用
group_by_use_nulls、grouping sets、analyzer 和 materialize/constant 时出现的逻辑错误 #61567 (Kruglov Pavel). - 在删除已移动的数据分片前先取消合并 #61610 (János Benjamin Antal)。
- 修复 Apache Arrow 中的异常终止问题 #61720(Kruglov Pavel)。
- 在与特定磁盘对应的正确路径下查找
convert_to_replicated标志 #61769(Kirill)。 - 修复 distributed_foreground_insert/distributed_background_insert_batch 中可能出现的连接数据竞争问题 #61867 (Azat Khuzhin).
- 将 CANNOT_PARSE_ESCAPE_SEQUENCE 错误标记为解析错误,以便在行输入格式中可以跳过它 #61883 (Kruglov Pavel)。
- 在使用
http_wait_end_of_query时,修复通过 HTTP 输出格式写入异常消息的行为 #61951(Kruglov Pavel)。 - 已正确修复 LowCardinality 与 JSONExtract 函数组合使用时的问题 #61957 (Nikita Mikhaylov)。
- 如果
Row Policy未设置表达式,则会在Engine Merge中触发崩溃 #61971(Ilya Golshtein)。 - 修复 WriteBufferAzureBlobStorage 析构函数中未捕获的异常 #61988 (SmitaRKulkarni)。
- 修复针对 ReplicatedMergeTree 的未带列定义的 CREATE TABLE 语句的问题 #62040 (Azat Khuzhin).
- 针对复合分片键修复 optimize_skip_unused_shards_rewrite_in 的行为 #62047 (Azat Khuzhin).
- ReadWriteBufferFromHTTP 在发生重定向时会设置正确的
Host请求头 #62068 (Sema Checherinda). - 修复外部表无法解析 Bool 数据类型的问题 #62115(Duc Canh Le)。
- Analyzer:修复查询参数解析问题 #62186 (Dmitry Novik)。
- 修复在只读模式下恢复 parts 的问题 #62207 (Vitaly Baranov).
- 修复在索引定义中使用 SQL UDF 时导致的崩溃 #62225 (vdimir)。
- 修复在 analyzer 中 generateRandom 的 NULL 随机种子问题。#62248 (Nikolai Kochetov).
- 在 Distinct Transform 中正确处理 const 列 #62250 (Antonio Andelic).
- 修复 Parts Splitter 以支持带有 FINAL 修饰符的查询 #62268 (Nikita Taranov).
- Analyzer:修复别名到参数化视图的解析 #62274 (Dmitry Novik)。
- Analyzer:修复父级作用域中的名称解析问题 #62281 (Dmitry Novik)。
- 修复 argMax 在可为空的非原生数值列上的问题 #62285 (Raúl Marín)。
- 修复 Ordinary 数据库中物化视图的 BACKUP 和 RESTORE 功能 #62295 (Vitaly Baranov)。
- 修复 Context 中标量数据竞争 #62305 (Kruglov Pavel).
- 修复物化视图中的主键 #62319 (Murat Khairulin).
- 不要为不支持该特性的表构建多线程插入流水线 #62333 (vdimir)。
- 修复在分布式查询中处理位置参数的分析器 #62362 (flynn)。
- 在 analyzer 中修复 Merge 引擎对
additional_table_filters的过滤下推 #62398 (Kruglov Pavel)。 - 使用 Analyzer 修复 GLOBAL IN 表查询。#62409 (Nikolai Kochetov)。
- 在分区写入期间遵循 s3/hdfs/azure 引擎中的 truncate_on_insert 和 create_new_file_on_insert 设置 #62425 (Kruglov Pavel)。
- 修复 AzureBlobStorage 备份恢复路径 #62447 (SmitaRKulkarni).
- 修复 SimpleSquashingChunksTransform #62451 (Nikita Taranov)。
- 修复嵌套 lambda 的捕获问题。 #62462 (Nikolai Kochetov).
- 在读取包含递归类型的 Protobuf 数据时避免崩溃 #62506 (Raúl Marín)。
- 修复在将分区从某处移动到其自身时的 bug #62524 (helifu)。
- 修复 LIMIT 子句中的标量子查询 #62567 (Nikolai Kochetov).
- 修复实验性且不受支持的 Hive 引擎中的段错误,反正我们本来也不太喜欢它 #62578 (Nikolay Degterinsky)。
- 修复
groupArraySorted中的内存泄漏 #62597(Antonio Andelic)。 - 修复 largestTriangleThreeBuckets 中导致的崩溃 #62646 (Raúl Marín)。
- 修复在更大时间粒度下 tumble[Start,End] 和 hop[Start,End] 的行为 #62705 (Jordi Villar)。
- 修复 argMin/argMax 组合器状态 #62708 (Raúl Marín)。
- 修复由于缓存锁争用优化导致缓存中临时数据写入失败的问题 #62715 (Kseniia Sumarokova).
- 修复函数
mergeTreeIndex中的崩溃问题 #62762 (Anton Popov). - 修复:更新:嵌套物化列:修复大小检查问题 #62773 (Eliot Hautefeuille).
- 修复在使用 analyzer 的 CTE 中 FINAL 修饰符未正确生效的问题 #62811 (Duc Canh Le)。
- 修复在 HTTP 接口使用
JSON格式时导致formatRow函数崩溃的问题 #62840 (Anton Popov). - Azure:修复从 endpoint 对象构建最终 URL 的方式 #62850 (Daniel Pozo Escalona).
- 修复 GCD 编解码器 #62853(Nikita Taranov)。
- 修复超矩形中的 LowCardinality(Nullable) 键问题 #62866 (Amos Bird).
- 修复在输入值超出 UInt32 范围时,
fromUnixtimestamp使用 joda 语法时的行为 #62901(KevinyhZou)。 - 禁用针对 sum(nullable) 的 optimize_rewrite_aggregate_function_with_if #62912 (Raúl Marín).
- 修复在源表列类型不一致时对 StorageBuffer 使用 PREWHERE 的问题。 #62916 (Nikolai Kochetov).
- 修复缓存中临时数据在处理缓存键目录创建失败情况时的不正确行为 #62925 (Kseniia Sumarokova)。
- gRPC:修复 IPv6 对端连接时的崩溃 #62978 (Konstantin Bogdanov)。
- 在副本拉取期间修复可能出现的 CHECKSUM_DOESNT_MATCH(及其他)错误 #62987 (Azat Khuzhin)。
- 修复因缓存临时数据中的未捕获异常导致的终止 #62998 (Kseniia Sumarokova).
- 修复
optimize_rewrite_aggregate_function_with_if中的隐式类型转换问题 #62999(Raúl Marín)。 - 修复 ~RestorerFromBackup 中未处理的异常 #63040(Vitaly Baranov)。
- 不要从二级查询的 GROUP BY 键中移除服务器常量。 #63047 (Nikolai Kochetov).
- 修复对 abs 函数单调性的错误判断 #63097 (Duc Canh Le).
- 为 MongoDB 引擎的 SSL 握手设置服务器名称 #63122 (Alexander Gololobov)。
- 在 MongoDB wire 协议版本检查时,使用用户指定的数据库而不是 “config” #63126 (Alexander Gololobov)。
ClickHouse 24.3 LTS 版本,2024-03-27
升级注意事项
allow_experimental_analyzer设置默认启用,它会将查询分析切换为新的实现方式,该实现具有更好的兼容性和更完备的功能。功能 “analyzer” 现被视为 beta,而非 experimental。你可以通过将compatibility设置为24.2,或禁用allow_experimental_analyzer设置来恢复旧行为。在 YouTube 上观看视频。- ClickHouse 的 String 数据类型通常用于存储 UTF-8 编码的数据,但也允许任意二进制数据。Parquet/ORC/Arrow 中的 String 类型仅支持 UTF-8。这就是为何在为 ClickHouse 的 String 数据类型选择 Arrow 数据类型时,可以在
String和Binary之间进行选择。这由设置output_format_parquet_string_as_string、output_format_orc_string_as_string、output_format_arrow_string_as_string控制。尽管从语义和兼容性上看,使用Binary更为严谨,但在大多数情况下,默认使用String更符合用户预期。 - 在新版本的 ClickHouse 中,当所有参数都是 Float64 时,函数
geoDistance、greatCircleDistance和greatCircleAngle在内部计算以及返回类型上都将使用 64 位双精度浮点数据类型。这解决了 #58476。在之前的版本中,这些函数始终使用 Float32。可以通过将geo_distance_returns_float64_on_float64_arguments设为false,或将compatibility设为24.2或更早版本,来切换回旧的行为方式。#61848(Alexey Milovidov)。与 Geet Patel 共同完成。 - 自 23.5 版本起,已废弃的内存数据分片(in-memory data parts)被标记为弃用,并且自 23.10 版本起不再受支持。现在,剩余的相关代码已被移除。这是对 #55186 和 #45409 的后续工作。你很可能并未使用过内存数据分片,因为它们仅在 23.5 版本之前可用,并且只有在你为某个 MergeTree 表手动指定相应 SETTINGS 时才会启用。要检查是否存在内存数据分片,请运行以下查询:
SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type。要禁用内存数据分片的使用,请执行:ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT。在从旧版 ClickHouse 升级之前,请先检查是否仍存在内存数据分片。如果存在内存数据分片,先禁用其使用,然后等待直到不再有内存数据分片,再继续升级。#61127(Alexey Milovidov)。 - 在
system.zookeeper表中将列名从duration_ms更改为duration_microseconds,以反映该持续时间实际上是微秒级分辨率。#60774(Duc Canh Le)。 - 当查询级别设置
async_insert和deduplicate_blocks_in_dependent_materialized_views同时启用时,拒绝接收传入的 INSERT 查询。此行为由设置throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert控制,且默认开启。这是对 https://github.com/ClickHouse/ClickHouse/pull/59699 的延续,用于解除对 https://github.com/ClickHouse/ClickHouse/pull/59915 的阻塞。#60888(Nikita Mikhaylov)。 - 实用工具
clickhouse-copier已移至 GitHub 上的独立仓库:https://github.com/ClickHouse/copier。它不再包含在发行版中,但仍可单独下载。据此关闭:#60734 据此关闭:#60540 据此关闭:#60250 据此关闭:#52917 据此关闭:#51140 据此关闭:#47517 据此关闭:#47189 据此关闭:#46598 据此关闭:#40257 据此关闭:#36504 据此关闭:#35485 据此关闭:#33702 据此关闭:#26702。 - 为了提高与 MySQL 的兼容性,兼容性别名
locate现在默认接受参数(needle, haystack[, start_pos])。可以通过将function_locate_has_mysql_compatible_argument_order设置为 0 来恢复之前的行为(haystack, needle[, start_pos])。#61092(Robert Schulze)。 - 默认禁止在
MergeTree表的ORDER BY中使用SimpleAggregateFunction(与禁止AggregateFunction的情况类似,它们之所以被禁止,是因为不可比较),可通过allow_suspicious_primary_key选项放宽限制以允许使用。 #61399 (Azat Khuzhin). Ordinary数据库引擎已弃用。如果服务器正在使用该引擎,clickhouse-client 中会显示警告。这一变更关闭了 #52229。#56942(shabroo)。
新功能
- 支持以
tar格式读写备份(除了现有的zip之外)。#59535 (josh-hildred). - 实现对 S3 Express 存储桶的支持。#59965 (Nikita Taranov).
- 允许从不同的磁盘附加数据分片(使用复制而不是硬链接)。#60112 (Unalian).
- 具有大小上限的
Memory表:通过其设置min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep和max_rows_to_keep来控制。#60612 (Jake Bamrah). - 将等待中的查询和执行中的查询的限制分开。新增服务器设置
max_waiting_queries,用于限制由于async_load_databases而处于等待状态的查询数量。现有的执行中查询数量限制不再统计等待中的查询。#61053 (Sergei Trifonov). - 新增表
system.keywords,其中包含解析器中的所有关键字,主要用于更好的模糊测试(fuzzing)和语法高亮。#51808 (Nikita Mikhaylov). - 增加对
ATTACH PARTITION ALL的支持。#61107 (Kirill Nikiforov). - 新增函数
getClientHTTPHeader。修复了 #54665,与 @lingtaolf 共同完成。#61820 (Alexey Milovidov). - 将
generate_series作为一个表函数添加(对 PostgreSQL 的兼容别名,对应已有的numbers函数)。该函数生成一个包含自然数等差数列的表。#59390 (divanik). - 为
topK/topkWeighed增加一种模式,该模式返回各值的计数及其误差。#54508 (UnamedRus). - 新增函数
toMillisecond,用于返回DateTime或DateTime64类型值的毫秒部分。#60281 (Shaun Struwig). - 允许为 clickhouse-server 配置 HTTP 重定向处理器。例如,可以将
/重定向到 Play UI。#60390 (Alexey Milovidov).
性能优化
- 优化了函数
dotProduct,以避免不必要且代价高昂的内存拷贝。 #60928 (Robert Schulze)。 - 256 位整数的输出速度提升了 30 倍。#61100(Raúl Marín)。
- 如果表的主键包含大量无用的列,就不要把这些列保留在内存中。这个行为由一个新的设置
primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns控制,默认值为0.9,这意味着:对于复合主键,如果某一列在至少 90% 的情况下其取值都会发生变化,则其后的列将不会被加载到内存中。#60255(Alexey Milovidov)。 - 在涉及多个
Nullable列的场景下,提升序列化的聚合方法的性能。#55809 (Amos Bird). - 延迟生成 JSON 输出,以提升 ALL JOIN 的性能。 #58278 (LiuNeng).
- 使与外部服务(例如 AWS S3)的 HTTP/HTTPS 连接在所有场景中都可复用,即使响应为 3xx 或 4xx 时仍然如此。#58845(Sema Checherinda)。
- 对聚合函数
argMin/argMax/any/anyLast/anyHeavy以及ORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1查询进行了优化。#58640(Raúl Marín)。 - 对列过滤器进行简单优化,在部分情况下可将峰值内存降低至原来的 44%。 #59698 (李扬).
- 当结果类型的基础类型为数值类型时,以列式方式执行
multiIf函数。#60384 (李扬). - 更快的互斥锁(几乎快 2 倍)。 #60823 (Azat Khuzhin).
- 在分布式查询结束时并行清理多个连接。#60845 (lizhuoyu5).
- 优化
Nullable数值列或Nullable字符串列之间的数据移动,从而提升了一些微基准测试的性能。#60846 (李扬)。 - 对文件系统缓存的操作受到锁竞争影响会更小。#61066 (Alexey Milovidov).
- 通过阻止编译器产生错误优化来改进 array join 和其他 JOIN 的性能。关闭 #61074。 #61075(李扬)。
- 如果一个带有语法错误的查询中包含使用正则表达式的
COLUMNS匹配器,那么在解析器回溯时每次都会重新编译该正则表达式,而不是只编译一次。这是一个根本性错误。编译后的正则表达式被放入 AST 中。但 AST 中的字母 A 表示 “abstract”(抽象),这意味着它不应包含重量级对象。AST 的部分节点在解析过程中会被不断创建和丢弃,包括在大量回溯的情况下。这样会导致解析端变慢,从而使只读用户也可以发起 DoS 攻击。但主要问题在于,它会阻碍模糊测试工具(fuzzer)的进展。#61543(Alexey Milovidov)。 - 添加一个新的 analyzer pass,在单值场景下优化 IN 运算符。#61564(LiuNeng)。
- DNSResolver 会对解析得到的 IP 集合进行乱序,以便更均匀地利用 AWS S3 的多个端点。 #60965 (Sema Checherinda).
实验性特性
- 支持对 Azure Blob Storage 进行并行读取。这提升了实验性 Azure 对象存储的性能。#61503 (SmitaRKulkarni)。
- 为 Azure Blob Storage 添加类似于 S3 的异步 WriteBuffer。这提升了实验性 Azure 对象存储的性能。#59929 (SmitaRKulkarni)。
- 在使用 Azure Blob Storage 时,对备份 I/O 使用托管身份。新增一个设置,用于阻止 ClickHouse 尝试创建不存在的容器,因为这需要存储账户级别的权限。#61785 (Daniel Pozo Escalona)。
- 新增设置
parallel_replicas_allow_in_with_subquery = 1,允许在使用并行副本时,IN 子句中使用子查询。#60950 (Nikolai Kochetov)。 - 针对“zero-copy”复制的变更:当表被删除时,与该表相关的所有 zero-copy 锁都必须被释放,包含这些锁的目录也必须被删除。#57575 (Sema Checherinda)。
改进
- 将
MergeTree用作默认的表引擎。#60524 (Alexey Milovidov) - 默认启用
output_format_pretty_row_numbers。这有助于提升可用性。 #61791 (Alexey Milovidov). - 在之前的版本中,某些 Pretty 格式中的数字还不够“美观”。#61794(Alexey Milovidov)。
- 在 Pretty 格式中,如果结果集中只有一个值,那么这个较长的值将不会被截断,例如
SHOW CREATE TABLE查询的结果。#61795 (Alexey Milovidov)。 - 与
clickhouse-local类似,clickhouse-client也会接受--output-format选项,将其视为--format选项的同义形式。此更改关闭了 #59848。#61797(Alexey Milovidov)。 - 如果 stdout 指向终端且未指定输出格式,
clickhouse-client和类似工具将默认使用PrettyCompact,与交互模式相同。clickhouse-client和clickhouse-local将以统一方式处理用于输入和输出格式的命令行参数。此更改解决了 #61272。#61800(Alexey Milovidov)。 - 在 Pretty 格式中使用下划线分隔数字分组,以提高可读性。该行为由一个新的设置项
output_format_pretty_highlight_digit_groups控制。#61802(Alexey Milovidov)。 - 支持通过
SYSTEM FLUSH DISTRIBUTED覆盖初始 INSERT 设置。#61832 (Azat Khuzhin). - 默认启用处理器性能分析(针对排序、聚合等操作记录耗时以及输入/输出字节数)。 #61096 (Azat Khuzhin).
- Filesystem 数据库现已支持不带格式扩展名的文件。 #60795 (Kruglov Pavel).
- 将所有格式名称改为大小写不敏感,例如 Tsv、TSV、tsv,甚至 rowbinary。 #60420 (豪肥肥)。如果你能继续使用规范写法,我会非常感激,例如写成
JSON😇,而不是Json🤮,不过如果你按自己喜欢的方式拼写,我们也不介意。 - 在
distributed_ddl_output_mode设置中新增none_only_active模式。#60340 (Alexander Tokmakov)。 - 高级仪表板略微改进了多线图的配色效果。#60391(Alexey Milovidov)。
- 现在,高级仪表盘在滚动时控件始终可见。这样你就可以在不向上滚动的情况下添加新图表。#60692 (Alexey Milovidov).
- 在对物化视图运行
MODIFY COLUMN查询时,检查内部表的结构,确保所有列都存在。#47427 (sunny)。 String类型和Enum可以在同一上下文中使用,例如数组、UNION查询和条件表达式。此变更关闭了 #60726。#60727(Alexey Milovidov)。- 允许在用于查询处理的外部数据结构中声明 Enum 枚举类型(这是一个可供查询使用的即时临时表)。#57857 (Duc Canh Le)。
- 在选择要合并的部分时,将轻量级删除的行纳入考虑,从而更准确地估算合并后部分的磁盘大小。#58223 (Zhuo Qiu).
- 为更多系统表的列添加了注释,是对 https://github.com/ClickHouse/ClickHouse/pull/58356 的后续。#59016(Nikita Mikhaylov)。
- 现在我们可以在 PREWHERE 中使用虚拟列了,这对于
_part_offset这类非常量虚拟列尤其有意义。#59033 (Amos Bird)。改进了虚拟列的整体易用性。现在允许在PREWHERE中使用虚拟列(对于_part_offset这类非常量虚拟列来说尤其有用)。同时还为虚拟列提供了内置文档:在启用describe_include_virtual_columns设置时,可以在DESCRIBE查询中以列注释的形式查看。#60205 (Anton Popov)。 - 对象存储不再使用固定密钥,而是改为生成密钥,用于判断是否具备删除对象的能力。#59495 (Sema Checherinda).
- 允许使用 "local" 作为对象存储类型,而不是 "local_blob_storage"。#60165 (Kseniia Sumarokova).
- 在执行
DETACH/ 服务器关闭以及执行SYSTEM FLUSH DISTRIBUTED时,对 Distributed 引擎中挂起的 INSERT 数据块进行并行刷新(只有当表配置了多磁盘策略时,并行才会生效,这与当前 Distributed 引擎中的所有内容类似)。 #60225 (Azat Khuzhin). - 添加一个设置,用于在合并时强制使用读通缓存(read-through cache)。 #60308 (Kseniia Sumarokova).
- 对 MySQL 兼容协议的改进。Issue #57598 提到了在事务处理方面存在的行为差异:当没有活动事务时执行的 COMMIT/ROLLBACK 会被报错,这与 MySQL 的行为不同。#60338(PapaToemmsn)。
- 函数
substring新增了别名byteSlice。#60494 (Robert Schulze)。 - 将服务器设置项
dns_cache_max_size重命名为dns_cache_max_entries以减少歧义。#60500 (Kirill Nikiforov)。 SHOW INDEX | INDEXES | INDICES | KEYS不再按主键列排序(因为这在直觉上不太合理)。#60514 (Robert Schulze)。- Keeper 改进:在启动过程中如果检测到无效快照则中止启动,以避免数据丢失。#60537 (Antonio Andelic)。
- 将 tzdata 更新至 2024a 版本。 #60768 (Raúl Marín).
- Keeper 改进:在 Keeper 的配置中支持
leadership_expiry_ms。#60806 (Brokenice0415). - 无论
input_format_try_infer_exponent_floats设置为何值,在 JSON 格式中始终推断指数形式的数字。新增设置input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects,用于在根据 JSON 对象推断命名 Tuple 时,对存在歧义的路径使用 String 类型,而不是抛出异常。 #60808 (Kruglov Pavel). - 新增对 MySQL 中常用的
START TRANSACTION语法的支持,解决 https://github.com/ClickHouse/ClickHouse/discussions/60865。#60886(Zach Naimon)。 - 为全排序 merge join 算法添加一个开关,用于将 null 视为最大或最小值,从而使其行为可以与其他 SQL 系统(例如 Apache Spark)兼容。#60896 (loudongfeng)。
- 支持在
clickhouse-client和clickhouse-local中根据文件扩展名自动检测输出格式。#61036 (豪肥肥)。 - 当 Linux 的 cgroups 值发生变化时,运行时更新内存限制。#61049 (Han Fei).
- 添加之前因疏忽遗漏的函数
toUInt128OrZero(该错误与 https://github.com/ClickHouse/ClickHouse/pull/945 相关)。兼容性别名FROM_UNIXTIME和DATE_FORMAT(它们不是 ClickHouse 原生函数,仅用于 MySQL 兼容性)已改为大小写不敏感,以符合 SQL 兼容性别名的预期行为。#61114(Alexey Milovidov)。 - 改进了访问检查逻辑,现在即使目标用户既不实际持有某些权限,也没有相应的授予权限,也允许撤销这些权限。例如:
GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;。#61115(pufit)。 - 修复
has()函数在处理Nullable列时的问题(修复 #60214)。#61249(Mikhail Koviazin)。 - 现在,在针对子树
<include from_zk="/path" merge="true">的配置替换中,可以指定属性merge="true"。如果指定了该属性,ClickHouse 将把该子树与现有配置进行合并;否则,默认行为是将新内容追加到配置中。#61299 (alesapin)。 - 为虚拟内存映射添加了异步指标:
VMMaxMapCount和VMNumMaps。解决了 #60662 中的问题。 #61354(Tuan Pham Anh)。 - 在所有需要创建临时数据的场景中使用
temporary_files_codec配置项,例如外部内存排序和外部内存 GROUP BY。此前它仅在partial_mergeJOIN 算法中生效。#61456 (Maksim Kita)。 - 新增配置项
max_parser_backtracks,用于限制查询解析的复杂度。 #61502 (Alexey Milovidov). - 在动态调整文件系统缓存大小期间的争用更少。#61524 (Kseniia Sumarokova).
- 不再允许使用 StorageS3 queue 的分片模式,该部分即将被重写。 #61537 (Kseniia Sumarokova).
- 修复拼写错误:将
use_leagcy_max_level更正为use_legacy_max_level。 #61545 (William Schoeffel)。 - 删除
system.blob_storage_log中的一些重复条目。 #61622 (YenchangChan). - 添加了
current_user函数,作为与 MySQL 兼容的别名。#61770(Yarik Briukhovetskyi)。 - 修复在混合 x86-64 / ARM 集群中浮点数聚合函数状态不一致的问题 #60610 (Harry Lee)。
构建 / 测试 / 打包改进
- 实时查询分析器现在支持在 AArch64 上运行。在之前的版本中,只有当程序没有在系统调用(syscall)中耗时时,它才会生效。#60807 (Alexey Milovidov)。
- 已将 ClickHouse 版本添加到 Docker 标签中。已关闭 #54224。#60949 (Nikolay Monkov)。
- 将
prqlc升级到 0.11.3。#60616 (Maximilian Roos)。 - 在
clickhouse-local中添加通用查询文本模糊测试工具。#61508 (Alexey Milovidov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复 MergeTree 中
finished_mutations_to_keep=0的行为(因为文档说明 0 表示保留全部) #60031 (Azat Khuzhin)。 - FINAL 优化出了问题,作者将其描述为:“PartsSplitter invalid ranges for the same part”。#60041(Maksim Kita)。
- Apache Hive 存在一些问题,该功能目前为实验性且不受支持。 #60262 (shanfengp).
- 对实验性并行副本的改进:当并行副本发生变更时强制重新分析 #60362(Raúl Marín)。
- 修复在新的 disks 配置选项中对 plain 元数据类型的使用问题 #60396(Kseniia Sumarokova)。
- 尝试修复 mapContainsKeyLike 中的逻辑错误 “Cannot capture column because it has incompatible type” #60451(Kruglov Pavel)。
- 避免在 CREATE TABLE 中计算标量子查询。 #60464 (Nikolai Kochetov).
- 修复在并行解析过程中,当大量行因错误被跳过时出现的死锁 #60516 (Kruglov Pavel).
- 实验性 KQL(Kusto)支持存在问题:修复了
max_query_size_for_kql_compound_operator:#60534(Yong Wang)。 - Keeper 修复:在等待提交日志时添加超时 #60544 (Antonio Andelic)。
- 不再为日期类型输出数字提示信息 #60577 (Raúl Marín).
- 修复在过滤条件中使用非确定性函数从 MergeTree 读取时的问题 #60586 (Kruglov Pavel).
- 修复由错误的兼容性设置值类型导致的逻辑错误 #60596 (Kruglov Pavel)。
- fix(prql): 更健壮的 panic 处理程序 #60615 (Maximilian Roos).
- 修复
intDiv对 decimal 和 date 类型参数的处理 #60672(Yarik Briukhovetskyi)。 - 修复:在 ALTER MODIFY 查询中展开 CTE #60682 (Yakov Olkhovskiy).
- 修复在非 Atomic/Ordinary 数据库引擎(如 Memory)中使用 system.parts 时的问题 #60689(Azat Khuzhin)。
- 修复参数化视图中出现的 "Invalid storage definition in metadata file" 错误 #60708 (Azat Khuzhin).
- 修复 CompressionCodecMultiple 中的缓冲区溢出问题 #60731(Alexey Milovidov)。
- 从 SQL/JSON 中移除无效内容 #60738 (Alexey Milovidov).
- 删除聚合函数 quantileGK 中错误的断言 #60740 (李扬).
- 通过将 streams 设置为 1,修复 insert-select + insert_deduplication_token 的 bug #60745 (Jordi Villar)。
- 阻止在不支持的多部分上传操作中设置自定义元数据头 #60748(Francisco J. Jurado Moreno)。
- 修复了 toStartOfInterval #60763(Andrey Zvonov)。
- 修复
arrayEnumerateRanked中的崩溃问题 #60764 (Raúl Marín)。 - 修复在
INSERT SELECT JOIN中使用input()导致的崩溃 #60765 (Kruglov Pavel)。 - 修复当子查询中使用不同的 allow_experimental_analyzer 配置值时发生的崩溃 #60770 (Dmitry Novik)。
- 从 S3 读取数据时取消递归 #60849 (Antonio Andelic)。
- 修复 HashedDictionaryParallelLoader 在发生错误时可能卡住的问题 #60926 (vdimir).
- 修复异步 RESTORE 与 Replicated 数据库配合使用时的问题(实验性特性) #60934 (Antonio Andelic).
- 修复通过原生协议向
Log表进行异步插入时的死锁问题 #61055(Anton Popov)。 - 修复 RangeHashedDictionary 中
dictGetOrDefault默认参数惰性求值的问题 #61196 (Kruglov Pavel)。 - 修复 groupArraySorted 中的多个错误 #61203 (Raúl Marín).
- 修复独立二进制模式下 Keeper 的重新配置问题 #61233 (Antonio Andelic)。
- 修复 S3 引擎中 session_token 的使用方式 #61234 (Kruglov Pavel).
- 修复聚合函数
uniqExact可能产生不正确结果的问题 #61257 (Anton Popov). - 修复
SHOW DATABASE语句中的错误 #61269(Raúl Marín)。 - 修复 RabbitMQ 存储在使用
MATERIALIZED列时的逻辑错误 #61320 (vdimir)。 - 修复
CREATE OR REPLACE DICTIONARY语句 #61356(Vitaly Baranov)。 - 修复包含 external ON CLUSTER 的 ATTACH 查询 #61365(Nikolay Degterinsky)。
- 修复针对 nullable 键的连续键优化问题 #61393 (Anton Popov)。
- 修复 actions DAG 拆分问题 #61458 (Raúl Marín).
- 修复在处理失败的 RESTORE 操作收尾时的问题 #61466 (Vitaly Baranov).
- 使用兼容性设置正确地禁用 async_insert_use_adaptive_busy_timeout #61468(Raúl Marín)。
- 在 restore 池中启用排队 #61475 (Nikita Taranov).
- 修复使用 UUID 读取 system.parts 时的不一致问题。#61479 (Dan Wu)。
- 修复 ALTER QUERY MODIFY SQL SECURITY 的问题 #61480 (pufit)。
- 修复 window view(实验性功能)中的一次崩溃 #61526(Alexey Milovidov)。
- 修复
repeat在处理非原生整数类型时的行为 #61527(Antonio Andelic)。 - 修复客户端的
-s参数 #61530 (Mikhail f. Shiryaev). - 修复 arrayPartialReverseSort 中的崩溃问题 #61539 (Raúl Marín).
- 修复在位置为常量时的字符串搜索问题 #61547(Antonio Andelic)。
- 修复
addDays用于 DateTime64 时导致错误的问题 #61561 (Shuai li)。 - 禁用 JSONExtract 的 LowCardinality 输入类型 #61617 (Julia Kartseva).
- 修复带去重的异步插入时的
system.part_log问题 #61620 (Antonio Andelic). - 修复 system.parts 中出现的
Non-ready set异常。#61666(Nikolai Kochetov)。 - 修正 REPLACE_RANGE 中的 actual_part_name(
Entry actual part isn't empty yet) #61675 (Alexander Tokmakov)。 - 修复
multiSearchAllPositionsCaseInsensitiveUTF8中关于无效 UTF-8 的 sanitizer 报告 #61749(pufit)。 - 修正关于
RANGE窗口框架不支持Nullable列的说明。#61766 (YuanLiu).
ClickHouse 发布 24.2,2024-02-29
不向后兼容的变更
- 在嵌套类型中校验可疑/实验性类型。此前我们不会在 Array/Tuple/Map 等嵌套类型中校验这类类型(JSON 除外)。#59385 (Kruglov Pavel).
- 为线程数和数据块大小添加合理性检查(sanity check)。#60138 (Raúl Marín).
- 默认情况下不再推断指数表示法中的浮点数。新增设置
input_format_try_infer_exponent_floats,启用后将恢复之前的行为(默认禁用)。修复 #59476。#59500 (Kruglov Pavel). - 允许在 ALTER 操作周围添加括号。是否输出括号可以通过
format_alter_operations_with_parentheses配置进行控制。默认情况下,在格式化查询中会输出括号,因为我们在某些地方将格式化后的 ALTER 操作作为元数据存储(例如:mutations)。新的语法能澄清某些以 ALTER 操作列表结尾的查询。例如:ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c在旧语法下无法被正确解析。在新语法中,查询ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c)更为清晰。旧版本无法读取这种新语法,因此在同一集群中混用新旧版本 ClickHouse 时,使用新语法可能会导致问题。#59532 (János Benjamin Antal). - 修复了物化视图的安全问题,该问题允许用户在没有所需授权的情况下向表中插入数据。修复现在会验证用户不仅有向物化视图插入的权限,还必须对所有底层表拥有插入权限。这意味着,一些之前可以运行的查询现在可能会因
Not enough privileges而失败。为了解决这一问题,本次发布为视图引入了 SQL 安全性的新特性:https://clickhouse.com/docs/sql-reference/statements/create/view#sql_security。[#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) #60439 (pufit).
新功能
- 新增语法,可在视图/物化视图中指定 DEFINER 用户。这样就可以在未对底层表进行显式授权的情况下,通过视图执行 SELECT/INSERT 操作,从而由视图来承载这些权限。#54901 #60439 (pufit)。
- 在
file/s3/hdfs/url/azureBlobStorage引擎中,如果文件格式未知,则尝试在 schema 推断阶段自动检测文件格式。关闭 #50576。#59092(Kruglov Pavel)。 - 实现异步插入超时时间的自动调整。引入了以下设置:async_insert_poll_timeout_ms、async_insert_use_adaptive_busy_timeout、async_insert_busy_timeout_min_ms、async_insert_busy_timeout_max_ms、async_insert_busy_timeout_increase_rate、async_insert_busy_timeout_decrease_rate。 #58486 (Julia Kartseva)。
- 支持为最大连续登录失败次数设置配额。#54737 (Alexey Gerasimchuck)。
- 新增聚合函数
groupArrayIntersect。为 #49862 的后续工作。#59598(Yarik Briukhovetskyi)。 - 新增对
AzureBlobStorage的备份与恢复支持。解决了 #50747。#56988(SmitaRKulkarni)。 - 现在,用户可以在查询中直接使用
format_schema_rows_template指定模板字符串,作为format_template_row的替代。修复了 #31363。#59088(Shaun Struwig)。 - 实现了将不同类型的 MergeTree 表自动转换为 Replicated 表引擎。只需在表的数据目录(
/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/)中创建一个空的convert_to_replicated文件,该表将在下次服务器启动时自动转换。#57798 (Kirill)。 - 新增了查询语句
ALTER TABLE table FORGET PARTITION partition,用于删除空分区对应的 ZooKeeper 节点。#59507(Sergei Trifonov)。这是一个专家级功能。 - 在 NATS 表引擎中支持使用 JWT 凭证文件。#59543 (Nickolaj Jepsen).
- 实现了
system.dns_cache表,可用于排查 DNS 问题。#59856 (Kirill Nikiforov)。 - 编解码器
LZ4HC将支持新的压缩级别 2,它比此前的最小压缩级别 3 更快,但压缩率会有所降低。在之前的版本中,LZ4HC(2)及更低级别都等同于LZ4HC(3)。作者:Cyan4973。#60090(Alexey Milovidov)。 - 实现了
system.dns_cache表,可用于调试 DNS 问题。新增服务器设置项 dns_cache_max_size。#60257(Kirill Nikiforov)。 - 为
merge表函数增加对单参数版本的支持,形式为merge(['db_name', ] 'tables_regexp')。#60372(豪肥肥)。 - 支持负位置参数。关闭 #57736。#58292(flynn)。
- 在配置中针对特定的 S3 设置,支持通过
user键指定允许的用户集合。#60144 (Antonio Andelic). - 新增了表函数
mergeTreeIndex。它用于表示MergeTree表的索引文件和 marks 文件的内容,可用于自省。语法:mergeTreeIndex(database, table, [with_marks = true]),其中database.table是使用MergeTree引擎的现有表。#58140(Anton Popov)。
实验特性
- 添加了函数
seriesOutliersDetectTukey,用于使用 Tukey's fences 算法检测序列数据中的异常值。 #58632 (Bhavna Jindal)。请注意,该行为将在下一个补丁版本中发生变化。 - 添加函数
variantType,为每一行返回带有变体类型名称的 Enum。 #59398 (Kruglov Pavel)。 - 为并行副本(仅在使用 analyzer 时)支持
LEFT JOIN、ALL INNER JOIN和简单子查询。新增设置项parallel_replicas_prefer_local_join,用于在本地JOIN执行(默认)与GLOBAL JOIN之间进行选择。cluster_for_parallel_replicas中的每个副本上都必须存在所有表。新增设置项min_external_table_block_size_rows和min_external_table_block_size_bytes,用于合并发送到临时表的小数据块(仅在使用 analyzer 时)。 #58916 (Nikolai Kochetov)。 - 允许在向
Replicated数据库添加或恢复新副本期间并发创建表。 #59277 (Konstantin Bogdanov)。 - 为
Variant值实现比较运算符,并实现将字段正确插入到Variant列中。默认情况下,不允许创建包含相似变体类型的Variant类型(可通过设置allow_suspicious_variant_types允许)。修复 #59996。修复 #59850。 #60198 (Kruglov Pavel)。 - 禁用在未使用 analyzer 时并行副本与 CTE 的 JOIN。 #59239 (Raúl Marín)。
性能优化
- 主键将占用更少内存。#60049 (Alexey Milovidov).
- 优化主键及部分其他操作的内存使用。 #60050 (Alexey Milovidov)。
- 表的主键会在首次访问时按需(惰性)加载到内存中。这由新的 MergeTree 设置
primary_key_lazy_load控制,默认启用。这样带来了一些优势:- 不会为未使用的表加载主键;- 如果内存不足,会在首次使用时抛出异常,而不是在服务器启动时抛出。但这也有一些劣势:- 加载主键的延迟会在第一条查询时才发生,而不是在接受连接之前;从理论上讲,这可能会引入“羊群效应”(thundering-herd)问题。此更改关闭了 #11188。#60093(Alexey Milovidov)。 - 用于向量搜索的向量化距离函数。#58866 (Robert Schulze)。
- 适用于向量搜索的向量化函数
dotProduct。 #60202 (Robert Schulze). - 为
dictGetOrDefault函数添加短路特性。关闭 #52098。#57767(jsc0218)。 - Keeper 改进:在内存中仅缓存由
latest_logs_cache_size_threshold和commit_logs_cache_size_threshold控制的一定数量的日志。#59460 (Antonio Andelic). - Keeper 改进:进一步减小数据节点的大小。 #59592 (Antonio Andelic).
- 继续优化在结果类型为
Float*/Decimal*/*Int*时if函数的分支未命中,承接 https://github.com/ClickHouse/ClickHouse/pull/57885。#59148(李扬)。 - 当输入类型为
Map时,对if函数进行了优化,性能提升最高可达约 10 倍。#59413 (李扬)。 - 通过实现严格别名规则来提升
Int8类型的性能(我们已经在UInt8和所有其他整数类型上实现了该规则)。#59485(Raúl Marín)。 - 通过减少分支预测失败,有条件地优化
bigint和大十进制类型上的sum/avg性能。 #59504 (李扬). - 在存在正在执行的 mutation 时提升 SELECT 的性能。#59531(Azat Khuzhin)。
- 使用 AVX2 优化了函数
isNotNull。#59621 (李扬)。 - 改进针对已排序或近乎有序数据的 ASOF JOIN 性能。#59731(Maksim Kita)。
- 之前
async_insert_max_data_size的默认值为 1 MB,事实证明该值过小。新的默认值将为 10 MiB。#59536 (Nikita Mikhaylov)。 - 在执行 RESTORE 命令时,从备份中读取表元数据的过程支持使用多个线程。 #60040 (Vitaly Baranov)。
- 现在如果
StorageBuffer有多个分片(num_layers> 1),则会在多个线程中并行对所有分片执行后台刷新。#60111 (alesapin)。
改进
- 当输出格式为
Pretty且某个数据块只包含一个数值并且该数值超过一百万时,将在表格右侧显示一个更易读的数字。#60379 (rogeryk)。 - 新增设置
split_parts_ranges_into_intersecting_and_non_intersecting_final和split_intersecting_parts_ranges_into_layers_final。这些设置可用于在带有FINAL的查询中禁用优化,主要用于调试。#59705 (Maksim Kita)。但实际上用途不止于此——在牺牲一定性能的前提下,它们还可以降低内存占用。 - 将设置
extract_kvp_max_pairs_per_row重命名为extract_key_value_pairs_max_pairs_per_row。该问题(设置名称中的不必要缩写)是在 https://github.com/ClickHouse/ClickHouse/pull/43606 中引入的。修复此设置的文档。#59683(Alexey Milovidov)。#59960(jsc0218)。 - 现在,在具有
DEFAULT或MATERIALIZED表达式的列上运行ALTER COLUMN MATERIALIZE时,将精确符合其语义。#58023(Duc Canh Le)。 - 为 mutation 过程中出现的错误启用了指数退避策略。这将降低 CPU 使用率、内存使用率以及日志文件大小。#58036 (MikhailBurdukov)。
- 改进了对
InitialQueryProfile Event 的计数。#58195 (Unalian)。 - 支持在
storage_configuration中定义volume_priority。 #58533 (Andrey Zvonov). - 为
T64编解码器添加对Date32类型的支持。#58738 (Hongbin Ma)。 - 允许在包含多个元素的类型中使用尾随逗号。#59119 (Aleksandr Musorin)。
- 现在可以在服务器配置文件中指定 Distributed 表引擎的设置(类似于 MergeTree 设置),例如
<distributed> <flush_on_detach>false</flush_on_detach> </distributed>。 #59291 (Azat Khuzhin). - 在读取
system.zookeeper时对断开连接和会话过期进行重试处理。这在从system.zookeeper表中读取大量行时尤其有用,特别是在存在故障注入导致的断连情况下。#59388 (Alexander Gololobov)。 - 当
input_format_values_interpret_expressions=0时,不再将带前导零的数字解析为八进制数。#59403 (Joanna Hulboj)。 - 在启动时以及每当配置文件发生更更改时,ClickHouse 都会更新其总内存跟踪器的硬性内存上限。这些上限是基于各种服务器设置以及(在 Linux 上)cgroup 限制计算得出的。此前,对
/sys/fs/cgroup/memory.max(用于 cgroups v2)的设置是写死的。因此,为嵌套组(层级结构)配置的 cgroup v2 内存限制(例如/sys/fs/cgroup/my/nested/group/memory.max)会被忽略。现在这一问题已经修复。v1 内存限制的行为保持不变。#59435(Robert Schulze)。 - 新增 profile events,用于观测在执行
INSERT操作时计算 PK/投影/二级索引所耗费的时间。#59436 (Nikita Taranov)。 - 允许在创建 Ordered 模式的 S3Queue 时,通过设置
s3queue_last_processed_path来定义起始位置。 #59446 (Kseniia Sumarokova). - 在
clickhouse-local中,系统表的注释现在也可以在system.tables中获取。#59493 (Nikita Mikhaylov)。 system.zookeeper表:之前会先将整个结果累积在内存中,然后一次性作为一个大块返回。此次更改有助于在从system.zookeeper读取大量行时降低内存消耗,支持展示中间进度(当前已读取的行数),并在结果集很大时避免触发连接超时。 #59545 (Alexander Gololobov).- 现在 dashboard 能够同时识别压缩和未压缩状态的 URL #hash(保持向后兼容)。延续自 #59124。#59548(Amos Bird)。
- 将 Intel QPL(供编解码器
DEFLATE_QPL使用)从 v1.3.1 升级到 v1.4.0。同时修复了轮询超时机制中的一个 bug,我们观察到在某些情况下超时不会按预期生效,如果发生超时,IAA 和 CPU 可能会并发处理缓冲区。目前的做法是先确保 IAA codec 状态不是 QPL_STS_BEING_PROCESSED,然后再回退到 SW codec。 #59551 (jasperzhu)。 - 不要在 ClickHouse Cloud 中显示有关服务器版本的警告,因为 ClickHouse Cloud 会自动执行无缝升级。 #59657 (Alexey Milovidov)。
- 自解压完成后,临时二进制文件由复制改为移动。 #59661 (Yakov Olkhovskiy)。
- 修复在 Apple macOS 上的栈展开问题。解决了 #53653。#59690(Nikita Mikhaylov)。
- 即使用户将
max_parser_depth错误配置为一个非常大的值,也要检查解析器中的栈溢出。从而关闭了 #59622。#59697(Alexey Milovidov)。#60434 - 统一在 Kafka 存储中通过 XML 和 SQL 创建的命名集合的行为。#59710 (Pervakov Grigorii).
- 在
merge_max_block_size_bytes足够小且表中包含宽行(如字符串或元组)时,后台合并可能会陷入无限循环。此问题已修复。是 https://github.com/ClickHouse/ClickHouse/pull/59340 的后续更新。#59812(Nikita Mikhaylov)。 - 如果在
CREATE TABLE语句中显式指定了 uuid,则允许在replica_path中使用 uuid。 #59908 (Azat Khuzhin). - 在
system.tables系统表中为 ReplicatedMergeTree 表新增metadata_version列。 #59942 (Maksim Kita). - Keeper 优化:向 Prometheus 仅发送与 Keeper 相关的指标/事件。 #59945 (Antonio Andelic).
- 即使在升级后
system表的结构发生变化,仪表板仍然可以显示不同 ClickHouse 版本的指标。#59967(Alexey Milovidov)。 - 允许从文件中加载 AZ 信息。 #59976 (Konstantin Bogdanov).
- Keeper 改进:为磁盘相关操作失败时添加重试机制。 #59980 (Antonio Andelic).
- 添加新的配置项
backups.remove_backup_files_after_failure:<clickhouse> <backups> <remove_backup_files_after_failure>true</remove_backup_files_after_failure> </backups> </clickhouse>。#60002(Vitaly Baranov)。 - 在通过 GCP 复制 S3 文件时,如果 GCP 返回带有
GATEWAY_TIMEOUTHTTP 状态码的Internal Error,则回退为缓冲区复制。 #60164 (Maksim Kita). - 为
ULIDStringToDateTime实现短路求值。#60211(Juan Madurga)。 - 为表
system.backups和system.backup_log添加了query_id列。为error列添加了错误堆栈跟踪信息。 #60220 (Maksim Kita). - 现在,通过 MySQL 端口的连接会自动在设置
prefer_column_name_to_alias = 1下运行,从而开箱即用地支持 QuickSight。此外,设置mysql_map_string_to_text_in_show_columns和mysql_map_fixed_string_to_text_in_show_columns现在默认启用,同样只影响 MySQL 连接。这提升了与更多 BI 工具的兼容性。#60365(Robert Schulze)。 - 修复 JavaScript 代码中的竞态条件,该问题会导致生成的图表重复并相互叠加。#60392 (Alexey Milovidov).
构建 / 测试 / 打包改进
- 添加了带覆盖率收集和自省功能的构建与测试。这是对 #56102 的延续。#58792(Alexey Milovidov)。
- 当设置了 CMake 交叉编译工具链变量时,在
corrosion-cmake中更新 Rust 工具链。#59309(Aris Tritas)。 - 为 ASTLiterals 增加了一些模糊测试(fuzzing)。#59383(Raúl Marín)。
- 如果希望在每次 ClickHouse 容器启动时都运行 initdb 脚本,则需要设置环境变量 CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS。#59808(Alexander Nikolaev)。
- 移除了禁用通用 ClickHouse 组件(如 server/client/...)的选项,但保留了一些需要额外库(如 ODBC 或 keeper)的组件。#59857(Azat Khuzhin)。
- 查询模糊测试器(query fuzzer)现在会对查询中的 SETTINGS 进行模糊测试。#60087(Alexey Milovidov)。
- 新增对使用 clang-19(master)构建 ClickHouse 的支持。#60448(Alexey Milovidov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复 TTL WHERE 中出现的 “Non-ready set” 错误。#57430 (Nikolai Kochetov)。
- 修复
quantilesGK函数中的一个错误 #58216(李扬)。 - 修复
intDiv在 Decimal 类型参数上的错误行为 #59243(Yarik Briukhovetskyi)。 - 修复
translate对 FixedString 输入的处理 #59356 (Raúl Marín)。 - 修正 Keeper 中的摘要计算 #59439 (Antonio Andelic)。
- 为不包含调试符号的二进制文件修复堆栈跟踪 #59444 (Azat Khuzhin).
- 在列级设置场景下修复
ASTAlterCommand::formatImpl... #59445 (János Benjamin Antal). - 使用 Analyzer 修复
SELECT * FROM [...] ORDER BY ALL查询 #59462 (zhongyuankai). - 修复在分布式查询取消期间可能出现的未捕获异常 #59487 (Azat Khuzhin)。
- 使 MAX 在处理复杂类型时使用与 permutation 相同的规则 #59498 (Raúl Marín)。
- 修复在传递
update_insert_deduplication_token_in_dependent_materialized_views时的边缘情况 #59544 (Jordi Villar)。 - 修复在空值上调用 arrayElement / map 时返回的不正确结果 #59594 (Raúl Marín)。
- 修复在合并空状态时导致
topK崩溃的问题 #59603(Raúl Marín)。 - 修复具有常量分片键的分布式表 #59606 (Vitaly Baranov)。
- 修复由 WingFuzz 发现的 KQL 问题 #59626 (Yong Wang)。
- 修复 AsynchronousBoundedReadBuffer 出现的 “Read beyond last offset” 错误 #59630 (Vitaly Baranov)。
- 在 RewriteSumFunctionWithSumAndCountVisitor 中保留函数别名 #59658 (Raúl Marín)。
- 修正非初始查询的开始时间 #59662 (Raúl Marín).
- 对
minmax跳过索引的参数类型进行校验 #59733 (Anton Popov). - 修复在 FixedString 输入时的 leftPad / rightPad 函数 #59739(Raúl Marín)。
- 修复 AST fuzzer 在函数
countMatches中的问题 #59752 (Robert Schulze). - RabbitMQ:修复既未被 ack 也未被 nack 的消息 #59775 (Kseniia Sumarokova)。
- 修复 StorageURL 将部分查询执行为单线程的问题 #59833 (Michael Kolupaev).
- S3Queue:修复未初始化的值 #59897 (Kseniia Sumarokova)。
- 修复对用括号括起的分区表达式的解析 #59901 (János Benjamin Antal)。
- 修复在通过 HTTP 使用 JSONColumnsWithMetadata 格式时发生的崩溃 #59925 (Kruglov Pavel)。
- 如果在 Analyzer 中重写后返回值会发生变化,则不要将 sum 重写为 count #59926(Azat Khuzhin)。
- 修复 UniqExactSet 读取时的崩溃 #59928 (Maksim Kita).
- 修复 ReplicatedMergeTree 无效的 metadata_version 问题 #59946 (Maksim Kita)。
- 修复
StorageDistributed中的数据竞争 #59987 (Nikita Taranov)。 - Docker:在启用该选项时运行初始化脚本,而不是在禁用时运行 #59991 (jktng)。
- 修复向
SQLite执行INSERT时处理单引号的问题(通过使用引号而不是反斜杠来转义单引号)#60015(Azat Khuzhin)。 - 修复
arrayFold中的多处逻辑错误 #60022(Raúl Marín)。 - 修复 optimize_uniq_to_count 会移除列别名的行为 #60026 (Raúl Marín).
- 修复在删除 S3Queue 表时可能抛出的异常 #60036 (Kseniia Sumarokova).
- 修复
NOT与单个字面量一起使用时的格式化问题 #60042 (Raúl Marín)。 - 在 DDLLogEntry 中使用从上下文中获取的 max_query_size,而不是硬编码的 4096 #60083 (Kruglov Pavel)。
- 修复包含名为
table的表的查询的格式不一致问题。修复在结构不是线性时包含UNION ALL、INTERSECT和EXCEPT的查询的错误格式化问题。关闭 issue #52349。修复SYSTEM查询的错误格式化,包括SYSTEM ... DROP FILESYSTEM CACHE、SYSTEM ... REFRESH/START/STOP/CANCEL/TEST VIEW、SYSTEM ENABLE/DISABLE FAILPOINT。修复参数化 DDL 查询的格式化。修复DESCRIBE FILESYSTEM CACHE查询的格式化。修复SET param_...(设置参数的查询)的错误格式化。修复CREATE INDEX查询的错误格式化。修复CREATE USER及类似查询的格式不一致问题。修复CREATE SETTINGS PROFILE的格式不一致问题。修复ALTER ... MODIFY REFRESH的错误格式化。修复在窗口偏移量为表达式时窗口函数格式不一致的问题。修复在用于实现运算符(例如plus)的函数之后使用RESPECT NULLS和IGNORE NULLS时格式不一致的问题。修复SYSTEM SYNC REPLICA ... LIGHTWEIGHT FROM ...的极其糟糕的格式化。修复包含GROUP BY GROUPING SETS ... WITH ROLLUP/CUBE/TOTALS的无效查询的格式不一致问题。修复GRANT CURRENT GRANTS的格式不一致问题。修复CREATE TABLE (... COLLATE)的格式不一致问题。此外,还修复了子查询中EXPLAIN的错误格式化(#60102)。修复了 lambda 函数的错误格式化(#60012)。新增检查,以避免今后再遗漏这种糟糕的格式。#60095(Alexey Milovidov)。 - 修复子查询中
EXPLAIN输出格式不一致的问题 #60102(Alexey Milovidov)。 - 修复在使用 Nullable 时出现的 cosineDistance 崩溃问题 #60150 (Raúl Marín).
- 允许将以字符串表示的 bool 转换为真正的布尔值 #60160 (Robert Schulze)。
- 修复
system.s3queue_log#60166 (Kseniia Sumarokova)。 - 修复带可为 NULL 的聚合函数名称的 arrayReduce #60188 (Raúl Marín)。
- 隐藏
S3Queue的敏感信息 #60233 (Kseniia Sumarokova). - 修复 HTTP 异常状态码。 #60252 (Austin Kothig)。
- S3Queue:修复一个 bug(同时修复不稳定的测试用例 test_storage_s3_queue/test.py::test_shards_distributed) #60282 (Kseniia Sumarokova).
- 修复 IPv6 哈希函数中使用未初始化的值以及生成无效结果的问题 #60359 (Kruglov Pavel)。
- 修复
OptimizeDateOrDateTimeConverterWithPreimageVisitor在null参数情况下的行为 #60453 (Raúl Marín). - 修复了一个小问题,该问题导致来自 KQL 或 PRQL 方言客户端的分布式表查询无法在副本上执行。 #59674。 #60470 (Alexey Milovidov) #59674 (Austin Kothig)。
ClickHouse 发行版 24.1,2024-01-30
向后不兼容的更改
- 设置
print_pretty_type_names现在默认开启。你可以将其关闭以保持旧行为,或者执行SET compatibility = '23.12'。#57726(Alexey Milovidov)。 - MergeTree 设置
clean_deleted_rows已被弃用,不再产生任何效果。默认情况下不允许在OPTIMIZE中使用CLEANUP关键字(除非启用了allow_experimental_replacing_merge_with_cleanup)。#58316(Alexander Tokmakov)。 - 函数
reverseDNSQuery不再可用。这解决了 #58368。#58369(Alexey Milovidov)。 - 启用多项更改,以改进配置文件中的访问控制。这些更改会影响系统行为,请在
access_control_improvements部分检查config.xml。如果你不确定,请保持配置文件中的值与上一版本一致。#58584(Alexey Milovidov)。 - 改进
sumMapFiltered在处理 NaN 值时的行为。NaN 值现在会被放在末尾(而不是随机位置),并且被视为与任意值都不同。-0现在也被视为等同于0;由于 0 值会被丢弃,-0值也同样会被丢弃。#58959(Raúl Marín)。 - 函数
visibleWidth将按照文档中的说明工作。在之前的版本中,它在字符串序列化后仅简单统计码点数量,与lengthUTF8函数类似,但不会考虑零宽和组合字符、全宽字符、制表符和删除字符。现在行为已做相应更改。如果你希望保持旧行为,请将function_visible_width_behavior设置为0,或者将compatibility设置为23.12或更低。#59022(Alexey Milovidov)。 - 在以下两个缺陷修复之前,
Kusto方言被禁用:#59037 和 #59036。#59305(Alexey Milovidov)。任何尝试使用Kusto的操作都会抛出异常。 - 对
FINAL修饰符的更高效实现不再保证即使在max_threads = 1时也能保留顺序。如果你依赖之前的行为,请将enable_vertical_final设置为 0,或将compatibility设置为23.12。
新功能
- 实现 Variant 数据类型,用于表示其他数据类型的并集。类型
Variant(T1, T2, ..., TN)表示该类型的每一行都具有类型T1、T2、...、TN之一的值,或者为空(NULL值)。Variant 类型可通过设置allow_experimental_variant_type启用。参考:#54864。#58047(Kruglov Pavel)。 - 某些设置(目前为
min_compress_block_size和max_compress_block_size)现在可以在列级别指定,此时会优先于相应的表级别设置。示例:CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();。#55201(Duc Canh Le)。 - 添加
quantileDD聚合函数以及相应的quantilesDD和medianDD。它基于 DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf。### 面向用户的变更文档条目。#56342 (Srikanth Chekuri)。 - 支持配置任意类型的对象存储以及任意类型的元数据类型。 #58357 (Kseniia Sumarokova).
- 为
distributed_ddl_output_mode新增了null_status_on_timeout_only_active和throw_only_active模式,从而避免等待不活跃副本。#58350 (Alexander Tokmakov)。 - 添加函数
arrayShingles用于计算子数组,例如arrayShingles([1, 2, 3, 4, 5], 3)返回[[1,2,3],[2,3,4],[3,4,5]]。#58396(Zheng Miao)。 - 新增了函数
punycodeEncode、punycodeDecode、idnaEncode和idnaDecode,用于根据 IDNA 标准将国际化域名转换为 ASCII 表示形式。#58454 (Robert Schulze)。 - 新增字符串相似度函数
dramerauLevenshteinDistance、jaroSimilarity和jaroWinklerSimilarity。#58531 (Robert Schulze)。 - 添加两个设置:
output_format_compression_level用于更改输出压缩级别,以及output_format_compression_zstd_window_log用于显式设置压缩窗口大小,并在输出压缩方法为zstd时启用 zstd 压缩的长距离(long-range)模式。适用于使用INTO OUTFILE以及写入表函数file、url、hdfs、s3和azureBlobStorage时。#58539(Duc Canh Le)。 - 当输出目标不是终端时,在 Pretty 格式中自动禁用 ANSI 转义序列。为设置
output_format_pretty_color新增auto模式。 #58614 (Shaun Struwig)。 - 新增函数
sqidDecode,用于解码 Sqids。 #58544 (Robert Schulze)。 - 允许在 JSON 输入格式中将 Bool 值读取为 String 类型。通过设置
input_format_json_read_bools_as_strings来实现,该设置默认启用。#58561 (Kruglov Pavel)。 - 添加了函数
seriesDecomposeSTL,用于将时间序列分解为季节成分、趋势成分和残差成分。 #57078 (Bhavna Jindal). - 为 MaterializedMySQL 引入 MySQL Binlog Client:一个 binlog 连接可服务多个数据库。#57323(Val Doroshchuk)。
- Intel QuickAssist Technology (QAT) 提供基于硬件加速的压缩和加密运算。ClickHouse 新增了压缩编解码器
ZSTD_QAT,它利用 QAT 来执行 zstd 压缩。该编解码器使用了 Intel 的 QATlib 和 Intel 的 QAT ZSTD Plugin。目前仅支持通过硬件加速压缩(如果无法初始化 QAT,则会回退到软件实现),解压缩始终由软件执行。#57509(jasperzhu)。 - 为 S3 磁盘实现了一种新的对象存储键生成方式。现在可以在磁盘描述中通过
key_template选项,使用re2正则表达式语法来定义键的格式。#57663 (Sema Checherinda)。 - 表 system.dropped_tables_parts 包含 system.dropped_tables 中各表的数据片段(这些表已被删除但尚未物理移除)。 #58038 (Yakov Olkhovskiy).
- 添加了
max_materialized_views_size_for_table设置,用于限制附加到某个表的物化视图数量。#58068(zhongyuankai)。 clickhouse-format改进:支持带有VALUES的 INSERT 语句;支持注释(使用--comments来输出);支持--max_line_length选项,仅将较长的查询格式化为多行。#58246 (vdimir)。- 在
clickhouse-local中附加所有系统表,包括system.parts。此更改修复了 #58312。#58359(Alexey Milovidov)。 - 在函数
transform中添加对Enum数据类型的支持。关闭了 #58241。#58360(Alexey Milovidov)。 - 添加表
system.database_engines。 #58390 (Bharat Nallan)。允许在代码中独立注册数据库引擎。 #58365 (Bharat Nallan)。允许独立注册解释器。 #58443 (Bharat Nallan)。 - 为
SYSTEM SYNC REPLICA LIGHTWEIGHT查询新增了FROM <Replicas>修饰符。使用FROM修饰符可以确保我们只针对指定的源副本等待 fetch 和 drop-range 操作,同时也包括任何不在 ZooKeeper 中或source_replica为空的副本。#58393 (Jayme Bird)。 - 新增设置
update_insert_deduplication_token_in_dependent_materialized_views。该设置允许在向依赖物化视图插入数据时,使用表标识符更新插入去重 token。修复 #59165。 #59238(Maksim Kita)。 - 新增语句
SYSTEM RELOAD ASYNCHRONOUS METRICS,用于刷新异步指标。主要用于测试和开发。#53710 (Robert Schulze)。
性能优化
- 用于并行副本的协调机制已重写,以提升并行性和缓存局部性。它已在数百个副本规模下通过线性扩展性测试。同时还增加了对有序读取的支持。#57968 (Nikita Taranov)。
- 将基于 HTTP 的出站缓冲替换为 ClickHouse 原生缓冲机制。为接口添加字节计数指标。#56064 (Yakov Olkhovskiy).
- 在分布式查询中,将对
uniqExact的大规模聚合状态进行并行合并。#59009(Nikita Taranov)。 - 从
MergeTree表读取数据后的内存占用更低。 #59290 (Anton Popov). - 在垂直合并过程中降低内存占用。#59340 (Anton Popov).
- 在更多场景中避免 Keeper 启动时的过高内存消耗。#58455(Antonio Andelic)。
- Keeper 改进:降低 Keeper 存储节点的内存占用。#59002 (Antonio Andelic).
- 更具缓存友好性的最终实现。关于行为变更的说明:之前带有
FINAL修饰符且仅使用单个流读取(例如max_threads = 1)的查询,即使未显式提供ORDER BY子句,也会生成有序输出。当enable_vertical_final = true时(默认即为启用),不再保证这一点。#54366(Duc Canh Le)。 - 避免在
ReadBufferFromIStream中进行额外拷贝,该组件例如用于从 S3 读取数据。 #56961 (Nikita Taranov). - 当输入类型为 Array(Map)/Array(Array(Num))/Array(Array(String))/Array(BigInt)/Array(Decimal) 时,对
arrayElement函数进行了优化。此前的实现进行了超出实际需要的内存分配。此次优化的性能提升最高可达约 6 倍,尤其是在输入类型为 Array(Map) 时。#56403(李扬)。 - 在紧凑部分中从同一列读取多个子列时,现在仅对该列执行一次读取。 #57631 (Kruglov Pavel).
- 重写
sum(column + constant)函数的 AST。此功能作为 Analyzer 的一个优化 pass 提供 #57853(Jiebin Sun)。 - 对函数
match的求值现在会利用跳过索引ngrambf_v1和tokenbf_v1。#57882(凌涛)。 - 函数
match的计算现在会使用倒排索引。#58284(凌涛)。 - MergeTree
FINAL不会比较来自同一个非 L0 数据片段的行。 #58142 (Duc Canh Le). - 加速 iota 调用(将数组填充为连续数字)。#58271 (Raúl Marín).
- 加速非数值类型的 MIN/MAX 运算。 #58334 (Raúl Marín).
- 使用 BMI2/SSE 内建指令优化过滤器组合(例如在多阶段 PREWHERE 中) #58800 (Zhiguo Zhou).
- 将
clickhouse-local使用的线程数减少 1 个。#58968(Alexey Milovidov)。 - 当类型为 Nullable 时,优化
multiIf函数的性能。#57745 (KevinyhZou). - 添加
SYSTEM JEMALLOC PURGE用于清理未使用的 jemalloc 页面,如果已启用分析器,可使用SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE控制 jemalloc 分析配置。在 Keeper 中添加与 jemalloc 相关的 4LW 命令:jmst用于转储 jemalloc 统计信息,jmfp、jmep、jmdp在分析器启用时用于控制 jemalloc 分析配置。#58665 (Antonio Andelic)。 - 降低将数据备份到 S3 时的内存占用。#58962(Vitaly Baranov)。
改进
- 为所有 system 表的列添加了注释(简要说明)。这样做有几个原因: - 我们大量使用 system 表,有时开发者很难理解某个特定列的用途和含义。 - 我们经常对 system 表进行变更(新增或修改现有列),而相应文档总是滞后、处于过时状态。例如,请查看
system.parts的文档页面,其中缺少了很多列 - 我们希望最终能够直接从 ClickHouse 自动生成文档。 #58356(Nikita Mikhaylov)。 - 允许
PASTE JOIN的子查询不指定别名。#58654 (Yarik Briukhovetskyi). - 在 macOS 上启用
MySQL/MariaDB集成。这一改动关闭了 #21191。#46316(Alexey Milovidov)(Robert Schulze)。 - 默认禁用
max_rows_in_set_to_optimize_join。 #56396 (vdimir). - 添加
<host_name>配置参数,用于在 ON CLUSTER DDL 查询和 Replicated 数据库引擎中避免解析主机名。这样可以降低在集群定义发生变化时队列阻塞的风险。修复 #57573。#57603(Nikolay Degterinsky)。 - 将文件系统缓存的
load_metadata_threads提高到 16。这样可以让服务器启动得更快。#57732(Alexey Milovidov)。 - 新增对合并/变更进行限速的能力(
max_mutations_bandwidth_for_server/max_merges_bandwidth_for_server)。 #57877 (Azat Khuzhin). - 在系统表
system.server_settings中,将未在文档中记录的布尔类型列is_hot_reloadable替换为 Enum8 类型列changeable_without_restart,其可能取值为No、Yes、IncreaseOnly和DecreaseOnly。同时为该列补充了文档说明。#58029 (skyoct)。 - 集群发现支持设置用户名和密码,修复了 #58063。#58123(vdimir)。
- 支持在
ALTER TABLE ... PART中使用查询参数。#58297 (Azat Khuzhin). - 为 Kafka 表按需动态创建消费者(但会在上次使用后保留一段时间——
kafka_consumers_pool_ttl_ms),这应当修复system.kafka_consumers统计信息的问题(当没有人从 Kafka 表读取时不会进行消费,从而导致持续的内存泄漏以及表分离速度变慢),并且此 PR 还再次默认启用了system.kafka_consumers的统计信息。#58310(Azat Khuzhin)。 sparkBar作为sparkbar的别名。 #58335 (凌涛)。- 避免在上传到
GCS后发送ComposeObject请求。 #58343 (Azat Khuzhin). - 在配置 XML 中正确处理键名中包含点的键。#58354 (Azat Khuzhin).
- 使函数
format在传入常量参数时返回常量。此更改关闭了 #58355。#58358(Alexey Milovidov)。 - 新增设置
max_estimated_execution_time,以区分max_execution_time和max_estimated_execution_time。#58402(Zhang Yifan)。 - 当使用无效的数据库引擎名称时给出提示。 #58444 (Bharat Nallan).
- 新增设置,以便更好地控制 Arrow 字典中的索引类型。按照 Arrow 的建议,默认对索引使用有符号整数类型。关闭 #57401。#58519(Kruglov Pavel)。
- 实现 #58575,在运行 Docker 镜像时支持
CLICKHOUSE_PASSWORD_FILE环境变量。#58583(Eyal Halpern Shalev)。 - 在执行某些需要大量读取流来读取数据的查询时,此前会抛出错误
"Paste JOIN requires sorted tables only"。现在在这种情况下,会将流的数量调整为 1。#58608(Yarik Briukhovetskyi)。 - 改进了 INVALID_IDENTIFIER 错误的提示信息。#58703(Yakov Olkhovskiy)。
- 改进了
normalizeQuery中对带符号数字字面量的处理。 #58710 (Salvatore Mesoraca). - 为 MySQL 的 Point 数据类型提供支持。 #58721 (Kseniia Sumarokova).
- 在比较 Float32 列与常量字符串时,将字符串按 Float32(而不是 Float64)读取。 #58724 (Raúl Marín)。
- 提升 S3 兼容性,并新增对 ECloud EOS 存储的支持。 #58786 (xleoken).
- 允许使用
KILL QUERY来取消备份和恢复操作。此 PR 还让正在运行的备份和恢复操作在system.processes中可见。此外,服务器配置中现在新增了一个设置项shutdown_wait_backups_and_restores(默认=true),该设置会控制服务器在关闭时是等待所有正在运行的备份和恢复完成,还是直接取消它们。#58804(Vitaly Baranov)。 - 为 Avro 格式增加对 ZSTD 编解码器的支持。关闭 #58735。#58805(flynn)。
- MySQL 接口现已支持
net_write_timeout和net_read_timeout设置。其中,net_write_timeout会映射到 ClickHouse 原生的send_timeout设置,类似地,net_read_timeout会映射到receive_timeout。修复了一个问题:此前只有在整个语句全部为大写时,才能设置 MySQL 的sql_select_limit设置。#58835 (Serge Klochkov)。 - 在创建同名的字典和表发生冲突时,提供了更清晰的异常消息。#58841(Yarik Briukhovetskyi)。
- 对于自定义(通过 SQL 创建的)磁盘,确保在服务器配置中指定了
filesystem_caches_path(所有文件系统缓存的通用目录前缀)或custom_cached_disks_base_directory(仅针对由自定义磁盘创建的文件系统缓存的通用目录前缀)之一。对于自定义磁盘,custom_cached_disks_base_directory相对于filesystem_caches_path具有更高优先级;如果前者未配置,则使用后者。文件系统缓存设置中的path必须位于该目录之内,否则将抛出异常,阻止创建该磁盘。如果磁盘是在旧版本上创建的,且之后对服务器进行了升级,则不会抛出该异常,以便服务器能够成功启动。custom_cached_disks_base_directory已作为/var/lib/clickhouse/caches/添加到默认服务器配置中。修复 #57825。#58869(Kseniia Sumarokova)。 - MySQL 接口现在兼容
SHOW WARNINGS/SHOW COUNT(*) WARNINGS查询,但其返回结果始终为空集。#58929 (Serge Klochkov)。 - 在执行并行分布式
INSERT SELECT时跳过不可用的副本。#58931 (Alexander Tokmakov)。 - 在启用 JSON 格式的结构化日志输出时,显示文字形式的日志级别。 #58936 (Tim Liou)。
- MySQL 接口通过数据类型别名新增了对
CAST(x AS SIGNED)和CAST(x AS UNSIGNED)语句的支持:SIGNED作为 Int64 的别名,UNSIGNED作为 UInt64 的别名。这提升了与 Looker Studio 等 BI 工具的兼容性。#58954(Serge Klochkov)。 - 将工作目录切换到 Docker 容器中的数据路径。#58975 (cangyin).
- 为 Azure Blob Storage 新增配置项
azure_max_unexpected_write_error_retries,也可以在配置文件的 azure 部分进行配置。#59001 (SmitaRKulkarni)。 - 允许服务器在数据湖表损坏的情况下启动。关闭 #58625。#59080(Kseniia Sumarokova)。
- 允许在
Iceberg表引擎中忽略 schema 演进,并使用用户在建表时指定的 schema,或者在建表时从元数据解析出的最新 schema 来读取所有数据。通过iceberg_engine_ignore_schema_evolution设置实现,该设置默认关闭。请注意,启用此设置可能会导致结果不正确,因为在 schema 发生演进的情况下,所有数据文件都将使用同一个 schema 进行读取。 #59133 (Kruglov Pavel). - 禁止在只读/只写一次存储上执行可变操作(
INSERT/ALTER/OPTIMIZE/...),并返回适当的TABLE_IS_READ_ONLY错误(以避免残留数据)。在执行CREATE/ATTACH时避免在只写一次磁盘上留下残留文件(format_version.txt)。忽略对ReplicatedMergeTree执行的DROP操作(与MergeTree一样)。修复对s3_plain的迭代(MetadataStorageFromPlainObjectStorage::iterateDirectory)。注意:只读磁盘为web,只写一次磁盘为s3_plain。#59170(Azat Khuzhin)。 - 修复实验性
_block_number列中的一个缺陷,该缺陷在复杂组合使用ALTER与merge操作时可能导致逻辑错误。修复了 #56202,取代了 #58601。#59295(alesapin)。 - Play UI 能够识别包含在 JSON 返回值中的异常。针对 #52853 的调整。#59303(Alexey Milovidov)。
/binaryHTTP 处理程序允许在查询字符串中指定用户、主机,以及可选的密码。#59311 (Alexey Milovidov)。- 支持对压缩的内存表进行备份。已解决 #57893。#59315(Alexey Milovidov)。
- 在
BACKUP和RESTORE查询中支持FORMAT子句。#59338 (Vitaly Baranov)。 - 函数
concatWithSeparator现在支持任意类型的参数(而不再仅限于String和FixedString参数)。例如,SELECT concatWithSeparator('.', 'number', 1)现在会返回number.1。#59341(Robert Schulze)。
构建/测试/打包改进
- 改进 clickhouse 可执行文件的别名(现在
ch/clickhouse会根据参数被解析为clickhouse-local或clickhouse),并为这些新别名添加 bash 补全。 #58344 (Azat Khuzhin). - 在 CI 中添加设置变更检查,用于验证所有设置变更都记录在设置变更历史中。 #58555 (Kruglov Pavel).
- 在有状态测试中直接使用从 S3 挂载的表。 #58791 (Alexey Milovidov).
- 将完整的
fuzzer.log保存为归档文件,而不是只保留最后 100k 行。tail -n 100000经常会删掉包含表定义的行。示例:#58821 (Dmitry Novik). - 在 Aarch64 架构的 macOS 上启用 Rust(这将在客户端中通过 skim 添加模糊搜索和 PRQL 语言,尽管我认为几乎没有人在 darwin 上部署 ClickHouse,所以主要还是为了在客户端中使用模糊搜索)。#59272 (Azat Khuzhin).
- 修复在混合 x86_64 与 ARM 集群中的聚合问题。 #59132 (Harry Lee).
Bug 修复(在官方稳定版本中用户可见的错误行为)
- 为嵌套的 LowCardinality 添加连接键转换 #51550 (vdimir)。
- 仅在
flatten_nested=1时展开真正的Nested类型,而不是所有Array(Tuple)类型 #56132 (Kruglov Pavel)。 - 修复了在插入时与投影和
aggregate_functions_null_for_empty设置相关的一个错误。#56944(Amos Bird)。 - 修复由于陈旧的配置文件 UUID 导致的潜在异常 #57263 (Vasily Nemkov)。
- 修复 StreamingFormatExecutor 中读取缓冲区的处理逻辑 #57438 (Kruglov Pavel).
- 在向视图推送时,忽略目标表已被删除的物化视图(MV) #57520 (Kruglov Pavel)。
- 消除
ALTER_METADATA与MERGE_PARTS之间可能的竞争条件 #57755 (Azat Khuzhin)。 - 修复在带有 ROLLUP 的 GROUP BY 中的表达式顺序错误 #57786 (Chen768959)。
- 针对已弃用的「zero-copy」复制功能的修复:修复在删除包含损坏的 detached 分片的副本后出现的 blob 丢失问题 #58333(Alexander Tokmakov)。
- 允许用户在 user_files_path 中处理符号链接 #58447 (Duc Canh Le).
- 修复当 Graphite 表没有聚合函数时导致的崩溃 #58453 (Duc Canh Le)。
- 延迟从 StorageKafka 读取数据,以便在物化视图中支持多次读取 #58477 (János Benjamin Antal)。
- 修复一个关于 parts 相交的低级错误 #58482 (Alexander Tokmakov).
- 对仅包含 LIMIT 的查询禁用 MergeTreePrefetchedReadPool #58505 (Maksim Kita).
- 在恢复过程中启用普通数据库 #58520(Jihyuk Bok)。
- 修复通过 Apache Hive 线程池读取 ORC/Parquet/... 时的问题 #58537 (sunny).
- 在
system.backup_log的base_backup_name列中隐藏凭据 #58550 (Daniel Pozo Escalona)。 toStartOfInterval支持对毫秒、微秒值进行取整 #58557(Yarik Briukhovetskyi)。- 在 ConcurrentHashJoin 中禁用
max_joined_block_rows#58595 (vdimir)。 - 修复旧版分析器中使用 Nullable 的 join 问题 #58596 (vdimir).
makeDateTime64:允许非 const 的小数部分参数 #58597(Robert Schulze)。- 在对内联帧进行符号化时修复潜在的 NULL 指针解引用问题 #58607 (Azat Khuzhin).
- 当重新创建用户或切换角色时,改进查询缓存条目的隔离性 #58611 (Robert Schulze)。
- 修复在进行 projection 优化时的分区键分析错误 #58638(Amos Bird)。
- Query cache:修复按用户配额 #58731 (Robert Schulze)。
- 修复并行窗口函数中的流分区问题 #58739 (Dmitry Novik).
- 修复 addBatchLookupTable8 中在抛出异常时重复调用销毁函数的问题 #58745 (Raúl Marín)。
- 在关闭过程中不再在 Keeper 中处理请求 #58765 (Antonio Andelic)。
- 修复
SlabsPolygonIndex::find中的空指针解引用问题 #58771(Yarik Briukhovetskyi)。 - 修复 JSONExtract 函数在处理 LowCardinality(Nullable) 列时的问题 #58808 (vdimir)。
- 修复了在使用 CREATE 和 DROP 反复创建和删除海量表时出现的内存使用量意外累积问题。#58831 (Maksim Kita)。
- 在 mv 中支持多重读取文件日志存储 #58877 (János Benjamin Antal).
- 为 S3 的 access key ID 添加限制。 #58900 (MikhailBurdukov).
- 修复在加载建议时可能发生的 clickhouse-local 崩溃 #58907(Kruglov Pavel)。
- 修复在使用
indexHint时发生的崩溃 #58911 (Dmitry Novik)。 - 修复 StorageURL 在服务器重启时丢失请求头的问题 #58933 (Michael Kolupaev)。
- Analyzer:修复使用插入数据块进行的存储替换 #58958(Yakov Olkhovskiy)。
- 修复 ReadBufferFromZipArchive 中的 seek 问题 #58966 (Michael Kolupaev).
- 针对实验性倒排索引的修复(请勿在生产环境中使用):倒排索引的
DROP INDEX现在会从持久化存储中移除所有相关文件 #59040 (mochi)。 - 修复
query_factories_info上的数据竞争 #59049 (Kseniia Sumarokova). - 禁用遇到“重定向过多”错误时的重试 #59099 (skyoct)。
- 修复在关闭未启动数据库时出现的死锁问题 #59137 (Sergei Trifonov)。
- 修复:分布式查询中 LIMIT BY 和 LIMIT 的问题 #59153(Igor Nikonov)。
- 修复在
toString中使用可空时区时导致的崩溃 #59190 (Yarik Briukhovetskyi)。 - 修复在错误文件路径下导致 Iceberg 元数据操作异常终止的问题 #59275 (Kruglov Pavel)。
- 在 Rust 目标选择中修正架构名称 #59307 (p1rattttt)。
- 修复在
IN子句中使用子查询从system.tables查询时,对 “not-ready set” 的处理存在的逻辑错误。#59351(Nikolai Kochetov)。