ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ClickHouse v22.7.1.2484-stable 版本发布深度解析:默认行为变更、新表引擎与性能优化全景

ClickHouse v22.7.1.2484-stable 版本发布深度解析:默认行为变更、新表引擎与性能优化全景 ClickHouse v22.7.1.2484-stable 版本发布深度解析默认行为变更、新表引擎与性能优化全景【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇基于 ClickHouse 官方变更记录 v22.7.1.2484-stable.md 编写系统梳理该版本相对 v22.6.1.1985-stable 的全部变更4 项向后不兼容变更、NATS/MongoDB 等新表引擎、local_filesystem_read_method的 io_uring 选项、自解压可执行文件等关键特性并结合当前仓库源码如 src/Core/Settings.cpp核实各配置项的默认值与现状帮助升级前的读者准确评估兼容性风险与升级收益。一、版本定位该版本发布说明的头部明确标注了基线ClickHouse release v22.7.1.2484-stable (f4f05ec786a) FIXME as compared to v22.6.1.1985-stable (7000c4e0033)即 v22.7.1.2484-stable 是 v22.6.1.1985-stable 的后续稳定版变更内容横跨“向后不兼容变更Backward Incompatible Change”“新功能New Feature”“性能改进Performance Improvement”“改进Improvement”“缺陷修复Bug Fix”“构建/测试/打包改进”六大类别。对生产环境而言第一小节是升级前必须评估的兼容性风险清单其余小节则是收益清单。二、向后不兼容变更升级必读v22.7 引入的 4 项默认行为变更是本版本最重要的兼容性风险点1.enable_positional_arguments默认开启允许SELECT ... ORDER BY 1, 2这类“按 SELECT 列序号引用”的写法位置参数指向 select 子句中的列。若依赖旧的序号语义例如按 where 表达式序号排序需要通过SET enable_positional_arguments 0恢复旧行为。在当前仓库中该设置仍然保持默认开启定义于 src/Core/Settings.cpp 中DECLARE(Bool, enable_positional_arguments, true, R( ... ))同时还有一个关联设置enable_positional_arguments_for_projections默认false用于控制 PROJECTION 定义中的位置参数。2.Ordinary数据库引擎与旧版*MergeTree建表语法被弃用这是影响面最大的一项变更默认禁止新建Ordinary引擎数据库和使用旧式CREATE TABLE ... ENGINE MergeTree(...)存储定义语法若system数据库使用了Ordinary引擎服务器启动时会自动转换为Atomic可通过allow_deprecated_database_ordinary和allow_deprecated_syntax_for_merge_tree两个设置临时保留旧行为但官方明确提示“这些设置可能在后续版本中移除”。在当前仓库中可以确认这一治理方向仍在延续allow_deprecated_database_ordinary仍出现在 src/Core/Settings.cpp、src/Databases/DatabaseOrdinary.cpp 以及元数据加载逻辑 src/Interpreters/loadMetadata.cpp 中说明Ordinary→Atomic的自动迁移与拦截逻辑是贯穿多个模块的。对升级者而言正确做法是尽快把Ordinary数据库迁移到Atomic或Replicated而不是依赖弃用开关长期兜底。3. 逗号 JOIN 默认改写为 INNER JOIN逗号连接FROM a, b的语义在 v22.7 中默认按 INNER JOIN 改写cross_to_inner_join_rewrite 2恢复旧行为需设置cross_to_inner_join_rewrite 1。值得注意的是发布说明“NOT FOR CHANGELOG”部分记录了该默认值在本版本周期内经历过反复后续 PR 曾将默认值重置回 1而当前仓库源码中的定义仍为DECLARE(UInt64, cross_to_inner_join_rewrite, 1, R( ... ))这提醒升级者该设置的默认值在不同小版本间有过调整升级跨版本时应逐一核对当前版本的实际默认值而不是只记住 v22.7 的发布说明。4.format_csv_allow_single_quotes默认关闭CSV 输出格式不再默认允许单引号需要显式开启该设置以恢复旧行为。三、新功能详解3.1 新表引擎与外部系统集成特性说明NATS 表引擎新增StorageNats支持对 NATS 消息系统的 pub/sub 发布与订阅关闭 issue #32388。后续配套 PR 还为其构建引入了 libuv 依赖MongoDB 表函数新增 MongoDB 表函数并支持向 MongoDB 存储/表函数写入数据此前只读Hive 存储增强StorageHive支持 struct 类型列支持对 Hive 表执行ALTER命令修复多线程共享IHiveFile导致的崩溃并改进了 Hive 集成测试稳定性HDFS 安全 RPC支持 Hadoop 安全 RPC 传输hadoop.rpc.protectionprivacy与integrity两种保护级别PostgreSQL 引擎支持auto_close连接选项修复从引擎初始化失败导致的段错误3.2 SQL 语法与查询能力扩展CREATE TABLE ... EMPTY AS SELECT自动从 SELECT 查询推断表结构但创建后不填充数据。适合“先建空表、再异步导入”的场景。列清单允许尾随逗号CREATE TABLE t (a Int32, b String,)这样的写法合法化。标准 SQL 索引语法支持标准CREATE INDEX/DROP INDEX语法此前 ClickHouse 索引是二级索引概念标准语法降低了与 PostgreSQL/MySQL 用户的迁移摩擦。additional_table_filters/additional_result_filter为表和查询结果追加“读取后直接生效”的过滤条件。官方示例SELECT number, x, y FROM (SELECT number FROM system.numbers LIMIT 5) f ANY LEFT JOIN (SELECT x, y FROM table_1) s ON f.number s.x SETTINGS additional_table_filters {system.numbers : number ! 3, table_1 : x ! 2};在当前仓库中src/Core/Settings.cpp 对这两个设置的文档进一步强调了安全边界additional_table_filters是访问控制/行级安全策略的补充手段filter类参数本身不作为访问控制机制。后续 PR 还修复了“使用表别名时过滤条件不生效”的问题。implicit_transaction将独立查询自动包裹进显式事务——查询成功则 COMMIT失败则 ROLLBACK无需手写BEGIN/COMMIT。当前源码中该设置仍标记为 EXPERIMENTAL定义于 src/Core/Settings.cppDECLARE(Bool, implicit_transaction, false, R( If enabled and not already inside a transaction, wraps the query inside a full transaction (begin commit or rollback) ), EXPERIMENTAL)group_by_use_nulls使 ROLLUP / CUBE / GROUPING SETS 场景下的聚合键列变为 Nullable便于区分“真实 NULL”与“上卷产生的 NULL”。3.3 新函数一览v22.7 在函数层的新增与增强translate(string, from_string, to_string)与translateUTF8(...)按字符映射替换字符串与 PostgreSQL 的translate对齐isNullable判断表达式参数是否可空返回 1/0parseTimeDelta解析时间间隔字符串支持 , ;, -, , ,, :作为分隔符例如parseTimeDelta(1yr-2mo-4w 12 days, 3 hours : 1 minute ; 33 seconds)后续 PR 补充了毫秒/微秒/纳秒单位支持tupleElement第三参数当元组无对应成员时返回默认值要求第二参数为 String 类型revision()返回 ClickHouse 构建的 revision 标识Base58 编解码函数常见于区块链地址编码场景L2 平方距离与 L2 范数函数扩展到 array 与 tuple向量检索相关字符串多匹配函数multiMatchAny()、multiMatchAnyIndex()、multiMatchAllIndices()及其模糊变体开始接受非常量pattern 数组参数multiStringAllPositions()同理修复嵌套短路函数导致“条件为假时参数仍被执行”的语义错误保证and/or短路求值正确。3.4 JOIN 算法增强RocksDB JOIN 引擎新增direct算法配合direct字典的按需加载模式新增**全排序归并 JOINfull sorting merge join**算法为大数据量、内存受限场景提供补充选项parallel_hashJOIN 的缺陷修复与性能改进新增multiple_joins_try_to_keep_original_names设置避免多 JOIN 改写时列标识符被改写导致下游 SQL 列名对不上修复 partial merge join 中的临时命名冲突。3.5 运维与可观测性自解压可执行文件新增构建目标self-extracting把 ClickHouse 压缩打包为自解压单文件分发。仓库中保留了完整的配套实现programs/self-extracting/打包工具源码与 utils/self-extracting-executable/含--decompressor参数的压缩脚本。官方下载的可执行文件自此默认采用自解压压缩形态zstd_window_log_max配置通过file()等表函数导入外部文件时 zstd 解码的窗口内存上限防止大窗口压缩包打爆内存当前源码 src/Core/Settings.cpp 中默认值仍为 0即不额外限制send_logs_source_regexp把匹配指定正则的服务器日志源随查询发送到客户端配合clickhouse-client --send_logs_level做服务端日志排障OpenTelemetry 行为变化默认不再采集 Processor 粒度的 span需要显式开启opentelemetry_trace_processors该设置在当前源码中默认值仍为false位于 src/Core/Settings.cpp——对依赖 processor 级追踪做性能分析的团队是重要的观测盲区提醒DESCRIBE CACHE/SHOW CACHES查看文件缓存配置与缓存列表DROP FS CACHE增加权限检查并支持ON CLUSTERKeeper内置协调服务支持实时 digest 计算与校验把 keeper 服务器元信息持久化到磁盘通过 ProfileEvents 与 CurrentMetrics 暴露基础监控数据注意实时 digest 后续被默认关闭system.part_log增加merge_algorithm列Undecided/Horizontal/Vertical便于分析合并策略选择system.query_log中INSERT查询的result_bytes修复为真实写入字节数此前错误地复用了result_rows的值EXPLAIN AST新增optimize/rewrite选项可查看 AST 改写后的形态默认关闭对排查优化器行为非常有用clickhouse-client / clickhouse-local 支持 psql 风格的\i file命令执行本地 SQL 文件新增max_remote_read_network_bandwidth_for_server/max_remote_write_network_bandwidth_for_server用于限制服务器级别对远端存储的 IO 带宽从当前源码结构看这两个参数后来被标注为“通过服务器配置设置”说明其归属从查询级设置向服务级配置演进hadoop.rpc、Kerberos新增kerberosInit函数替代外部kinit可执行文件Kafka 与 HDFS 代码路径中所有kinit调用被替换并配套了新的集成测试。四、性能改进v22.7 的性能改进覆盖面很广逐条列出local_filesystem_read_method新增io_uring选项基于 Linux io_uring 异步 IO 子系统实现发布说明称其读性能相对默认pread方法“几乎普适性地提升”。需要说明两点边界其一本版本周期内 io_uring 曾被 revert 后再合入见“NOT FOR CHANGELOG”部分其二当前仓库源码对该选项的官方注释是“experimental在存在并发读写时不适用于 Log/TinyLog/File/Join 等追加型文件”并直言“没有理由在日常场景启用 io_uring”——即后续版本已对 io_uring 的预期做了显著降温当前版本中它只适合大量小 IO 请求的特定场景不应盲目开启pread_threadpool默认开启“Performance optimization and Bug Fix”条目读取请求交给线程池处理提升读性能已排序列的 DISTINCT 优化当输入流恰好按 DISTINCT 目标列有序时走专用的去重变换可作用于 pre-distinct 或 final distinct或两者避免无谓的哈希去重批量版BinaryHeapORDER BY、MergeTree merge、窗口函数共用批量化的二叉堆实现修复重大 JOIN 性能回退官方自述 SSB 等常见 JOIN 查询“慢了近 3 个月却无人投诉”本版本修复了三个月前引入的回归——这是典型的基准测试缺位的教训HyperScan → vectorscan 迁移字符串多匹配底层库从 Intel hyperscan 换成自研 vectorscan非 x86 平台受益显著仓库 contrib 目录中同时存在 contrib/hyperscan 相关构建配置可印证该双库并存期聚合后执行计划并行度提升aggregation 之后的 pipeline 步骤可并行执行的范围扩大JSON 列插入加速、HashTable 插入与查找优化、列向量 replicate 的 SIMD 化官方单测基准 2 倍提升、数组 Norm/Distance 函数提速 1.2~2 倍LZ4 解压VBMI 优化的copyOverlap32Shuffle排序 JOIN 右表过滤下推pushdown filter to the right side of sorting joinsystem.stack_trace访问优化按名称预过滤后再发信号采样降低开销Executable UDF/字典/存储消除子进程终止时 1 秒的等待ORDER BY (a, b)与ORDER BY a, b生成的执行计划不一致导致前者更慢的问题被修复。五、改进Improvement窗口函数优化ORDER BY在窗口函数中的处理支持窗口函数出现在表达式中关闭长期 issueIn-order 聚合optimize_aggregation_in_order扩展到全物化投影projectionINSERT 的 ProfileEvents此前只有 SELECT 上报 profile eventsINSERT 也纳入补齐了写入侧可观测性S3 对象删除修复单对象改用RemoveObjectRequest删除自动检测服务端是否支持DeleteObjects批量 API——修复了 GCP/GCS 上removeFileIfExists失效、约一半 remove 功能不可用的问题此后 GCS 无需再显式配置support_batch_delete0store/目录后台清理表创建失败等场景残留的垃圾子目录会被后台自动清理system.asynchronous_metric_log进一步压缩存储SIGTERM 处理改善 k8s 场景下收到 SIGTERM 信号的优雅退出行为文件缓存健壮性磁盘写满时继续运行而不中断查询缓存初始化失败时抛出更友好的错误文件系统函数filesystemAvailable()等函数在clickhouse-local中可用客户端 CPU 占用指标展示改进trace-visualizer 体验改进硬件基准测试支持自动上传结果clickhouse-extract-from-config工具的 key 支持通配*与花括号展开{expr1,expr2}新增“SELECT 从 system 库查询需要显式授权”的选项用于安全合规场景。六、关键缺陷修复Bug Fix 部分条目较多以下按风险等级摘选对生产影响最大的若干项正确性修复toHour()单调性问题——单调性破坏会导致索引分析错误从而产生错误查询结果属高危修复修复DISTINCTLIMIT的分布式查询错误结果修复 trivial count 优化在array join/empty_result_for_aggregation_by_empty_set组合下产生错误结果的问题修复 PREWHERE 按序读优化下Not found column Type in block报错修复 Nullable 分区上的分区裁剪错误修复Decimal128/Decimal256超过 19 位尺度的舍入错误修复含重复列的 UNION 子查询列顺序错误Map 组合器的 use-after-free可导致错误结果、mapUpdate/mapFilter常量 map 参数崩溃、嵌套短路函数求值语义错误LOWCARDINALITY类型在tuple()中丢失的问题修复修复带物化视图 extremes1时 INSERT 触发Block structure mismatch的长期问题。稳定性/崩溃修复GRANT ALL ON *.*带ON CLUSTER的崩溃修复 Distributed 异步插入在从配置移除副本时可能的崩溃修复PartialSortingTransform优化引入的 SIGSEGV 与错误结果注意该修复在发布周期内被 revert 又重放属于典型的高风险优化回滚-重入修复异常路径下NOEXCEPT_SCOPE调用std::terminate丢失异常的问题MaterializedPostgreSQL 引擎在复制初始化异常时的段错误MergeTree 后台执行器与 DROP/DETACH 竞争导致的 UB/SIGSEGV。存储层S3 seekable 读取的异常抛出修复、S3 并行写支持检测修复、S3 seekable 读 并行读缓冲的内存占用修复修复 S3 上稀疏列读取修复非正常关服务器后 part 永久无法删除、以及 SELECT 中未使用 MergeTree part 引用计数错误延迟 part 删除的问题。七、构建、测试与打包应用 Clang 线程安全分析TSA注解覆盖字典等模块system.licenses表在 macOS 上正确填充aarch64/arm64 包改为架构相关包并发布到 artifactory 与 release assetsclickhouse-diagnostics诊断工具正式打包分发仓库中对应实现见 utils/clickhouse-diagnostics/用于生成服务器诊断信息clickhouse-test 在测试队列打满时收集调试信息并始终打印 stacktrace修复getauxval()的 LSan 误报统一安装脚本适配 FreeBSD构建侧curl 升级至 7.83.1、thrift 升级至 0.16.0、LLVM 支持区间调整到 12/14。八、升级建议与适用前提先审四项不兼容变更升级前用system.settings核对enable_positional_arguments、allow_deprecated_database_ordinary、allow_deprecated_syntax_for_merge_tree、cross_to_inner_join_rewrite、format_csv_allow_single_quotes的实际取值把Ordinary库迁到Atomic是最应该趁升级窗口做的事。核对默认值漂移本版本的多个默认值尤其是cross_to_inner_join_rewrite与local_filesystem_read_method相关选项在后续小版本中又有调整以目标升级版本的 src/Core/Settings.cpp 和设置变更历史 src/Core/SettingsChangesHistory.cpp 为准。观测体系适配如果你依赖 OpenTelemetry 的 processor 级 span升级后需显式打开opentelemetry_trace_processors否则 trace 粒度会变粗。收益评估JOIN 回归修复、排序 DISTINCT、批量 BinaryHeap、vectorscan、pread_threadpool默认开启等改进对 OLAP 大查询与高并发读场景普遍受益io_uring 选项建议仅在特定小 IO 密集场景做灰度验证。本文所有发布说明事实均出自 docs/changelogs/archive/v22.7.1.2484-stable.md涉及“当前仓库现状”的表述以当前源码定义为准属于版本演进后的观察不代表 v22.7 发布时的状态。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表