news 2026/9/14 17:07:17

ClickHouse v22.8.1.2097-lts 变更日志解读:从 SLRU 缓存、并行分布式插入到轻量级删除的实现全景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ClickHouse v22.8.1.2097-lts 变更日志解读:从 SLRU 缓存、并行分布式插入到轻量级删除的实现全景

ClickHouse v22.8.1.2097-lts 变更日志解读:从 SLRU 缓存、并行分布式插入到轻量级删除的实现全景

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

本篇基于 ClickHouse 官方变更日志 v22.8.1.2097-lts,系统梳理该 LTS(长期支持)版本相对上一基线 v22.7.1.2484-stable 的全部变更:向后不兼容变更、新特性、性能优化、常规改进、Bug 修复与构建变化,并结合当前仓库源码印证其中关键特性的实现机制,帮助 DBA 与开发者在升级或选型时准确评估影响面与收益点。

版本定位与基线信息

该版本由提交9a2ff88435构建(文档中标注 FIXME),对比基线为 v22.7.1.2484-stable(提交f4f05ec786a)。变更日志按 ClickHouse 的标准分类组织为如下小节:

分类内容概要
Backward Incompatible Change可组合缓存(filesystem cache)重构、remote_url_allow_hosts覆盖面扩大、Date32/DateTime64 取值范围扩展
New Featureexact_rows_before_limit、SLRU 缓存策略、DeflateQpl 压缩编解码器、线程软限制、并行分布式 insert select、文本格式 schema 推断设置、JSON 日志、nowInBlockX-ClickHouse-SummaryOrdinaryAtomic数据库等
Performance ImprovementDISTINCT 与 ORDER BY 协同优化、AVX512 指令优化、AST 遍历剪枝等
Improvement标准DELETE FROM语法、timeSlots支持 DateTime64、schema 推断缓存、fsync 事件计数、system.backups表重构等
Bug Fix / Bug Fix (user-visible)涵盖排序、投影、JOIN、复制、磁盘 IO 等多类缺陷修复
Build / Testing / Packaging预构建二进制要求 AVX 支持、RISC-V 64 进 CI、s390x 字节序修复等

向后不兼容变更(升级必读)

这一节是升级评估的核心。v22.8.1.2097-lts 共包含三项向后不兼容变更:

1. 文件系统缓存(cache disk)可组合化

变更日志原文要点:缓存现在可以"叠加"在任意磁盘之上,包括 Azure Blob 存储磁盘、Local 磁盘、StaticWeb 磁盘等;旧缓存配置在新版本中依然可用,服务可以正常启动,旧的缓存文件也会继续被使用,但要让缓存按新语义工作需要更新配置文件。该变更关闭了 issue #36140 与 #37889,对应 PR #36171(作者 Kseniia Sumarokova)。

