
ClickHouse 22.5 版本深度解析新特性、性能优化与稳定性改进全览【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 docs/changelogs/archive/v22.5.1.2079-stable.md 官方 Changelog 整理而成并深入对应源码确认实现细节。ClickHouse 22.5 是 2022 年发布的稳定版本引入了 GROUPING SETS、MeiliSearch 存储引擎、Prometheus 输出格式、MySQLDump 输入格式、wyHash64 哈希函数等一批重要能力同时在 JIT 编译、Join 并行、聚合性能等方面做了深度优化。读完本文你将掌握 22.5 版本的核心新语法与配置项、关键性能改进的底层原理以及需要重点关注的破坏性变更与修复清单。一、Backward Incompatible Change升级前必读22.5 版本包含两个需要升级用户特别关注的破坏性变更。1. FIPS 合规的 BoringSSL本版本将 BoringSSL 模块升级为官方 FIPS 合规版本从而使 ClickHouse 整体达到 FIPSFederal Information Processing Standards合规要求。对于有合规需求的政企或金融用户这意味着可以在启用 FIPS 模式的系统中正常运行 ClickHouse 的 TLS 链路而无需额外的兼容层。2. 后台任务与 SelectedRows/SelectedBytes 指标语义变化此前后台合并merges、变更mutations以及OPTIMIZE操作会同时累计SelectedRows和SelectedBytes指标。自 22.5 起后台 merges、mutations 和OPTIMIZE不再递增SelectedRows与SelectedBytes它们仍然像之前一样递增MergedRows和MergedUncompressedBytes。这意味着依赖SelectedRows/SelectedBytes监控前台查询负载的用户升级后这些指标会显著变小不再混入后台任务量需要相应调整告警阈值与容量规划模型。二、New Feature22.5 的新能力全景1. GROUPING SETSGROUP BY 多维分组22.5 正式支持在GROUP BY子句中使用GROUPING SETS并支持对多个 grouping sets 进行并行处理。这是对多维度汇总报表如同时按天、按天城市、全量聚合的核心语法补充。从源码实现看优化器对只有单个分组的GROUPING SETS做了重写简化。在 src/Interpreters/GroupingSetsRewriterVisitor.h 中可以看到其规则GROUPING SETS (foo)→GROUP BY fooGROUPING SETS ((foo, bar))→GROUP BY foo, bar而GROUPING SETS (foo, bar)两个分组不会被重写保留多维语义。-- 一次查询得到三种粒度的统计 SELECT toDate(event_time) AS day, city, count() FROM events GROUP BY GROUPING SETS ( (day), (day, city), () );2. MeiliSearch 存储引擎与表函数本版本新增了MeiliSearch的存储引擎StorageMeiliSearch和对应的表函数实现使得 ClickHouse 可以直接读写外部 MeiliSearch 全文检索引擎中的数据实现ClickHouse 聚合分析 MeiliSearch 全文检索的组合架构。3. SYSTEM SYNC DATABASE REPLICA同步 Replicated 库元数据Replicated 数据库的元数据同步是异步的这可能导致副本间表结构短暂不一致。22.5 新增SYSTEM SYNC DATABASE REPLICA查询用于显式同步指定 Replicated 数据库的元数据SYSTEM SYNC DATABASE REPLICA replicated_database_name;该命令在 src/Parsers/ParserSystemQuery.cpp 中解析Type::SYNC_DATABASE_REPLICA并由 src/Interpreters/InterpreterSystemQuery.cpp 执行。在创建副本库后、或需要确保各副本表结构一致时可主动调用它等待元数据同步完成。4. Prometheus 输出格式新增Prometheus输出格式输出侧可将查询结果渲染为 Prometheus 文本暴露格式便于直接接入 Prometheus 抓取端点作为自定义指标源。该格式通过 src/Formats/registerFormats.cpp 中的registerOutputFormatPrometheus注册FORMAT Prometheus即可使用。5. JSONLines / NDJSON 别名为JSONEachRow增加JSONLines与NDJSON两个别名满足常见的数据交换工具习惯。这意味着在INSERT ... FORMAT NDJSON、SELECT ... FORMAT JSONLines中均可直接使用无需再记忆JSONEachRow这一名称。6. 查询级 parts_to_delay_insert / parts_to_throw_insertparts_to_delay_insert与parts_to_throw_insert控制 MergeTree 分区数过多时的插入延迟/拒绝阈值此前是表级设置22.5 起提升为查询级设置可在查询中覆盖表级配置INSERT INTO tbl SELECT ... SETTINGS parts_to_throw_insert 500;7. 临时表统计信息临时表Temporary Table现在可以在系统表中展示总行数total rows与总字节数total bytes便于排查会话级临时数据的内存占用。8. 新哈希函数 wyHash64新增wyHash64哈希函数返回 UInt64。其实现位于 src/Functions/FunctionsHashing.hImplWyHash64第 1971 行附近注册为wyHash64文档信息见 src/Functions/FunctionsHashingMisc.cppSELECT wyHash64(ClickHouse) AS Hash; -- 12336419557878201794值得关注的是源码注释中对各哈希函数的 AVX-512 适用性做了详细评估wyHash64在 8 字节及以下参数上性能约为 xxHash64 的 0.85 倍、其余场景持平因此 AVX-512 对其没有收益hash_avx512_usageImplWyHash64 HashAVX512Usage::Never而xxHash64、xxh3、murmurHash2_64、cityHash64等则能从 AVX-512 中获益。选择哈希函数时如需 SIMD 加速与高速吞吐xxHash64/xxh3仍是更优选择。9. 窗口函数 nth_value新增窗口函数nth_value允许在窗口分区内取第 N 个值补齐了分析函数矩阵first_value/last_value/nth_value的一环SELECT department, employee, nth_value(salary, 3) OVER (PARTITION BY department ORDER BY salary DESC) AS third_highest FROM employees;10. MySQLDump 输入格式新增MySQLDump输入格式输入侧可直接读取mysqldump导出的文件它会读取 dump 中属于一个表的所有INSERT语句数据若 dump 包含多个表默认读取第一个表的数据。该格式在 src/Formats/registerFormats.cpp 中通过registerInputFormatMySQLDump注册。配合表函数file或url即可将 MySQL 备份直接灌入 ClickHouse简化 MySQL 迁移链路SELECT * FROM file(dump.sql, MySQLDump) -- 或按目标结构 INSERT INTO my_table SELECT * FROM file(dump.sql, MySQLDump);11. 单二进制诊断工具 clickhouse-diagnostics新增基于单一二进制的诊断工具clickhouse-diagnostics用于快速收集服务器状态信息其使用说明见 utils/clickhouse-diagnostics/README.md。该工具适合在排查生产环境问题时一键导出诊断数据。12. 远程文件访问监控系统表新增用于统计远程文件访问请求的系统表目标是帮助用户在存算分离场景下分析性能波动原因。查询读取远端文件的某个 segment 时产生一条记录读取类型包括读取类型含义READ_FROM_FS_AND_DOWNLOADED_TO_CACHE从远端文件系统读取并下载到本地缓存READ_FROM_CACHE直接命中本地缓存READ_FROM_FS_BYPASSING_CACHE绕过缓存直接读取远端文件通过该表可量化缓存命中率定位读远端与读缓存的比例从而诊断存算分离架构下的性能抖动来源。13. H3 地理网格函数扩展新增h3Line两点间网格线、h3Distance两点网格距离、h3HexRing六边形环三个 H3 索引函数实现均位于 src/Functions/ 下如 h3Line.cpp、h3Distance.cpp、h3HexRing.cpp与既有的geoToH3、h3kRing等共同构成完整的地理空间分析工具集。同时为h3kRing第二参数增加了隐式类型转换提升了易用性。14. system.certificates 系统表新增system.certificates系统表展示服务器信任的证书信息。对应实现为 src/Storages/System/StorageSystemCertificates.h可用于审计 TLS 证书链配置。三、Performance Improvement性能优化详解1. JIT 编译排序比较器ORDER BY、MergeJoin 以及 MergeTree 插入流程中排序列的比较器支持 JIT即时编译编译显著减少比较函数调用开销。这也是 ClickHouse 通过 LLVM 对热点算子做运行时代码生成的代表性实践。2. OR LIKE 链改写为 multiMatchAny优化器将LIKE串联的OR条件改写为multiMatchAny基于 RE2 的多模式匹配大幅提升多模式文本过滤性能。3. countDistinct 查询重写SELECT countDistinct(a) FROM t会被重写为SELECT count(1) FROM (SELECT a FROM t GROUP BY a)利用聚合下推消除多余的 distinct 中间层减少数据传输。4. system.asynchronous_metric_log 瘦身约 10 倍重构了system.asynchronous_metric_log的表结构占用空间减少约 10 倍同时移除了无用的event_time_microseconds字段。这是对系统监控日志常驻磁盘空间的直接削减。5. HashJoin 右表并行填充默认HashJoin插入右表行时不是线程安全的此前只能在单线程中执行右表较大时 CPU 利用率低、Join 过慢。22.5 修复了该瓶颈使右表构建可并行化显著改善大右表 Join 的吞吐。6. File 存储与 glob 读取优化当路径包含 glob 且匹配目录内含大量文件时File存储和file表函数的读取性能得到提升。同时改进了 glob 场景下的 schema 推断只在合理情况下尝试下一个匹配文件此前任何错误都会尝试下一个文件并修复了相关推断缺陷src/Interpreters/TreeOptimizer.cpp 等相关优化器逻辑。7. HiveText 输入格式并行解析为HiveText输入格式实现并行解析读取本地文件时解析速度提升可达 2 倍。对 Hive 数仓文本数据的导入场景收益明显。8. 文件描述符缓存互斥锁细化通过收窄文件描述符缓存中 mutex 的作用域减少锁竞争提升高并发小文件访问的性能。9. WindowView WATCH 查询优化改进 WindowView 的WATCH查询通过fire_condition信号缩短结果提供延迟并通过更频繁检查isCancelled()加速 ctrl-c 取消操作。10. 无 GROUP BY 的 avg/sum 优化不带GROUP BY表达式时即全表聚合avg、sum聚合函数性能得到提升使用更高效的向量化聚合路径。11. 一元算术函数动态分发bitCount、bitNot、abs、intExp2、intExp10、negate、roundAge、roundDuration、roundToExp2、sign等一元函数通过动态分发dynamic dispatch优化为不同数据类型选择最优执行路径。四、Improvement易用性与稳定性增强1. clickhouse-client / clickhouse-local 改进使用clickhouse-client --file而未前置--external时给出明确提示clickhouse-client/clickhouse-local中INSERT查询可被正确取消clickhouse-local中INSERT SELECT及文件处理的进度提示更准确clickhouse-benchmark支持从环境变量读取认证信息。2. 内存超卖Memory Overcommit默认开启内存超卖overcommit默认启用在选定查询被停止之前若所需内存已释放所有等待查询继续执行若在查询收到取消通知前内存已释放则不再停止任何查询。这显著缓解了内存不足时的误杀。其核心实现围绕 src/Common/MemoryTracker.h 中的OvercommitTracker/OvercommitRatio展开配套测试见 src/Common/tests/gtest_overcommit_tracker.cpp。本版本还修复了OvercommitRatio比较时的潜在溢出、以及日志期间 OvercommitTracker 的潜在死锁问题。3. 后台任务线程数运行时调整在顶层配置中指定的后台操作线程数merges、mutations、moves、fetches现在可以在运行时增加。此前background_fetches_pool_size等设置被废弃后若出现在顶层配置会抛出A setting background_fetches_pool_size appeared at top level in config异常此问题也在本版本修复。4. 文件系统缓存管理SYSTEM DROP FILESYSTEM CACHE查询得到增强支持path选项按路径删除以及FORCE选项强制删除。缓存读取逻辑与current_size统计、system.filesystem_cache_log日志列等也有多处修正与完善。5. 系统表与监控增强system.processes新增is_all_data_sent列用于判断结果数据是否全部发送完毕实现见 src/Storages/System/StorageSystemProcesses.cpp内部测试的 hardening 检查也基于它system.session_log补齐缺失的枚举值修复system.opentelemetry_span_log的attribute.values别名错误修复 S3 读取耗时指标计算错误新增S3Requests指标与更多 fs cache 相关 CurrentMetrics/异步指标。6. 安全与访问控制新增行级安全策略row policy新模式可在主配置中启用允许没有 permissive 行策略的用户读取行默认为拒绝方便在多租户场景下放开只读用户新增user_defined_path配置项用于指定用户自定义对象如 UDF的路径。7. 数据摄取与格式Protobuf 支持通过 Google wrappers 检测 Nullablefile、s3、url表函数解析出错时显示具体出错文件名修复file表函数在clickhouse-local中允许使用文件描述符s3Cluster表函数支持集群宏cluster macroObject类型支持Object(Nullable(...))转换JSON 复杂嵌套数组插入Object列的多个问题被修复元组元素允许以数字开头命名。8. 兼容性新增compatibility_ignore_auto_increment_in_create_table选项创建表时忽略列声明中的AUTO_INCREMENT关键字简化 MySQL 迁移新增 Keeper 集群配置的keeper_server.host_checks_enabled开关用于启用/禁用主机名健全性检查Keeper 支持强制恢复force recovery允许在无 quorum 的情况下重新配置集群。9. 其他改进1970-01-01 之前、带整点/半点时区的日期时间转换函数在溢出时饱和到零而非报错MySQLHandler 中取消查询时保留合理的 query id向其他服务器发送异常时附带额外诊断信息如适用哈希函数支持Array(Tuple(..))参数若以 log level test 运行 clickhouse-server 会发出警告该级别仅用于测试会产生不可避免的性能退化Play UI单行多列结果垂直展示、Nullable 数字右对齐、超长查询输入框可扩展不遮挡数据区默认关闭log_query_threads设置——它记录参与查询执行的每个线程统计引入异步读取后线程 id 数量过大写入query_thread_log过于沉重故改为默认关闭。五、Bug Fix官方稳定版用户可见问题修复1. 第二类修复用户可见错误行为修复ilike()在 FixedString 列上可能返回错误结果匹配过少的问题修复optimize_skip_unused_shards_rewrite_in的隐式类型转换为子查询启用enable_global_with_statement修复 WindowViewWATCH EVENTS因非空 Chunk 被终止、多列 WindowView schema 转换、hop window 触发、删除未触发数据后max_fired_watermark更新、删除源表卡死等问题修复分布式查询LIMIT BY的 Cannot create column of type Set 错误修复OvercommitRatio比较溢出与日志死锁Kafka 生产端不再需要group.id此前控制台会出现Configuration property group.id is a consumer property and will be ignored by this producer instance警告修复 MySQL 数据库引擎对binary(0)数据类型的兼容修复含Object列表的 mutation 执行UPDATE/DELETE的 WHERE 暂不允许使用 Object 子列修复Nullable(String)到Nullable(Bool/IPv4/IPv6)的转换修复system.opentelemetry_span_log属性别名错误。2. 第一类修复官方 stable 版本中的用户可见问题修复substring函数在 offset/length 为负常量时的范围错误修复 Arrow 输出未编译 ZSTD 支持的问题修复 compact parts 中嵌套列的ALTER DROP COLUMN修复特殊算子内使用别名时的解析错误如SELECT substring(test AS t, 1, 1)修复 JOIN 断言与 nullptr 解引用、JOIN WHERE 字面量错误修复ClickHouseDictionarySource含标量子查询时的字典重载、外部字典主机名无法解析导致启动失败修复s3Clusterschema 推断导致部分数据未读取修复clickhouse-benchmarkJSON 报告结果修复客户端收到未知服务器包、可执行 UDF 在 GROUP BY 中的使用修复 Keeper 集群 hostname 检查与压缩日志损坏问题修复flatten_nested 0建表重启后被拍平、INTERPOLATE与 MergeTree 的 Missing column、宽 parts 的垂直合并与Object类型合并移除有 bug 的groupArraySorted函数修复 Hedged 请求超时发送远程查询后连接挂起导致无限等待、max_parallel_replicas ! 1时外部表数据发送修复quantileTDigest中 inf 值问题修复 LowCardinality→ArrowDictionary 索引类型非 UInt8 时的非法输出修复optimize_aggregation_in_order1与*Array聚合函数组合、INSERT SELECT隐式聚合性能退化修复缓存current_size计数、远程 fs 缓存读取中的错误类型转换与低基数异步读取问题。六、Build / Testing / Packaging构建与发布改进clickhouse-keeper 静态链接x86_64架构的clickhouse-keeper现使用 musl 静态链接不依赖任何系统库部署时无需处理动态库依赖PowerPC64LE 支持ClickHouse 为PowerPC64LE架构提供构建产物可通过通用安装脚本与直链下载同时将 PowerPC 代码生成限制在 Power8 以获得更好兼容性CMake 健壮性更稳健地处理未知架构、简化 cmake 构建脚本CI 流程性能对比在报告出错时直接判失败、大部分构建任务使用 depth1 检出、统一force tests标签、minizip-ng 升级至可修复 dangling remote ref 问题的版本测试修复修复 rabbitmq liveness 检查的错误 import、简化性能测试以使其更易使用。七、升级建议与总结综合 22.5 的变更升级前建议关注以下几点监控指标变化SelectedRows/SelectedBytes不再包含后台任务量若告警依赖这两个指标需重新校准FIPS 环境如果运行在 FIPS 模式下22.5 已内置合规 BoringSSLlog_query_threads默认关闭需要线程级统计的用户需显式开启利用新能力GROUPING SETS、SYSTEM SYNC DATABASE REPLICA、Prometheus 输出、MySQLDump 输入、wyHash64 与 nth_value 等新特性可直接提升查询表达力与迁移效率内存策略内存 overcommit 默认开启对内存受限环境是利好的软着陆策略但建议结合 src/Common/MemoryTracker.h 相关参数评估。22.5 延续了 ClickHouse 高性能 高可用 易迁移 的演进主线一方面通过 JIT、并行 Join、聚合与哈希函数优化持续压榨性能另一方面通过 GROUPING SETS、MySQLDump、MeiliSearch 等能力降低了从 MySQL/Hive/全文检索系统迁入的门槛是 2022 年值得关注的一个功能密集型稳定版本。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考