资讯动态

ClickHouse 23.6 发布详解:v23.6.1.1524-stable 新特性、性能优化与关键修复

发布时间:2026/9/15 20:31:01 来源:尧图企业网站定制
ClickHouse 23.6 发布详解v23.6.1.1524-stable 新特性、性能优化与关键修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇技术指南以 ClickHouse 官方版本发布说明为骨架系统梳理 v23.6.1.1524-stable 相对于 v23.5.1.3174-stable 的全部变更包括向后不兼容变更、7 项新特性、9 项性能优化、34 项功能改进、构建测试打包改进与 37 项用户可见 Bug 修复并结合当前仓库源码src/、programs/、tests/给出底层实现与配置依据。读完本文你将掌握 23.6 版本中session_timezone、Overlay/Filesystem/S3/HDFS 数据库引擎、Redis 表函数/表引擎、空文件跳过开关、Keeper feature flags 等新能力的语法、配置方式与适用场景并了解升级到该版本前需要评估的兼容性要点。版本总览ClickHouse releasev23.6.1.1524-stable提交d1c7e13d088是 2023 年 6 月的稳定版本基线对比上一稳定版v23.5.1.3174-stable提交2fec796e73e。完整变更记录归档于 docs/changelogs/archive/v23.6.1.1524-stable.md仓库根目录的 CHANGELOG.md 也随版本迭代同步更新。本版本延续了 ClickHouse 每月一个稳定版的节奏重点覆盖外部数据源集成Redis、MongoDB、HDFS/S3/文件系统、时区与会话语义session_timezone、查询性能排序、并行、ZooKeeper 访问、Keeper 协调服务 API 演进以及大量稳定性修复。向后不兼容变更升级前必须评估v23.6 包含两项明确的向后不兼容变更升级生产环境前需要确认没有依赖下列行为1. 删除 fs cache 的do_not_evict_index_and_mark_files特性该特性曾在 23.5 中引入见 #51222允许文件系统缓存不驱逐索引index和标记mark文件但官方评估认为这个特性只会让事情变得更糟This feature was only making things worse因此在 23.6 中被彻底删除PR #51253。配套地23.6 还修复了 fs cache 中current_elements_num计算偶尔不正确的问题PR #51242并在驱逐文件时立即将其从打开的文件缓存中移除PR #51596。如果你在 23.5 配置了该参数升级到 23.6 后它将被忽略缓存淘汰策略回归统一行为。2. 移除实验性 LIVE VIEW 的 ALTER 支持LIVE VIEW 仍处于实验阶段23.6 移除了对它的ALTER语句支持PR #51287。依赖ALTER LIVE VIEW的实验性使用场景需要改造建议关注官方对 LIVE VIEW 后续的正式化路线。新特性详解1. 会话时区设置session_timezone新增会话级设置session_timezone在未显式指定时区时作为当前会话的默认时区。其在 src/Core/Settings.cpp 中的定义为DECLARE(Timezone, session_timezone, , ...)即默认值为空字符串表示隐式时区等于服务器级配置的时区对应服务器设置timezone。该设置被标记为 BETA 等级。核心语义session_timezone作用于没有显式时区的DateTime/DateTime64值并优先于服务器级全局隐式时区。可通过timeZone()与serverTimeZone()两个函数分别获取会话时区和服务器时区。使用示例-- 未设置时两者一致 SELECT timeZone(), serverTimeZone() FORMAT CSV -- Europe/Berlin,Europe/Berlin -- 设置会话时区后timeZone() 变化serverTimeZone() 不变 SELECT timeZone(), serverTimeZone() SETTINGS session_timezone Asia/Novosibirsk FORMAT CSV -- Asia/Novosibirsk,Europe/Berlin -- 会话时区作用于无显式时区的 DateTime64 转换 SELECT toDateTime64(toDateTime64(1999-12-12 23:23:23.123, 3), 3, Europe/Zurich) SETTINGS session_timezone America/Denver FORMAT TSV -- 1999-12-13 07:23:23.123使用注意事项官方警告并非所有解析DateTime/DateTime64的函数都遵守session_timezone可能引发隐蔽错误。例如CREATE TABLE test_tz (d DateTime(UTC)) ENGINE Memory AS SELECT toDateTime(2000-01-01 00:00:00, UTC); -- 第一条toDateTime() 无显式时区遵守 session_timezone SELECT *, timeZone() FROM test_tz WHERE d toDateTime(2000-01-01 00:00:00) SETTINGS session_timezone Asia/Novosibirsk; -- 0 rows in set -- 第二条DateTime 从 String 解析继承列 d 的类型与时区不遵守 session_timezone SELECT *, timeZone() FROM test_tz WHERE d 2000-01-01 00:00:00 SETTINGS session_timezone Asia/Novosibirsk; -- ┌───────────────────d─┬─timeZone()───────┐ -- │ 2000-01-01 00:00:00 │ Asia/Novosibirsk │ -- └─────────────────────┴──────────────────┘差异根源在于两条 SQL 走的是不同的解析管线toDateTime()显式函数调用会尊重会话时区与全局时区而字面量字符串与已有列比较时会继承列的时区类型。生产使用中建议对列定义显式指定时区避免依赖隐式时区语义。2. 四种新数据库引擎Overlay、Filesystem、S3、HDFS本版本一次性新增 4 种数据库引擎PR #48821将目录/外部存储当数据库用的能力正式引入引擎作用底层实现DatabaseOverlay组合多个数据库如 Filesystem 与 Memory按顺序代理请求直到执行成功实现IDatabase接口内部持有数据库指针向量见 src/Databases/DatabaseOverlay.hDatabaseFilesystem以只读方式交互文件系统上的文件通过TableFunctionFile隐式加载文件结果缓存加速访问DatabaseS3以只读方式交互 S3 存储通过TableFunctionS3隐式加载表DatabaseHDFS与 HDFS 存储交互通过TableFunctionHDFS隐式加载表从源码结构看这些引擎均位于 src/Databases 目录DatabaseOverlay.h/.cpp、DatabaseFilesystem.h/.cpp、DatabaseS3.h/.cpp、DatabaseHDFS.h/.cpp并在 registerDatabases.cpp 中注册。DatabaseOverlay.h 的注释明确其设计目标实现 IDatabase 接口并组合多个其他数据库按顺序查找表直到命中将操作委托给合适的数据库用于在 clickhouse-local 中组合 DatabaseFilesystem 与 DatabaseMemory。仓库还提供了单元测试 gtest_database_overlay.cpp 佐证其行为。3. MySQL 兼容端口下的use_mysql_types_in_show_columns新增设置use_mysql_types_in_show_columnsPR #49577当客户端通过 MySQL 兼容端口连接时SHOW COLUMNS语句将展示 MySQL 等价类型。这对于从 MySQL 迁移而来、依赖类型名兼容性的工具链ORM、可视化工具等非常实用。4. 文件表函数/引擎的空文件跳过开关新增 4 个设置PR #50364允许在读取时跳过空文件设置默认值作用对象s3_skip_empty_filestrue启用s3表函数与 S3 存储hdfs_skip_empty_files—hdfs表函数engine_file_skip_empty_filesfalse禁用file表引擎/表函数engine_url_skip_empty_files—url表函数/表引擎这些设置在 src/Core/Settings.cpps3_skip_empty_files默认true与 src/Core/Settings.cppengine_file_skip_empty_files默认false中声明并在 src/Storages/StorageFile.cpp 等处实际生效——文件大小为 0 时循环跳过。注意默认值差异S3 端默认开启官方认为提供更好的用户体验本地文件引擎默认关闭。配置示例本地文件引擎跳过空文件SELECT * FROM file(data/*.csv, CSV, id UInt32, name String) SETTINGS engine_file_skip_empty_files 1;5. Redis 表函数、Redis 表引擎与过滤下推本版本正式引入TableFunctionRedis、Redis 表引擎与RedisCommon公共模块PR #50150并支持equals与in条件过滤下推到 Redis 端执行多键查询。表函数语法定义于 src/TableFunctions/TableFunctionRedis.cppredis(host:port, key, structure[, db_index[, password[, pool_size]]])参数说明参数说明host:portRedis 服务地址可省略端口默认 6379key列清单中的任一列作为 Redis keystructure返回表的 schemadb_indexRedis 逻辑库索引范围 0–15默认 0password密码默认空字符串pool_size连接池上限默认 16primary必须指定仅支持单列主键主键以二进制序列化为 Redis key行为要点非主键列按顺序以二进制序列化为 Redis value带主键equals/in过滤的查询会被优化为对 Redis 的多 key 查找而无过滤条件的查询会触发全表扫描重操作。表函数暂不支持命名集合Named collections。读取示例SELECT * FROM redis(redis1:6379, key, key String, v1 String, v2 UInt32);写入示例INSERT INTO TABLE FUNCTION redis(redis1:6379, key, key String, v1 String, v2 UInt32) VALUES (1, 1, 1);Redis 表引擎实现位于 src/Storages/StorageRedis.cpp 与 src/Storages/RedisCommon.cpp字典源支持见 src/Dictionaries/RedisSource.h 与 src/Dictionaries/RedisDictionarySource.h可在CREATE TABLE ... ENGINE Redis(...)或字典dictionary场景复用同一套 Redis 访问能力。6. clickhouse-client 支持连接串调用clickhouse-client现在可以直接传入一个连接串connection string替代逐一指定--host、--port、--user等参数PR #50689。同时--password参数被限制只能指定一次PR #50966避免参数重复导致的歧义。7. DEFLATE_QPL 编解码器脱离实验状态DEFLATE_QPL编解码器基于 Intel QuickAssist 的 QPL 压缩不再受allow_experimental_codecs控制改为由服务器设置enable_deflate_qpl_codec单独开关默认falsePR #50775。使用该编解码器前需要在服务器配置中显式启用enable_deflate_qpl_codec1/enable_deflate_qpl_codec8. clickhouse-local / 文件后处理重命名为clickhouse-local增加--rename_files_after_processing pattern选项PR #49626处理完文件后可按模式重命名便于流水线中标记已消费的文件解决长期存在的需求issue #34207。性能优化23.6 的提速点本版本包含 9 项性能优化覆盖查询执行、存储格式、分布式协调三个层面优化点说明关联 PRQueryProfiler 线程局部timer_id用线程局部timer_id替代全局对象提升开启 QueryProfiler 时的性能#48778CapnProto 格式重写重写输入/输出格式列名与 CapnProto 字段大小写不敏感匹配修复嵌套结构字段读写#49752Parquet 并行写优化多线程下的 Parquet 写入性能#50102禁用parallelize_output_from_storages处理 MATERIALIZED VIEW 及单 block 存储时禁用该并行选项#50214已排序数据免置换数据块已有序时避免 sort 阶段的 block permutation#50697toYear/toYYYYMM 谓词变换回滚曾将toYear/toYYYYMM谓词改写为免转换等价形式以加速 SSB 类负载但引入查询结果不完整问题23.6 中回滚PR #50629并提交修复#50951system.zookeeper并行 list对 ZooKeeper 的多次 list 请求并行化加速读取system.zookeeper表#51042时区查找表初始化加速加速 DateTime 时区查找表的初始化降低 clickhouse-client 启动/连接耗时尤其 debug 构建#51347其中值得留意的是toYear/toYYYYMM 谓词优化被回滚上游曾提出将toYear()/toYYYYMM()谓词改写为等价但无转换器的形式以提升 SSB 等负载性能PR #50062、#50307但 issue #50628 指出该优化可能导致查询结果不完整最终由 #50629 回滚。这体现了 ClickHouse 对正确性优先于性能的坚持。功能改进34 项细节增强数据格式与类型IPv6 转 IPv4允许将 CIDR::ffff:0:0/96IPv4-mapped地址的 IPv6 强转为 IPv4PR #49759。CSV 支持空白/制表符分隔CSV 输入格式可解析以空格或\t作为字段分隔符的文件Spark 已支持PR #50712。CSV/TSV/CustomSeparated 尾随空行跳过新增input_format_csv_skip_trailing_empty_lines、input_format_tsv_skip_trailing_empty_lines、input_format_custom_skip_trailing_empty_lines三个设置默认关闭PR #50635。schema inference 增强新增input_format_max_bytes_to_read_for_schema_inference限制 schema 推断读取的字节数PR #50592schema 推断尊重input_format_as_default设置PR #50602。函数数值参数解析toDateOrDefault()/toDateOrNull()与accurateCast[OrDefault|OrNull]()现在能正确解析数值参数PR #50709。syslog 时间戳parseDateTimeBestEffort*()与parseDateTime64BestEffort*()支持 syslog 格式中的日期时间参数PR #50925。transform与值匹配型CASE全类型支持transform函数与等值匹配的CASE开始支持所有数据类型PR #51351并清理了transform中的历史遗留问题PR #51350、#50833。复制与合并调度ReplicatedMergeTree改进了ReplicatedMergeTree中 merge 选择与清理任务的调度无 merge/清理可做时不会执行得过于频繁新增设置max_merge_selecting_sleep_ms、merge_selecting_sleep_slowdown_factor、max_cleanup_delay_period与cleanup_thread_preferred_points_per_iterationPR #50107解决 issue #31919。此外ALTER PARTITION与 mutation 在单分片Replicated数据库且底层为ReplicatedMergeTree时不再复制执行PR #51049。zero-copy replication 场景下merge/mutation 执行前加入随机 sleep使负载更均匀分布到各副本PR #51282。mutation 保护阈值默认开启number_of_mutations_to_delay 500、number_of_mutations_to_throw 1000PR #50726。查询执行与优化器Parallel replicas 支持 Analyzer并行副本执行与新查询分析器Analyzer兼容PR #50441。跨 JOIN 过滤下推过滤器可下推穿过 cross joinPR #50605。INTO OUTFILE文件存在提示当目标文件已存在时错误提示建议使用APPEND或TRUNCATEPR #50950。compile_expressions默认关闭由于发现 LLVM 相关 bugcompile_expressions设置默认禁用PR #51368。监控、系统表与 KeeperCGroups CPU 指标整合CPU 相关 CGroups 指标合并为单一CGroupMaxCPU设置 CGroups 限制时NormalizedCPU 使用率指标按 CGroups 限制归一化而非总 CPU 数PR #50835。system.zookeeper_connection增强connected_time改为标准格式的连接建立时间新增session_uptime_elapsed_seconds表示会话持续时长PR #51026。checksum 顺序修正system.parts、system.projection_parts及错误消息中按正确顺序展示校验和的两半PR #51040。备份一致性on-cluster 备份用system.parts的hash_of_all_files校验 part 身份PR #50997。too many parts 阈值放宽放宽阈值以适应当代硬件并为长插入查询提供背压backpressurePR #50856。LZ4 真实版本切换到实际使用的 lz4 版本PR #50621。keeper-client 内嵌独立 keeper 二进制内嵌 keeper-clientPR #50964。Keeper feature flagsKeeper API 引入 feature flags 机制PR #50796每个特性标志可在keeper_server.feature_flags配置下启用或禁用。例如启用CheckNotExists请求在 Keeper 配置中设置keeper_server.feature_flags.check_not_exists 1。从 src/Coordination/KeeperContext.cpp 的实现看配置键为keeper_server.feature_flags按子键遍历并通过getBool解析开关再调用enableFeatureFlag/disableFeatureFlag且部分标志存在依赖联动如启用MULTI_READ会同时启用FILTERED_LIST。feature flags 状态通过system_nodes_with_data[keeper_api_feature_flags_path]暴露对应路径/keeper/feature_flags见 src/Coordination/KeeperConstants.h并支持四字母命令ftfl查询src/Coordination/FourLetterCommand.cpp。这为 Keeper 的滚动升级与能力协商提供了机制保障。数据湖与外部存储数据湖 HEAD 请求优化修复 Iceberg/Deltalake/Hudi 文件多时因同步 head 请求导致的缓慢PR #50976。MongoDB 协议升级支持 MongoDB 5.1 及更新版本同时保留对旧协议3.6的兼容PR #50061。进度条改进file/s3/hdfs/url 表函数使用源数据 chunk size 与每线程增量总大小统计改进进度条并修复*Cluster函数的进度条PR #51088TCP 协议 Progress 包新增total_bytes_to_read字段PR #51158。fs cache 数据 part 校验对带文件系统缓存的磁盘上的数据 part 做更严格的校验PR #51164。Dashboard 缺失值展示dashboard 正确展示缺失值PR #50832。构建、测试与打包改进更新contrib/re2至 2023-06-02PR #50949。服务器在致命错误时打印变更的设置列表便于定位问题PR #51138。默认调低 HTTP 头部字段限制http-max-field-value-size与http_max_field_name_size默认降至 128KPR #51163。Docker 容器 Ubuntu 版本升级PR #51180Dockerfile 拆分大型RUN、按需安装工具、一次性升级 OS、并回退基础镜像至ubuntu:20.04以兼容旧版 DockerPR #51504 及后续清理 #51564。支持使用clang-17构建 ClickHousePR #51300并同步做了 clang-17 兼容性修复PR #51114。SQLancer 检查转正其触发的 bug 已修复SQLancer 检查失败将直接标记为失败的 CI 状态PR #51340。CI 持续改进PR #51494包括提升通用 runner 存活率#49283、修复 fasttest 状态缺失问题等。Bug 修复37 项用户可见问题修复以下为 23.6 修复的、在官方稳定版中用户可见的不当行为按模块归类复制、merge 与存储引擎executable 字典加载状态上报#48775skip index 与 projection 的 mutation 正确性#50104moving parts 清理#50489Log 家族表 truncate 后返回错误行数#50585uniqExact并行合并 bug#50590grace hash join 变更回滚#50699SummingMergeTree 支持 DateTime64#50797read-in-order 启用时不应用 projection#50923sort_description在CreatingSets中的错误传播#50955fs cache 的 use_count 修正#51406与驱逐时移除打开文件#51596。分布式与 JOIN不读取 GLOBAL JOIN 右侧表全部列#50721过滤器下推 cross join 的配套修复Projection 与 read-in-order 冲突修复#50923。备份与恢复写备份时过度频繁检查锁文件#50889BackupCoordinationStageSync::setError()崩溃#51012同一文件被多次写入备份#51299。数据湖与外部存储Iceberg V2 可选 metadata 解析#50974azure blob storage 迭代器竞态#50936s3/s3Cluster 函数崩溃#51209其后有回滚 #51239StorageURL 切换 URL 时的 use-after-free#51260。查询与执行Query Cache 中 ColumnConst 到ColumnVectorchar8_t的错误强转#50704带子查询 SELECT 的 Query Cache 失效问题#51132Set 索引常量可空比较#51205tupleElement()默认值的逻辑断言#51534ActionsDAG fuzzer 失败#51301MathUnary 段错误#51499lowerUTF8/upperUTF8 的 MSan 报告#51371compile_expressions的 core dump#51231。Keeper不存储包含未知操作的日志#50751LDAP server 参数缓存 hash 类型错误#50865Keeper API 版本获取失败时丢弃会话#51238。兼容性与类型IP 类型聚合函数哈希的向后兼容#50551非 const 时区的兼容设置#50834Parquet 大整数从 String 解析回退#50873ColumnLowCardinality 字典的写时复制修复#51064安全 IV 生成#51086参数化视图检查更新#51272。升级建议与小结v23.6.1.1524-stable 是一个集成 加固型版本向外新增了 Redis、MongoDB、S3/HDFS/文件系统等数据源的一体化接入能力向内则对排序、并行执行、ZooKeeper 访问、merge 调度、Keeper feature flags 等核心路径做了系统性优化与修复。升级前请重点核对两项兼容性变更fs cachedo_not_evict_index_and_mark_files删除、LIVE VIEW ALTER 移除并按需评估compile_expressions默认关闭对 JIT 场景的影响。如需进一步研究本版本各特性的底层实现可深入以下路径设置定义与文档见 src/Core/Settings.cpp设置变更历史见 src/Core/SettingsChangesHistory.cpp数据库引擎实现见 src/DatabasesRedis 集成见 src/Storages/StorageRedis.cpp 与 src/TableFunctions/TableFunctionRedis.cppKeeper feature flags 见 src/Coordination/KeeperContext.cpp。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价