其动机是让缓存层与存储介质解耦:之前缓存必须独占一种<disk>类型,重构后任何磁盘都可以作为缓存的"下层介质",从而在对象存储场景中获得一层本地块缓存。当前仓库中 FileCache 实现 与 文件缓存设置 仍保留了这一层抽象,并且本版本同时引入了两个新的系统指标FilesystemCacheSizeFilesystemCacheElements(PR #40260),便于通过system.metrics监控缓存占用与对象数量。

2.remote_url_allow_hosts覆盖全部字典来源

此前该安全设置只作用于 HTTP、Cassandra、Redis 三类字典来源,本版本扩展到 ClickHouse、MongoDB、MySQL、PostgreSQL 来源的字典(PR #39184,作者 Nikolai Kochetov)。需要注意两点限制:

  • 只有通过 DDL(CREATE DICTIONARY)创建的字典会检查主机白名单;
  • 如果你的字典配置了不在白名单中的主机,升级后这些字典将拒绝加载。

3. Date32 与 DateTime64 取值范围扩展到 1900–2299 年

此前两个类型实际支持 1925–2283 年,本版本扩展为 1900–2299 年(PR #39425,作者 Roman Vasin,关闭 issue #28216)。实现采用 proleptic Gregorian calendar(延展格里高利历,符合 ISO 8601:2004 条款 3.2.1),不处理历史上儒略历到格里高利历的切换。对超范围入参的实现相关行为也随之改变:

  • 例如旧版本中1899-01-01会被钳制(clamp)为1925-01-01,新版本会被钳制为1900-01-01
  • 使用toStartOfInterval配合INTERVAL 3 QUARTER时,由于区间从实现相关的起点计算,舍入结果可能与旧版本相差至多一个季度。

如果你的业务逻辑隐式依赖旧的钳制边界或季度舍入行为,升级前需要对涉及超范围日期的查询做回归验证。

新特性详解

SLRU 缓存策略

本版本为非压缩数据缓存(uncompressed cache)与 marks 缓存引入 SLRU(Segmented LRU)策略(PR #34651)。SLRU 的核心思想是把缓存划分为"保护区"与"非保护区":只被访问过一次且长期未再使用的条目会优先被淘汰,而多次命中的热数据在顺序扫描冲击下不会被轻易挤出。

从当前仓库源码可以印证这一机制:SLRUCachePolicy.h 中的注释明确写道——"SLRU evicts entries which were used only once and are not used for a long time, this policy protects entries which were used more than once from a sequential scan",构造函数接受size_ratio参数,max_protected_size == 0时默认保护区大小取总容量的一半。该策略通过 CacheBase.h 提供线程安全封装,供 marks 缓存等场景复用。对于有大量顺序扫描型查询混入点查场景的集群,启用 SLRU 通常能显著提升热数据的缓存命中率。

DeflateQpl 压缩编解码器(Intel IAA 硬件加速)

面向 Intel Xeon Scalable "Sapphire Rapids" 平台,新增DeflateQpl压缩编解码器(PR #36654、#39494),利用 Intel In-Memory Analytics Accelerator(IAA)硬件加速器执行 DEFLATE 压缩/解压,底层通过 Intel QPL 库抽象硬件访问,硬件不可用时自动回退到软件实现。DEFLATE 相比 ClickHouse 默认的 LZ4 压缩率更高,因此可以换取更少的磁盘 IO 与更低的内存占用,适合存算分离或带宽受限场景中的冷数据表。注意当时该编解码器被标记为实验性质(见 NO CL ENTRY 中的 "Mark new codec DEFLATE_QPL as experimental"),生产使用前需要评估兼容性。

线程并发控制:concurrent_threads_soft_limit

为应对高 RPS(每秒请求数)场景下大量小查询同时创建线程导致的调度开销,本版本引入concurrent_threads_soft_limit配置参数(PR #37285、#37558),用于限制所有查询合计并发创建的线程总数,属于服务器级并发控制手段。当前仓库中该设置定义于 ServerSettings.cpp,由全局上下文统一执行。它与按单查询生效的max_threads形成两级控制:后者限制单条查询并行度,前者为集群整体线程池规模兜底,避免高并发下 CPU 过度超卖与上下文切换开销。

并行分布式 insert select

支持向 Distributed 与 Replicated 引擎表执行并行INSERT ... SELECT(PR #39107,关闭 issue #34670)。在此之前,Distributed 表的多副本写入只能串行等待各分片/副本完成,大表导入时吞吐受限;支持并行后各目标可并发接收数据,显著缩短导入窗口。

文本格式 schema 推断系列设置

围绕"从无 schema 数据源推断表结构"这一能力,本版本密集落地了四项设置(PR #39186、#40068,作者 Kruglov Pavel):

设置作用
input_format_try_infer_dates尝试从字符串推断 Date 类型
input_format_try_infer_datetimes尝试从字符串推断 DateTime 类型
input_format_try_infer_integers优先推断 Int64 而非 Float64
input_format_json_try_infer_numbers_from_stringsJSON 格式中尝试从字符串推断数值
schema_inference_hints为指定列显式给出结构提示,覆盖自动推断结果

配套地,file()/s3()/hdfs()/url()表函数引入了schema 推断缓存(PR #38286):同一文件的首次查询完成推断后,后续查询直接复用缓存的 schema(数据未变化时),并新增系统表system.schema_inference_cache查看缓存内容,以及SYSTEM DROP SCHEMA CACHE [FOR FILE/S3/HDFS/URL]语句手动失效缓存。这对频繁查询同一远端大文件的场景减少了重复采样开销。

其他值得注意的新特性

  • exact_rows_before_limit(0/1)(PR #25333,关闭 issue #6613):开启后rows_before_limit_at_least统计量返回精确值,代价是必须完整读取 limit 之前的数据,会牺牲查询速度。适合需要对"被 LIMIT 截断了多少行"做精确审计的场景。当前仓库中该设置仍定义于 Settings.cpp,并被 QueryPlan 优化(如 limitPushDown.cpp)作为优化开关引用。
  • nowInBlock([timezone])函数(PR #39533,关闭 issue #39522):返回每个数据块处理时刻的当前时间,与now()(查询级常量、会被常量折叠)不同,适合长时间运行的INSERT SELECT中生成贴近真实的写入时间。源码 nowInBlock.cpp 中注释直接点明 "In contrast to 'now' function, it's not a constant expression and is not a subject of constant folding",且isDeterministicInScopeOfQuery()返回 false。官方文档注明:不存在now64InBlocktodayInBlock变体。函数文档中给出的示例:
SELECT now(), nowInBlock(), sleep(1) FROM numbers(3) SETTINGS max_block_size = 1 FORMAT PrettyCompactMonoBlock -- now() 三行相同(查询开始时刻常量),nowInBlock() 随块递增
  • X-ClickHouse-Summary响应头(PR #39567):HTTP 接口在查询完成后返回的进度报告中新增result_rowsresult_bytes字段,当前实现位于 WriteBufferFromHTTPServerResponse.cpp,便于网关层无需解析结果即可统计真实产出规模。
  • executable()表函数支持设置(PR #39681):可以为外部可执行程序管道指定 settings 列表,控制查询执行行为。
  • Ordinary数据库自动转换为Atomic(PR #39933,解决 issue #39546):在数据目录的flags目录中创建空文件convert_ordinary_to_atomic,下次服务启动时所有 Ordinary 数据库自动迁移为 Atomic 引擎。当前仓库中该标志文件的识别逻辑位于 loadMetadata.cpp(convert_ordinary_to_atomic关键字可在该文件及 Context.cpp 中检索到)。
  • JSON 格式控制台日志输出(PR #39277):便于日志分析工具直接摄取与查询。
  • file(path[, default])表函数第二参数(PR #39218):文件不存在时返回默认值而非报错。

性能改进

本版本性能类改动集中在排序/去重路径与 SIMD 优化:

  • DISTINCT 与 ORDER BY 协同优化(PR #39432、#39528、#39538,作者 Igor Nikonov):当 DISTINCT 列与 ORDER BY 列匹配(或构成其前缀)时,DistinctSortedTransform可利用输入流已有序的特性,显著降低内存占用并缩短执行时间;此前该 Transform 实际退化为普通 DISTINCT 实现(未利用排序),并修复了仅当排序描述可应用于 DISTINCT 列时才启用优化的判断逻辑,减少执行期检查。
  • 基于输入流排序描述跳过排序(PR #38719):若输入流已满足排序描述则直接跳过排序步骤。
  • AVX512 指令优化:ColumnVector 过滤使用 AVX512VBMI2 compress store(PR #39633);bytes-to-bits 掩码转换的 SSE/AVX/AVX512 路径优化(PR #39586);针对 AVX512 VBMI2 平台,SSB 基准查询 3.1/3.2/3.3(SF=100)性能提升约 6%(PR #40033,测试环境为双路 Icelake Xeon 8380)。
  • 其他cluster等表函数取远端表结构时优先使用本地节点(PR #39440);未注册任何 UDF 时跳过 AST 的 UDF 遍历(PR #40069);CurrentMemoryTracker分配/释放路径优化(PR #40078);修复复杂查询 analyze 卡死(PR #38185)。

常规改进要点

  • 标准DELETE FROM语法支持(PR #37893):MergeTree 系表支持 SQL 标准DELETE FROM table WHERE ...写法,底层即轻量级删除(lightweight delete)实现,不再要求必须使用ALTER TABLE ... DELETE
  • timeSlots支持 DateTime64(PR #37951):亚秒级 duration 与 slot 尺寸在 DateTime64 上可用。
  • system.backups表重构(PR #39503):移除internal列,允许用户指定操作 ID,新增num_filesuncompressed_sizecompressed_sizestart_timeend_time列。
  • fsync Profile Events(PR #39179):新增 fsync 相关计数,方便定位持久化瓶颈。
  • clickhouse-obfuscator新增--save/--load参数(PR #39541):可保存与复用预训练混淆模型,便于压测生成与源分布一致的合成数据。
  • Keeper 相关:退出时创建快照,由配置keeper_server.create_snapshot_on_exit控制,默认true(PR #39755);Keeper 集群发现功能新增观察者模式(PR #40035,节点自身不属于集群)。
  • 溢出监控计数(PR #40205):新增OverflowBreak/OverflowThrow两类 ProfileEvent,用于区分因read_overflow_mode = 'break'等限制(如max_rows_to_read)产生的不完整结果。
  • 客户端显示服务端耗时(PR #39968):clickhouse-clientclickhouse-benchmark默认展示 server-side elapsed time,用于公平比较跨数据中心/云上的服务性能;clickhouse-benchmark可通过--client-side-time关闭,--randomize改为无参开关形式(PR #40193)。
  • 时区数据更新至 tzdata 2022b(PR #40184):智利 2022 年夏令时开始日期从 9 月 4 日推迟到 9 月 11 日;伊朗计划于 2022-09-21 回落后永久停止夏令时;并修正了 Asia/Tehran 1977 年前后的历史数据。
  • Arrow 支持 LARGE_BINARY/LARGE_STRING(PR #40293)。
  • 新增多个 Pretty 输出变体格式(PrettyMonoBlockPrettyCompactNoEscapes等,PR #39646),用于测试与调试输出。

关键 Bug 修复(面向用户的修复)

变更日志中 "Bug Fix (user-visible misbehavior in official stable release)" 一节的代表性修复包括:

  • ORDER BY WITH FILL 在不同日期/时间类型组合下查询挂起(PR #37849);
  • ORDER BY 匹配 projection 的 ORDER BY 时未排序即直接返回(PR #38725);
  • GROUP BY 中函数与表列/表达式重名时的错误优化(PR #39103);
  • 列裁剪优化中的位置参数错误(PR #39293)——可能直接导致读错列,属高危修复;
  • Replicated数据库下CREATE/DROP INDEX ... ON CLUSTER曾在所有副本执行(导致 DDL 队列卡死),已修复(PR #39565);
  • local_filesystem_read_method = 'pread_threadpool'在 Linux 5.9/5.10 内核上的CANNOT_READ_ALL_DATA异常(PR #39800)及配合O_DIRECTmin_bytes_to_use_direct_io)时的竞态(PR #39506);
  • mmap IO 缓存 + Ordinary 数据库下,删除后重建同名表可能读到旧数据(PR #39708)——这是又一处推动用户迁移到 Atomic 数据库的修复;
  • 指数衰减窗口函数衰变原点错误(PR #39593):由exp((t - curr_row_t) / decay_length)修正为以窗口末行为原点exp((t - last_row_t) / decay_length);对ROWS BETWEEN ... AND CURRENT ROW形式结果不变;
  • 加密磁盘读取 seek 修复(PR #39687)、HashMethodOneNumber常量列取错 key(PR #40020)、多列ENGINE = SetIN操作列顺序错误(PR #40225)等。

另有常规 Bug Fix 若干:Hadoop secure RPC(privacy/integrity 模式)支持(PR #39411)、JOIN 计划中重复列问题终于解决(PR #40009,关闭长期 issue #26809)。

构建、测试与打包

  • 预构建 x86 二进制开始要求 AVX 指令集(PR #39000):即要求 CPU 不低于 2011 年的 Intel Sandy Bridge / AMD Bulldozer。这是该版本对部署环境最直接的硬件门槛变化,老旧 CPU 只能选择自行编译(带ENABLE_AVX=OFF等选项)或使用更早版本。
  • 移除"将 ClickHouse 工具构建为独立可执行文件"的选项(PR #39520);
  • RISC-V 64 构建接入 CI(PR #40197),并持续修复 s390x 的字节序问题(BitHelpers、SipHash、Coordination 快照、Codec、BigEndian 读写辅助等,PR #39656/#39732/#39931/#40008/#40179);
  • clang-16 构建支持(PR #40181);TSAN 因 clang-14 问题临时改用 clang-13 构建(PR #39450);
  • 修复 systemd service 文件在/etc下的残留清理(PR #39323);修复 macOS 构建中__kevp__保留标识符告警(PR #39493)。

升级建议与影响面小结

结合以上变更,从源码结构与变更日志可以归纳出该 LTS 版本的三条升级主线:

  1. 存储层:filesystem cache 可组合化 + SLRU 策略 + 缓存监控指标,对象存储前置缓存场景需要按新方式配置<disk type="cache">或对应磁盘类型;同时两处读取路径修复(mmap 缓存读旧表数据、Ordinary引擎缺陷)进一步佐证了迁移 Atomic 数据库的必要性,可借助convert_ordinary_to_atomic标志文件在下次启动时自动完成转换。
  2. 资源治理concurrent_threads_soft_limit提供全局线程软上限,配合既有的max_threadsmax_concurrent_queries可构建更完整的容量模型;OverflowBreak/OverflowThrow计数让限流截断结果可观测。
  3. 数据工程:并行分布式INSERT SELECT、标准DELETE FROM语法、schema 推断缓存与 hints 设置,降低了大表导入、在线修正和异构数据源接入的工程成本。

需要注意的是:remote_url_allow_hosts的扩大覆盖与 Date32/DateTime64 边界钳制行为变化属于语义层面的不兼容,建议升级前用生产只读副本回放关键查询验证;同时确认部署机器的 CPU 满足 AVX 要求,再制定滚动升级计划。完整的逐条 PR 清单可查阅 原始变更日志,其中 "NO CL ENTRY" 与 "NOT FOR CHANGELOG / INSIGNIFICANT" 两节收录了不计入对外变更日志的内部提交,包含数次 revert 与恢复操作,可作为版本稳定性回溯的原始材料。

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 17:04:31

Laravel与ThinkPHP全面对比:团队与个人开发者如何选型?

我一直觉得&#xff0c;PHP圈子里最容易引战的话题&#xff0c;不是某个编辑器好不好用&#xff0c;也不是该不该上PHP 8&#xff0c;而是Laravel和ThinkPHP到底哪个强。这个问题你扔到群里&#xff0c;能吵出几十层高楼&#xff0c;吵完了谁也没说服谁。原因很简单&#xff0c…

作者头像 李华
网站建设 2026/9/14 17:03:40

Bokeh 数学符号渲染完全指南:在图表与控件中使用 LaTeX 和 MathML

Bokeh 数学符号渲染完全指南&#xff1a;在图表与控件中使用 LaTeX 和 MathML 【免费下载链接】bokeh Interactive Data Visualization in the browser, from Python 项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh Bokeh 原生支持在图表中渲染数学公式&#…

作者头像 李华
网站建设 2026/9/14 17:02:31

2026 GEO工具选型指南:从RAG原理到五款主流产品PoC验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 17:01:59

LaTeX数学动画像素跳动的根源与七步精准控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华