ClickHouse v22.6 版本技术解读:SYSTEM UNFREEZE、JSON 列式格式、FPC 压缩与数十项性能改进
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
v22.6.1.1985-stable 是 ClickHouse 在 2022 年年中发布的一个稳定版本,涵盖向后不兼容变更、21 项新特性、24 项性能优化、约 49 项常规改进以及两大批次 Bug 修复。本文以仓库内的官方 changelog 文档 docs/changelogs/archive/v22.6.1.1985-stable.md 为主体骨架,结合仓库源码(如 InterpreterSystemQuery.cpp、grouping.cpp、CompressionCodecFPC.cpp 等)逐条深入展开,帮助读者理解每个变更背后的实现动机、使用方式与运维影响。
版本概览与对比基线
本版本号为v22.6.1.1985-stable,对应 commit7000c4e0033,其对比基线是上一个稳定版v22.5.1.2079-stable(commitdf0cb062098)。changelog 中的条目按以下分类组织,这也是本文的叙述主线:
- Backward Incompatible Change:升级前必须关注的破坏性变更(共 3 项);
- New Feature:新增能力(共 21 项);
- Performance Improvement:性能优化(共 24 项);
- Improvement:功能与可用性改进(约 49 项);
- Build/Testing/Packaging Improvement:工程化改进;
- Bug Fix:对官方稳定版中可见问题的修复(两批次);
- NO CL ENTRY / NOT FOR CHANGELOG:内部回滚与杂项整理。
一、向后不兼容变更(升级前必读)
v22.6 引入了三项可能影响存量 SQL 或二进制兼容性的变更,升级前需要重点评估。
1. 以秒为单位的设置项支持浮点值解析
从本版本起,所有以seconds作为类型的设置(例如max_execution_time)在解析时开始支持浮点数值,比如max_execution_time=0.5表示 0.5 秒。同时,Infinity或NaN这类非有限数值将被直接抛出异常,而不是被静默接受(对应 PR#37187)。这意味着此前可以写入非法超时值的场景在升级后会报错,属预期的行为收紧。
2. 实验类型Object的二进制序列化格式变更
实验性列类型Object的二进制序列化格式被重写(PR#37482),新格式更便于第三方客户端实现。由于Object类型仍处于实验阶段,该变更不会影响生产中的常规列类型,但任何已经使用Object类型并依赖其二进制格式(如 Native 格式)的客户端都需要同步升级。
3.output_format_json_named_tuples_as_objects默认开启
设置output_format_json_named_tuples_as_objects现在默认开启(PR#37756),它允许在 JSON 格式输出中把**命名元组(named tuples)**序列化为 JSON 对象,而不是数组。行为变化如下:
-- 假设列类型为 Tuple(a UInt32, b String) -- 旧行为(数组): [1, "x"] -- 新行为(对象,默认): {"a":1,"b":"x"}如果下游消费方依赖旧数组格式,升级后需要显式关闭该设置,或改造消费端逻辑。
二、新特性(New Feature)
v22.6 共带来 21 项新特性,覆盖备份管理、地理空间计算、窗口视图、JSON 格式、访问控制、压缩算法等多个方向,下面按主题分组讲解。
1. 备份与冻结管理:SYSTEM UNFREEZE
新增SYSTEM UNFREEZE查询(PR#36424),它可以在对应的表已被删除的情况下,仍然删除整个 backup(备份快照)。此前删除备份依赖表级操作,一旦源表被删除,备份便成为"孤儿"难以清理;现在系统级 UNFREEZE 补上了这个管理缺口。
从源码实现看,该语句在 InterpreterSystemQuery.cpp 中通过Type::UNFREEZE分支处理,执行前会校验AccessType::SYSTEM_UNFREEZE权限,并且"结果以表的形式返回被删除 part 的信息,用于与ALTER TABLE UNFREEZE查询保持兼容"(源码注释原文)。也就是说,SYSTEM UNFREEZE与已有的ALTER TABLE UNFREEZE走同一套返回结构,只是作用域从单表提升到了整个备份级别。
2. 地理空间:H3 单向边函数
新增一组 H3 单向边(unidirectional edge)相关函数(PR#36843),可用于蜂窝网格的边方向分析,例如构建相邻蜂窝之间的有向关系。与已有的 H3 索引函数配套使用,能够支撑更复杂的地理空间聚合与路径分析。
3. 运维可观测性:system.part_log增加merge_reason列
system.part_log表新增merge_reason列(PR#36912),用于记录每次 merge 发生的原因(例如 TTL、轮询合并、分区移动等触发因素)。DBA 借此可以分析"为什么这些 part 被合并",为 merge 调度调优提供依据。
4. WindowView 系列能力补齐
窗口视图(WindowView,用于流式窗口聚合)在本版本获得多项增强:
POPULATE支持(PR#36945):创建 WindowView 时可以通过POPULATE回填历史数据,行为类似物化视图的POPULATE;ALTER TABLE ... MODIFY QUERY支持(PR#37188):允许动态修改 WindowView 的查询定义;ENGINE语法对齐物化视图(PR#37214):WindowView 的ENGINE语法语义调整为与 MaterializedView 一致,降低两种视图之间的心智负担。
5. 新增列式 JSON 格式:JSONColumns 系列
新增三种面向列式读取的 JSON 格式(PR#36975,同时解决 issue#36338与#34509):
JSONColumnsJSONCompactColumnsJSONColumnsWithMetadata
与传统的 JSONEachRow(按行组织)不同,JSONColumns 以"列优先"方式组织数据({"col1":[...],"col2":[...]}),适合与列式存储互相转换、减少列裁剪开销。这三种格式在 src/Formats/registerFormats.cpp 中注册,格式的 JSON 解析工具集中在 src/Formats/JSONUtils.h。
6. 哈希 ID 计算:HashID 函数支持无符号整数
支持从无符号整数计算 hashids(PR#37013),例如把自增 ID 编码为不可猜测的短字符串 ID,常用于对外暴露 ID 的场景。
7. 聚合语义:新增GROUPING函数
新增标准 SQL 的GROUPING函数(PR#37163,解决 issue#19426),用于在ROLLUP、CUBE、GROUPING SETS场景中判断某列是否参与当前分组。实现位于 src/Functions/grouping.cpp 与 src/Functions/grouping.h。典型用法:
SELECT a, b, GROUPING(a) AS is_total_a, GROUPING(b) AS is_total_b, sum(x) FROM t GROUP BY GROUPING SETS ((a), (b), ());当某行是a维度的小计时GROUPING(b)返回 1,从而在结果中区分"真实值"与"小计行"。该版本同时配套修复了GROUPING与GROUPING SETS/ROLLUP/CUBE组合时的若干边界问题(见 Bug Fix 部分)。
8. 访问控制:sha256_hash支持 SALT
CREATE USER <user> IDENTIFIED WITH sha256_hash现在允许显式指定盐值SALT(PR#37377),使同一密码在不同盐值下产生不同哈希,增强口令存储的安全性:
CREATE USER alice IDENTIFIED WITH sha256_hash BY 'hash_value' SALT 'random_salt';9. 复制表元数据:ReplicatedMergeTree 支持修改注释
实现了对 ReplicatedMergeTree 表COMMENT的在线修改(PR#37416),即ALTER TABLE ... MODIFY COMMENT可在复制表上生效(该提交曾在开发期被回滚,见 NO CL ENTRY 中的#37627,最终随本版本发布)。
10. Avro 格式:Maps/Records 支持与input_format_avro_null_as_default
Avro 格式新增对 Map 和 Record 类型的支持(PR#37525),并引入设置input_format_avro_null_as_default,允许将 Avro 中的 null 按列默认值插入,而不是直接报错(解决 issue#18925、#37378、#32899)。
11. CSV/TSV:跳过文件头若干行
新增两个设置(PR#37537):
input_format_csv_skip_first_linesinput_format_tsv_skip_first_lines
用于在读取 CSV/TSV 文件时跳过开头指定行数的非数据内容(如版权头、注释行),解决此前必须手动处理文件头的问题。
12. 安全运维:showCertificate()函数
新增showCertificate()函数(PR#37540),直接以 SQL 方式展示当前服务器的 SSL 证书信息,便于不落地命令行地快速核验证书有效期、颁发者等元数据。
13. 压缩算法:FPC 浮点压缩编解码器
实现了 FPC(Floating Point Compression)算法(PR#37553,算法论文来自 DCC'07),专用于浮点数据的压缩。实现位于 src/Compression/CompressionCodecFPC.cpp,并在 src/Compression/CompressionFactory.cpp 与 registerCompressionCodecs.h 中完成注册。使用方式:
CREATE TABLE sensor ( ts DateTime, value Float64 CODEC(FPC) ) ENGINE = MergeTree ORDER BY ts;对于变化平滑、可预测性强的浮点序列(如传感器读数、监控指标),FPC 通常能取得优于通用 LZ4 的压缩比。需要注意该 codec 在开发期经过多次修复(见 NOT FOR CHANGELOG 中的#38089、#38117),生产使用前建议在目标数据上做压缩率基准验证。
14. 字典数据源:Named Collections 支持 HTTP 源
数据字典(Data Dictionary)的 HTTP 数据源现已支持通过 Named Collections 配置(PR#37581),将 URL、认证信息等敏感/可复用参数集中管理,避免在 DDL 中反复暴露连接细节。
15. 运维实验特性:允许向system.zookeeper写入
为解决 issue#22130,本版本允许向system.zookeeper表插入数据(PR#37596),方便在运维场景下直接写入 ZooKeeper 节点数据(设计上按 PR 描述做了相应简化)。这属于强运维导向能力,使用时需谨慎,避免破坏协调服务中的数据一致性。
16. 窗口函数:新增nonNegativeDerivative
新增窗口函数nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL x SECOND])(PR#37628),用于计算指标序列的非负导数:当前值与上一个时间点值之差小于 0 时按 0 处理,典型场景是计数器类指标(如单调递增的流量计数)的变化速率计算:
SELECT ts, nonNegativeDerivative(bytes_total, ts) AS bytes_per_interval FROM metrics WINDOW w AS (ORDER BY ts);该函数在仓库中的实现可追溯至 src/Functions/financial.cpp 所在的功能目录(该文件同时承载了求解器相关的模板实现)。
17. 可执行 UDF:支持带参数调用
可执行用户自定义函数(Executable UDF)开始支持参数,调用语法为SELECT test_function(parameters)(arguments)(PR#37720,解决 issue#37578)。例如:
-- 定义时可声明参数与参数类型 -- 调用时先传参数、再传普通参数 SELECT my_exec_udf('param1')(col1, col2) FROM t;配套修复了可执行 UDF 对Nullable参数的格式化问题(见 Bug Fix 部分#37711)。
18. 可观测性:基于 d3js 的 OpenTelemetry 追踪可视化工具
新增基于 d3js 的 OpenTelemetry traces 可视化工具(PR#37810),可以将查询执行链路以甘特图形式呈现,方便定位分布式查询中各阶段的耗时分布(该 PR 曾经历回滚再恢复,最终随版本保留,见 NO CL ENTRY#38043与#38129)。
三、性能改进(Performance Improvement)
v22.6 的性能优化涉及 MergeTree 写入、FINAL查询、排序、聚合、字典、地理函数、压缩缓存等多个热点路径,共 24 项。按主题归类如下。
1. MergeTree 写入与合并
- 多列 ORDER BY 下的插入性能:当 MergeTree 表
ORDER BY含多列时,插入路径得到专门优化(PR#35762); FINAL查询数据并行化:将数据 part 拆分为更细的层(layers)并分发给多个线程,而不是以整个 part 为粒度,使带FINAL的查询具备更好的数据并行度(PR#36396;该优化曾在#38094被回滚,属于开发期反复验证的过程);- 宽 part 按需加载 marks:读取宽格式(wide)part 时,只为必要的列加载 mark(索引标记)文件(PR
#36879),减少不必要的磁盘 IO。
2. 排序相关
- 单列排序性能提升(PR
#37195),以及后续基于排序队列特化(sorting queue specializations)的进一步优化(PR#37990); ORDER BY ... LIMIT性能提升(PR#37481):在排序同时提前截断,避免全量排序。
3. 聚合相关
- 稀疏列参与聚合的性能改进:当
MergeTree表启用实验性稀疏序列化(设置ratio_of_defaults_for_sparse_serialization)时,稀疏列作为聚合函数参数的场景得到优化(PR#37617); - 聚合状态销毁卸载到线程池:对于带
LIMIT且状态很大的查询,把聚合状态销毁动作投递到线程池执行,显著提速——changelog 给出的示例select uniq(number) from numbers_mt(1e7) group by number limit 100提速约 2.5 倍(PR#37855); COALESCE两参数优化(PR#37666)与multiIf单条件退化为if(PR#37695):后者因为if函数实现更高效。
4. 函数执行性能(动态分派)
本版本大规模引入"动态分派(dynamic dispatch)"基础设施来优化标量函数:
- 数值比较函数(PR
#37399); hasAll(PR#37484);greatCircleAngle、greatCircleDistance、geoDistance地理距离函数(PR#37524);not函数(PR#38058);- 数组
XXNorm/XXDistance系列函数提速 2~4 倍(PR#37394,相关重命名见 NOT FOR CHANGELOG#37502); - 过滤器位掩码生成函数以 AVX-512 指令整体加速(PR
#37588); - re2 正则模式内部缓存优化:
LIKE/MATCH等函数使用的 re2 模式缓存得到优化(PR#37544)。
5. 外部存储(Hive/S3)与文件格式读取
- StorageHive 使用 threadpool 读方法(PR
#36328); - Hive 分区键列免读文件:当所需列全是分区键时,直接按文件行号构造列,无需实际读取 Hive 文件(PR
#37103); - Hive 文件缓存支持多磁盘(PR
#37279); - 列子集读取优化:对于 Native、Protobuf、CapnProto、JSONEachRow、TSKV 以及所有带
WithNames/WithNamesAndTypes后缀的格式,读取列子集时不再全量读入内存,只读取所需列(PR#37192)。该优化同时把input_format_skip_unknown_fields设为默认开启,否则列子集读取会因未知字段抛异常; - S3 文件列表剪枝:允许通过
_file、_path等虚拟列剪枝 S3 上的文件列表(PR#37356),减少列举对象的开销。
6. 字典与后台任务
- 层级字典函数性能修复与增强:
dictGetDescendants、dictGetChildren不再每次函数调用都创建临时父子层级索引,而是按查询创建一次;并支持为HIERARCHICAL属性指定BIDIRECTIONAL,让字典在内存中维护父→子索引(PR#37148,解决 issue#32481); - 空闲 CPU 占用修复:存在大量表时,后台空转导致的 CPU 占用过高问题得到修复(PR
#38028)。
7. 架构加速
- NEON 加速:为多个主要库补充了 ARM NEON 加速路径(PR
#38093),在 ARM 平台上获得收益。
四、功能改进(Improvement)
本版本约 49 项改进覆盖权限、HTTP 接口、磁盘管理、内存控制、格式输出、Keeper、UI 等。以下按主题精选并完整归并 changelog 中的条目。
1. 权限与访问控制
- 独立的
CLUSTER授权:新增单独的CLUSTER权限,并引入向后兼容配置指令access_control_improvements.on_cluster_queries_require_cluster_grant(默认false)。开启后ON CLUSTER查询需要显式CLUSTER授权(PR#35767); - 角色授权可被检查:允许用户查看从已授予角色中继承的权限(PR
#36941); - 隐式授权连带 GRANT OPTION:例如
GRANT CREATE TABLE ON test.* TO A WITH GRANT OPTION现在允许A再执行GRANT CREATE VIEW ON test.* TO B(PR#38017)。
2. HTTP 接口行为改进
针对 HTTP 端点(send_progress_in_http_headers相关)做了三项修正(PR#36884):
- 当
send_progress_in_http_headers=0时,X-ClickHouse-Summary头返回完整统计(此前返回全零); - 当
send_progress_in_http_headers=1时,返回X-ClickHouse-Exception-Code头; TIMEOUT_EXCEEDED错误改为返回HTTP_REQUEST_TIMEOUT(408)而不是HTTP_INTERNAL_SERVER_ERROR(500),更符合 HTTP 语义。
3. 磁盘与存储管理
clickhouse-disks工具扩展:新增ls、list-disks、disk、copy、link、list、move、read、remove、write、C(设置配置文件)、help等命令(PR#36060),支持在磁盘之间复制、硬链接、移动、读写文件,对应程序目录见 programs/disks;least_used磁盘负载均衡:多磁盘 volume 内新增least_used负载均衡算法,写入时选择剩余空间/负载最低的磁盘(PR#36686);DiskS3支持support_batch_delete:用于关闭批量多对象删除调用,兼容 Google Cloud Storage(PR#37659);- 失败移动的 part 立即删除:MergeTree 表引擎族中移动失败的 part 不再滞留,立即清理(PR
#37994); - 远端缓存写策略讨论:改进了远程文件缓存——此前所有远程文件都被下载到本地缓存(即使只读一次),会引发本地磁盘 IO 负优化;本版本引入按需/受限缓存策略(PR
#37516),并在#37859中限制单查询最大缓存用量,防止缓存池污染; always_fetch_merged_part优化:ReplicatedMergeTree 开启该设置时,merge 会降低向其他副本查找已合并 part 的频率,减少对 ZooKeeper 的负载(PR#37995);- 服务启动时清理
delete_tmp目录(PR#37906)、超时清理损坏的 detached parts(PR#37975)。
4. 内存与 Overcommit
- 将
global_memory_usage_overcommit_max_wait_microseconds默认值调整为 5 秒;在 OOM 异常信息中补充OvercommitTracker信息;新增MemoryOvercommitWaitTimeMicrosecondsProfileEvent(PR#37460)。
5. 格式与类型系统
- Arrow/Parquet/ORC 中 String 代替 Binary:新增
output_format_arrow_string_as_string、output_format_parquet_string_as_string、output_format_orc_string_as_string三个设置(默认false)(PR#37327); - schema 推断行数上限改为全局:
input_format_max_rows_to_read_for_schema_inference现在对 glob 所有文件合计生效(此前按每个文件分别生效),避免 null 过多时推断不到有效类型;默认值提升到 25000(PR#37332); - 列声明支持
NULL/NOT NULL:允许在类型后直接写NULL/NOT NULL(PR#37337); - 禁止创建未知数据格式的存储(PR
#37450); ROLLUP/CUBE/GROUPING SETS支持非标准默认类型(PR#37667);Nothing类型默认实现:大部分函数在参数为Nothing时返回Nothing列;arrayMap(x -> 2*x, [])现在返回Array(Nothing)而非报错;arrayFilter/arrayFill支持 Nullable 元素数组(PR#37048);- LIKE 尾部转义符禁用:以
\结尾的LIKE模式按 SQL 标准禁止(PR#37764); dumpColumnStructure在 LowCardinality/Sparse 列上更精确(PR#37633);CAST设置cast_ipv4_ipv6_default_on_conversion_error修复(Bug Fix#37761);system.build_options暴露 BoringSSL 版本信息(PR#37850)。
6. MergeTree/TTL
- TTL 过期列在后续 merge 中不再写出:此前只有首次 merge/optimize 不会写出 TTL 过期列,后续 merge 仍会写出;现在所有后续 merge 均跳过(PR
#37570)。
7. 查询执行与优化器
- 分片本地副本协同读取:当分片存在本地副本时,同时创建本地执行计划与读取所有远端副本的计划,二者共享协调 initiator(PR
#37204); - 更多 join 条件下推过滤(PR
#37472); - 非平凡 SQL 函数的 LIKE/MATCH 支持:支持非常量的
(NOT) (I)LIKE与MATCH(PR#37251); - 短路函数处理改进(PR
#37384); CompressedWriteBuffer::nextImpl()去除写拷贝:插入数据时不再把压缩结果先写进中间缓冲再拷贝到输出,而是直接压缩到目标输出(PR#37242);- 客户端按 DNS 返回的每个 IP 依次尝试连接,直到成功(PR
#37273); mark_cache_size未显式配置不再中断启动(PR#37326)。
8. clickhouse-keeper
- 损坏日志移入时间戳目录:broken logs 被移动到带时间戳的文件夹,便于保留现场(PR
#37565); - watch 只存储唯一 session ID(PR
#37641),减少内存占用; - 修复单节点集群强制恢复(PR
#37440)、dead_session_check_period_ms单位错误导致的会话清理延迟(PR#37824)、Keeper Docker 镜像协调目录属主问题(PR#37915)。
9. 统计与可观测性
- 写盘 part 类型可观测:新增 ProfileEvents
Inserted{Wide/Compact/InMemory}Parts、MergedInto{Wide/Compact/InMemory}Parts,并在system.part_log增加part_type列(PR#37536); - Play UI 改进:横向滚动时保持控件位置(PR
#37470);查询输入框可扩展超过 20% 高度(PR#37488、#37504,后者曾回滚再恢复); - 客户端不再显示
-0.0CPU 时间(PR#38064); - ARM 栈回溯修复(PR
#37797); - 层级字典函数支持 Nullable 的 HIERARCHICAL 属性(PR
#37805)。
10. 其他杂项改进
- 自解压可执行文件支持(PR
#35775,配套修复见#38011); hdfsClusterschema 推断支持(PR#35812);- 数值 CDF 函数替代积分计算以提升精度与速度(PR
#36953); - 修复零拷贝复制下 part fetch 的罕见死锁(PR
#37424); - ODBC bridge 增加禁用连接池选项(PR
#37705); ON CLUSTER等安全查询通过客户端/本地工具传入 QueryKind 便于调试(见 NOT FOR CHANGELOG#37290)。
五、构建 / 测试 / 打包改进
- 工具链升级到 clang-14 / LLVM 14(PR
#34754); - 启动时允许降权:简化 Docker 镜像的权限处理(PR
#36341); - 移除递归子模块并增加风格检查防止其回归(PR
#37616); - CI 增加文档拼写检查(PR
#37790); - 修复过度 stripping 导致可执行文件内置哈希被移除的问题(PR
#37993); - 修复 macOS 构建 compressor 失败(PR
#38007)。
六、Bug 修复
v22.6 包含两批次 Bug 修复,覆盖查询执行、格式解析、分布式、WindowView、字典、Keeper 等关键路径。
1. 第一批 Bug Fix
- 修复
GROUP BY聚合函数类型列(AggregateFunction类型列作为分组键)的问题(#37093); - 修复读取
system.projection_parts/system.projection_parts_columns时的堆释放后使用(use-after-free)(#37185); - 修复 WindowView
addDependency在表被 drop 时误加依赖的问题(#37224、#37243); - 修复列式格式缺失列默认值填充错误——此前按类型默认值而非列默认值填充(
#37253); - 修复
Object类型嵌套数组插入的部分场景(#37305); - 修复聚合函数/prewhere/join 中常量字符串冲突导致的意外错误(
#37336); - 修复 projection 在
optimize_aggregation_in_order下GROUP/ORDER BY结果错误(#37342); - 修复 S3 key 名中的符号错误(
#37344); GROUPING SETS与ROLLUP/CUBE混用现在直接抛异常(#37367);- 修复非标准
background_pool_size/background_merges_mutations_concurrency_ratio(新式config.xml配置)下的LOGICAL_ERROR(#37413); - RowBinary 格式不再移除 UTF-8 BOM(
#37428); - 修复 normalizeUTF8 系列函数的逻辑错误(
#37443); - 修复 JoinSwitcher 中 LowCardinality(Nullable) 的 cast 问题(
#37453); - 修复 ORC/Arrow/Parquet 中命名元组输出(
#37458); - 修复
GROUPING SETS下 ORDER BY 单调函数优化(#37493); - 修复特定条件下与字典 join 的错误(
#37530); - 禁止
optimize_aggregation_in_order与GROUPING SETS组合(#37542); - 修复 ActionsDAG dump 信息错误(
#37587)、UNION 类型转换错误(#37593); - 修复
WITH FILL负区间STEP(#37600); - 修复
join_use_nulls=1时非法 joinGet 数组用法(#37650)、cross join 列数不匹配(#37653); - 修复 MySQL 数据库表
show create table在 named collections 下的段错误(#37690)、RabbitMQ 无 SETTINGS 建表后重启无法启动(#37691); - 修复 Unix 纪元前的 DateTime64 小数秒行为(
#37697); - readonly 模式禁止 SQL UDF 的 CREATE/DROP(
#37699); - 修复可执行 UDF 的 Nullable 参数格式化(
#37711); - 修复分布式查询下
optimize_monotonous_functions_in_order_by优化问题(#37724); - 修复
INTERSECT/EXCEPT常量字符串类型问题(#37738); - 修复 FunctionHashID 崩溃(
#37742)、values 表函数的类型转换逻辑错误(#37754)、schema 推断构造器异常时的段错误(#37760); - 八进制字面量不再被支持(
#37765);修复toString在 Date32 上的错误(#37775); - 修复
async_socket_for_remote/use_hedged_requests关闭时的分布式查询"No more packets are available"(#37826); - WindowView 执行
MODIFY QUERY不再删除内部目标表(#37879); - 修复字典自定义查询 + 更新字段 +
{condition}组合问题(#37947); - 修复外层 ORDER BY 与
WITH FILL组合时的错误结果(#37959); - WindowView 推送目标表时补充缺失默认列(
#37965)、修复编译栈溢出(#37996); enable_filesystem_query_cache_limit开启时对保留缓存超限抛错(#38004);- 修复多
WITH FILL列产生多余行的问题(#38074)。
2. 第二批 Bug Fix(行为修正复核)
- UNION 类型转换
LOGICAL_ERROR修复(#34775); - TTL merge 调度丢失问题:
BackgroundExecutor繁忙时 TTL merge 可能不再被重新调度——merges_with_ttl_counter在selectPartsToMerge()中递增,若任务因后台线程繁忙被忽略则计数不会减少,现修复(#36387); - 修复
normalize_function_names设置值被覆盖(#36937); - 修复指数时间衰减窗口函数边界问题(
#36944); - 修复 DateTime64 解析
'1969-12-31 23:59:59.123'的错误(#37039)。
3. NO CL ENTRY 与内部整理
开发期经历回滚/重提的条目包括:Object类型 mutation 修复回滚(#37355)、Play UI 高度限制移除回滚(#37501)、ZooKeeper 预处理回滚(#37534)、零拷贝复制死锁修复回滚(#37545、#37598)、UNION 类型转换回滚(#37582)、ReplicatedMergeTree 注释修改回滚(#37627)、递归子模块移除回滚(#37774)、schema 推断段错误修复回滚(#37785、#37787)、CheckTriviallyCopyableMove修复回滚(#37902)、容器清理回滚(#38001)、d3js 追踪可视化回滚(#38043、#38129)等。这些条目对用户透明,说明相关功能在发布前经过了多轮验证。
另外本版本还在 docs 中补充了更多 Rust 客户端库的文档(#37880),并包含大量非用户可见的工程整理(S3 操作日志冲突修复、cmake 清理、jemalloc 兼容性修复、clang-tidy 修复、测试稳定性修复等,详见 changelog 的 NOT FOR CHANGELOG / INSIGNIFICANT 部分)。
七、升级与使用建议
综合以上变更,从 v22.5 升级到 v22.6 时建议重点关注:
- 兼容性排查:检查是否使用
Object类型列且依赖旧二进制格式;确认下游 JSON 消费端是否依赖命名元组的数组输出(现默认对象化);为max_execution_time等秒级设置清理可能存在的Infinity/NaN值。 - 备份链路:可立即采用
SYSTEM UNFREEZE清理"表已删、备份未删"的孤儿备份,该语句需SYSTEM_UNFREEZE权限。 - 格式与导入:新引入的
JSONColumns系列、CSV/TSV 跳行设置、Avro Map/Record 支持可用于改善数据导入链路;input_format_skip_unknown_fields默认开启后,列子集读取的语义需注意。 - 性能验证:
FINAL并行化、ORDER BY LIMIT、聚合状态销毁异步化、动态分派优化等改动收益较大,建议在关键查询上做回归基准;FPC 编解码器建议先在目标数据分布上验证压缩率与 CPU 开销。 - 权限模型:若启用
on_cluster_queries_require_cluster_grant,需提前为相关用户授予CLUSTER权限,避免ON CLUSTER查询在升级后失败。
结语
v22.6.1.1985-stable 是 ClickHouse 在 2022 年的一个重要稳定版本:它一方面通过动态分派、列裁剪、并行化等手段系统性提升了查询性能,另一方面在 WindowView、JSON 列式格式、FPC 压缩、系统级备份管理(SYSTEM UNFREEZE)等方向补齐了能力,并修复了大量影响正确性的边界问题。本文所有条目均来源于 docs/changelogs/archive/v22.6.1.1985-stable.md,读者可结合仓库源码(如 src/Interpreters/InterpreterSystemQuery.cpp、src/Functions/grouping.cpp、src/Compression/CompressionCodecFPC.cpp、src/Formats/registerFormats.cpp)继续深入每个功能的具体实现。
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考