ClickHouse v22.10 版本深度解析:新特性、性能优化与升级注意事项
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
导读:本文基于 v22.10.1.1877-stable 官方变更日志 展开,系统梳理该版本引入的 Rust 代码支持、Kusto 查询语言(KQL)MVP、磁盘临时数据限额、文件系统缓存命令重命名等核心变更,并结合本仓库源码定位对应实现。读完本文,你将全面掌握 v22.10 相对 v22.9 的功能增量、不兼容风险点以及可在生产环境直接使用的关键设置与函数。
ClickHouse v22.10 是一个功能密度极高的稳定版本(基线为 v22.9.1.2603-stable),它既宣告了多项全新的能力边界——从把 Rust 代码编译进 ClickHouse 到 Kusto Query Language 的初始实现,也带来了一批直接影响日常运维的命令与配置变更。本文按官方变更日志的章节顺序,结合仓库源码逐一解读。
版本总览
| 维度 | 内容 |
|---|---|
| 版本号 | v22.10.1.1877-stable |
| 基线 | v22.9.1.2603-stable |
| 变更分类 | 不兼容变更、新特性、性能改进、改进、Bug 修复、构建/测试/打包改进 |
| 核心主题 | 语言扩展(Rust/KQL)、存储与缓存管理、分析函数增强、稳定性修复 |
向后不兼容变更(升级前必读)
1. 文件系统缓存命令重命名
show caches与describe cache分别被重命名为show filesystem caches与describe filesystem cache。这意味着所有依赖旧命令名的脚本、自动化巡检任务必须在升级后同步调整。本次重命名与 v22.10 同步引入的多个文件系统缓存新设置(如bypass_cache_threashold、enable_bypass_cache_with_threshold)共同表明,文件系统缓存已成为 v22.10 中一类独立、可管理的"一等公民"资源。
2. 移除 LIVE VIEW 的 WITH TIMEOUT 支持
WITH TIMEOUT子句在LIVE VIEW中的支持被彻底移除,对应 issue #40557。如果生产环境中仍在使用LIVE VIEW ... WITH TIMEOUT语法,需要在升级前改写为其他方案(如改用物化视图或定时查询),否则升级后相关语句将无法解析。
新特性详解
1. Rust 代码支持:以 BLAKE3 为第一个落地案例
v22.10 首次将 Rust 代码引入 ClickHouse 构建体系,并以 BLAKE3 哈希函数库作为示例。从当前仓库的 rust/ 目录 可以看出该集成机制的长期形态:
- rust/workspace/Cargo.toml 定义了 Rust workspace,成员包括
skim、prql、polyglot、wasmtime; - rust/workspace/polyglot/ 通过 C 头文件 polyglot.h 暴露跨语言 ABI;
- rust/chcache/ 则是独立的 Rust 组件(磁盘缓存)。
BLAKE3 函数最终以 SQL 函数形式注册:在 src/Functions/FunctionsStringHashFixedString.cpp 中,FunctionBLAKE3被注册为BLAKE3(message),返回值类型为FixedString(32)。其函数文档明确标注 "This cryptographic hash-function is integrated into ClickHouse with BLAKE3 Rust library",IntroducedIn字段即{22, 10},与本次变更日志完全对应。调用示例:
SELECT hex(BLAKE3('ABC'));2. Kusto Query Language(KQL)MVP 实现
v22.10 完成了 KQL 的初始实现(MVP),为 Azure 数据资源管理器(ADX)用户迁移到 ClickHouse 提供了查询方言层面的入口。虽然当前是 MVP 阶段,功能覆盖有限,但它标志着 ClickHouse 查询解析层开始支持多方言。需要特别说明的是,该能力在后续版本中持续演进,v22.10 阶段建议仅在测试环境验证语法兼容性,生产迁移仍需以标准 SQL 为主。
3. 磁盘临时数据上限:max_temporary_data_on_disk_size_for_user/_for_query
此前 ClickHouse 只能限制查询的内存用量,排序、聚合等算子溢写到磁盘的临时数据量缺乏独立管控。v22.10 新增两个设置:
max_temporary_data_on_disk_size_for_user:按用户维度限制临时数据落盘总量;max_temporary_data_on_disk_size_for_query:按单条查询维度限制。
这两个设置在 src/Core/Settings.cpp 与 src/Core/ServerSettings.cpp 中均有对应定义,且随该 PR 一并完成了旧名max_temp_data_on_disk→max_temporary_data_on_disk的命名规范化。对多租户共享磁盘的场景,这是防止单个用户拖垮整机 I/O 的重要护栏。
4. 加密与构建:OpenSSL 可选内建构建
新增构建开关ENABLE_CH_BUNDLE_BORINGSSL,用于在 BoringSSL 与 OpenSSL 两种内建 TLS 实现之间切换,默认使用 BoringSSL 内建构建。这为需要特定 OpenSSL 合规要求的发行版提供了替代路径。
5. 可组合协议配置(Composable Protocol)
引入可组合协议配置能力,使网络协议的端口、处理器可按需组装,为后续的协议扩展与定制部署打下基础。
6. OpenTelemetry 支持 ON CLUSTER DDL
ON CLUSTER分布式 DDL 语句现在可以携带 OpenTelemetry 追踪上下文。启用前提是将distributed_ddl_entry_format_version设置为 4——该设置的实际解析与执行逻辑可在 src/Interpreters/DDLTask.cpp 与 src/Interpreters/InterpreterCreateQuery.cpp 中追踪。升级后如需使用该能力,务必先确认distributed_ddl_entry_format_version的取值。
7. JSONObjectEachRow:列值作为对象名
新增设置format_json_object_each_row_column_for_object_name,允许在 JSONObjectEachRow 格式中把某列的值作为 JSON 对象名写出/解析,适合处理键值对形态的流式数据。
8. Morton 编码(ZCurve)编解码函数
新增mortonEncode/mortonDecode函数对,用于在空间填充曲线(Z-order curve)与多维坐标之间互转,是地理围栏、多维索引类场景的基础工具。实现位于 src/Functions/mortonEncode.cpp 与 src/Functions/mortonDecode.cpp。
9. UUID 二进制格式双模式支持
实现两种最常见的 UUID 二进制格式:默认大端序(big-endian)与 Microsoft 混合端序(mixed-endian,对应 RFC 4122 4.1.1 节)。这解决了与 Windows/.NET 生态交互时 UUID 字节序不一致导致的对不上问题。
10. 统计学聚合函数:analysisOfVariance(anova)
新增聚合函数analysisOfVariance(别名anova),对多组正态分布观测样本执行方差分析(ANOVA),判断各组均值是否相同。其实现位于 src/AggregateFunctions/AggregateFunctionAnalysisOfVariance.cpp,getName()返回"analysisOfVariance",并由 src/AggregateFunctions/registerAggregateFunctions.cpp 完成注册。典型用法:
SELECT analysisOfVariance(group_col, value_col) FROM experiments;11.SET setting_name = DEFAULT
SET语句现在支持SET setting_name = DEFAULT,可将会话设置一键恢复为默认值,避免手动查询默认值再写回。
12. URL 函数 RFC 变体族
新增一批符合 RFC 规范的 URL 解析函数:cutToFirstSignificantSubdomainCustomRFC、cutToFirstSignificantSubdomainCustomWithWWWRFC、cutToFirstSignificantSubdomainRFC、cutToFirstSignificantSubdomainWithWWWRFC、domainRFC、domainWithoutWWWRFC、firstSignificantSubdomainCustomRFC、firstSignificantSubdomainRFC、portRFC、topLevelDomainRFC。这些RFC后缀变体与既有同名函数的行为差异在于严格遵循 RFC 3986 的解析规则,在处理国际化域名、端口省略等边界时结果更可预期。
13. 概率分布随机数生成函数族
新增 11 个按指定分布生成随机值的函数:randUniform、randNormal、randLogNormal、randExponential、randChiSquared、randStudentT、randFisherF、randBernoulli、randBinomial、randNegativeBinomial、randPoisson。配合已有的rand()与rand64(),ClickHouse 现在可以直接在 SQL 中做蒙特卡洛模拟与统计抽样。
14.javaHash支持 Java 整数哈希
javaHash函数扩展为支持 Java 整数(int)哈希,使 Java 生态写入的数据在 ClickHouse 侧可得到与 Java 端一致的哈希结果,方便分片键对齐。
性能改进要点
DISTINCT有序优化:DISTINCT可复用数据流已有的排序属性,无需再为DISTINCT列显式提供ORDER BY即可按序读取(对应设置optimize_read_in_order家族)。该优化在 v22.10 曾出现边界 Bug(排序键首列含函数时触发LOGICAL_ERROR),已在同版本修复。- "Too many parts" 阈值放宽:当分区平均 part 尺寸足够大(至少 10 GiB)时,允许单个分区容纳更多 part,使单表单分区可支撑 PB 级数据(配合磁盘阵列或对象存储),关闭了长期 issue #6551。
- Azure Blob Storage 写入优化:写放大降低,
max_single_part_upload_size得到正确尊重。 - 字符串比较优化:当一侧参数为空常量字符串时比较性能提升。
- ColumnVector 索引优化:UInt8 索引路径引入 AVX512VBMI 向量化(该 PR 曾一度回滚,随后在 "NOT FOR CHANGELOG" 中重新启用)。
- 进程列表与 query_log 线程 ID 唯一化:避免线程 ID 复用造成的排查干扰。
- AArch64 启用 LSE 原子指令(要求 ARMv8.2+,见后文构建部分)。
改进与运维友好度提升
- 异步插入可观测性:新增系统表
asynchronous_insert_log,记录异步插入及wait_for_async_insert=0的 fire-and-forget 模式查询结果,是定位异步插入丢数据问题的关键入口。 - 交互式历史搜索:
clickhouse-client/clickhouse-local支持 fzf/sk 风格的模糊历史搜索,可用FZF_DEFAULT_OPTS/SKIM_DEFAULT_OPTIONS调整行为;从仓库 rust/workspace/Cargo.toml 可见skim正是作为 Rust workspace 成员被引入的组件。 - 安全加固:新增
allow_implicit_no_password设置,禁止隐式创建无密码用户,除非显式写IDENTIFIED WITH no_password;客户端连接证书无效时,仅允许通过--accept-certificate标志继续。 - 系统表增强:
system.disks新增unreserved_space列,可查看每块磁盘未被保留占用的空间。 - 复制表自愈改进:
ReplicatedMergeTree失联副本恢复时,若本副本持有健康副本未来复制队列中才出现的 part,则保留而非 detached,减少恢复期数据搬运。 - Keeper 改进:快照可上传至 S3(配置于
keeper_server.s3_snapshot);支持 MultiRead;失联连接恢复更快。 - 备份能力扩展:
BACKUP支持 S3 目标,且支持 as-is 路径/数据结构;>4GB 文件从 base backup 复用的 Bug 一并修复。 - Merge 策略:新增
min_age_to_force_merge_seconds,允许将某范围内所有 part 在全部超过指定年龄后强制合并(issue #35836)。 - 缓存旁路:新增
enable_bypass_cache_with_threshold与bypass_cache_threashold,当请求读范围超过阈值时完全跳过缓存(既不下载也不读缓存)。 - 函数族增强:新增
tryDecrypt(解密失败返回 NULL 而非抛异常)、tryBase58Decode、countState(*)、date_diff支持Date32参数等。 - HTTP 层:
Accept-Encoding支持 lz4/bz2/snappy;CORS 头缺失问题修复。 - 时区数据:tzdata 更新至 2022e(巴勒斯坦夏令时调整、乌克兰三个时区合并、约旦/叙利亚改为全年 +03)。
Bug 修复重点(stable 分支用户可见问题)
- 查询正确性:修复
ORDER BY/GROUP BY使用排序键前缀列且被单调函数包裹时,在optimize_read_in_order/optimize_aggregation_in_order下的错误结果;修复 NULL 字面量过滤条件参与索引分析;修复 row policy 过滤器中子查询不可用的问题。 - 存储与复制:修复启动时 "Part ... intersects part ..." 罕见报错;修复 detached 损坏 part 导致复制无法启动;修复旧版本(20.3 之前创建且从未 ALTER)的
ReplicatedMergeTree在 22.9 无法启动的问题;compact part 与压缩 marks 的组合问题。 - 类型与函数:修复
AggregateFunctionQuantile将 UInt128 误作 Int128;修复 Decimal 处理的缓冲区溢出(issue #42451);修复runningDifference与Date32的 cast 错误;toDateTime64负整数与负浮点参数结果不一致。 - 分布式与网络:修复
use_hedged_requests=0时分布式查询的超时异常;additional_table_filters未作用于Distributed表;批量发送失败导致 HTTP 线程阻塞的累积问题。 - 其他:修复
background_pool_size单独设置时启动失败;ALTER UPDATE生成无效columns.txt元数据;Annoy 索引在非 Float32 列上插入时的bad_assert。
构建 / 测试 / 打包改进
- AArch64 最低要求提升至 ARMv8.2(2016 年发布),主要获益是可用 LSE 原生原子操作;如需兼容旧硬件(如 Raspberry Pi 4 的 ARMv8.0),提供 CMake 选项
NO_ARMV81_OR_HIGHER编译旧基线二进制,官方下载脚本也会在 ARMv8.0 / ARMv8.2 构建间自动选择。 - Musl 构建恢复可用,静态链接场景更完整。
- 工具链升级:LLVM 在本版本周期内从 12 一路升至 15.0.2(含 clang/LLD 移除后的适配);cctz 更新至最新 master,tzdb 更新至 2020e。
- 端序修复:s390x 平台修复 SipHash 与 T64 压缩编码器的 Endian 问题;ppc64le 启用 lib base64;修复 power8 支持。
- AST Fuzzer:支持生成 WHERE 子句、可增删 ORDER BY/WHERE。
$CLICKHOUSE_CRONFILE存在性检查:避免 sed 对不存在文件的报错。
升级与使用建议
- 优先处理两条不兼容变更:脚本中的
show caches/describe cache需改写为show filesystem caches/describe filesystem cache;移除所有LIVE VIEW ... WITH TIMEOUT用法。 - 安全默认值:建议评估
allow_implicit_no_password的启用,避免无密码用户被静默创建。 - 多租户磁盘管控:为共享磁盘环境配置
max_temporary_data_on_disk_size_for_user与max_temporary_data_on_disk_size_for_query。 - 遥测与审计:如需
ON CLUSTERDDL 的 OpenTelemetry 追踪,将distributed_ddl_entry_format_version显式设为 4 并验证集群内版本一致性。 - 新函数按需采用:
BLAKE3、analysisOfVariance、Morton 编解码、RFC URL 函数、随机分布函数族均可直接用于生产查询,但 KQL 方言仍属 MVP,建议在测试环境先行验证。
结语
v22.10 是 ClickHouse 在"多语言、多方言、大存储"三个方向同时迈出关键一步的版本:Rust 进入构建体系意味着未来高性能原生库可以更顺畅地接入;KQL MVP 降低了 ADX 用户的迁移门槛;放宽的 part 阈值配合对象存储让单分区 PB 级数据成为现实。对运维与开发者而言,本版本最大的价值在于磁盘临时数据限额、文件系统缓存命令体系、异步插入可观测性这三项直接影响规模化运行能力的改进。完整的条目清单可随时回查本仓库的 变更日志。
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考