本文介绍云数据库ClickHouse25.12企业版的主要变更内容,包括新特性、非兼容变更、改进、性能优化和Bug修复。
重要变更
Paimon函数支持分区裁剪。
parallel replica查询支持自动模式。
查询性能提升(执行器优化、JOIN优化、存储优化)。
非兼容变更
数据类型变更
引入新的
Geometry类型,支持WKB/WKT格式;原先该类型是String的别名。废弃的
Object类型已移除。Variant类型的子列文件名在Wide data parts中现在会进行转义;可通过
escape_variant_subcolumn_filenames设置控制。
查询和函数变更
ALTER MODIFY COLUMN将nullable列转换为non-nullable时,现在需要显式指定DEFAULT值。移除了
allow_not_comparable_types_in_order_by和allow_not_comparable_types_in_comparison_functions设置。bitShiftLeft和bitShiftRight函数在位移量等于类型大小时返回0或空值。Ngram tokenizer不再返回长度小于指定N的ngram。
存储和索引变更
LIVE VIEW功能已移除;已存在LIVE VIEW的实例无法升级。禁止在共享object storage路径上挂载多个
plain-rewritable磁盘。特殊MergeTree表要求
ORDER BY不能为空;可通过allow_suspicious_primary_key设置启用例外。Implicit索引从schema中排除;跨版本的ReplicatedMergeTree metadata可能显示错误。
设置和配置变更
http_write_exception_in_output_format默认改为禁用。Kafka storage的SASL配置优先级修复;表级设置现在会覆盖配置文件中的设置。
ACME配置参数重命名:
refresh_certificates_task_interval→refresh_certificates_task_interval_seconds。Projection中的位置参数默认禁用;可通过
enable_positional_arguments_for_projections启用以安全升级。
客户端变更
clickhouse-client在查询因receive_timeout超时时返回退出码159(TIMEOUT_EXCEEDED)。
统计信息格式变更
String到Nullable(String)的转换会影响
uniq聚合函数的统计信息;需重新执行ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL。
其他不兼容变更
修复了T64 codec压缩非对齐数据时的fatal error。
新特性
函数
EXECUTE AS语句支持用户模拟(user impersonation)。flipCoordinates函数展开数组维度并交换Tuple列中的指针。IS NOT DISTINCT FROM(<=>)操作符增加了逆向支持和数值类型兼容性。新增
cume_distwindow函数。实现了Geometry面积和周长计算函数。
dictGetKeys函数根据指定属性值返回字典的key。arrayRemove(arr, elem)从数组中移除所有匹配元素。midpoint函数计算平均值。argAndMin和argAndMax函数获取最小/最大值时对应的参数。新增
HMAC(algorithm, message, key)SQL函数。has()函数支持对常量数组使用primary key和data skipping index。
系统表
system.unicode表列出Unicode字符及其属性。system.shared_merge_tree_condemned_parts跟踪等待删除的parts。
表引擎和存储
通过
/api/v1/query_range和/api/v1/queryhandler支持Prometheus HTTP Query API。S3/Azure Queue表支持对已处理文件进行移动或打标签。
MergeTree新增
merge_max_dynamic_subcolumns_in_wide_part设置,限制merge后的dynamic subcolumn数量。实现了Microsoft OneLake catalog集成。
支持
CREATE OR REPLACE语法用于临时表。通过
join_algorithm = 'direct'为MergeTree表启用direct(nested loop)join。支持在
ALTER TABLE ... ADD PROJECTION的WITH SETTINGS子句中设置projection级别参数。
Iceberg和数据湖
Iceberg的
CREATE操作支持ORDER BY,启用插入时排序。
SQL和查询特性
windowFunnel聚合函数新增allow_reentry选项,处理包含刷新的用户路径。Text index预处理参数支持在tokenization前对文档进行转换。
LIMIT和OFFSET支持小数,可选取表的一部分数据。into_outfile_create_parent_directories设置自动创建输出路径。type_json_skip_invalid_typed_paths禁止对无效JSON类型转换抛出异常。
客户端和CLI
--no-server-client-version-message标志可屏蔽版本不匹配警告。通过
--login选项支持访问云端凭证。Web UI下载按钮可下载完整结果集。
服务端配置和监控
X-ClickHouse-Progress和X-ClickHouse-Summaryheader中新增memory_usage字段。send_profile_events设置可在不需要profile event时减少网络流量。
Keeper
支持ZooKeeper persistent watches兼容性。
实现了带统计信息的创建兼容性。
输入/输出格式
新增
Buffers格式,类似Native但无列metadata开销。arrow_flight_request_descriptor_type设置支持Dremio和Arrow Flight服务器。kafka_schema_registry_skip_bytes在解析前跳过envelope header字节。
其他新特性
max_streams_for_files_processing_in_cluster_functions控制集群函数并行读取文件的stream数量。支持按查询禁用后台数据下载。
实验性支持e2k(Elbrus-2000)平台。
实验性功能
支持从ACME provider获取TLS证书(RFC 8555)。
通过
automatic_parallel_replicas_mode设置实现自动parallel replicas执行。Full-text search从实验性升级为private preview。
Alias表引擎移至实验性阶段;通过allow_experimental_alias_table_engine=1启用。
性能优化
查询执行和优化
查询达到行数限制时快速失败。
查询计划中移除未使用列的优化。
大值的ConstantNode优化。
hash table迭代时key预取,减少cache miss。
通过算法简化提升LZ4解压速度。
JOIN/ARRAY JOIN中延迟列复制,避免不必要的类型转换。
通过动态分发实现高级SIMD逻辑函数操作。
消除不必要的零初始化,提升JIT函数性能。
通过动态分发加速T64解压。
针对WHERE子句优化列到bool的转换。
单数值块排序加速。
JOIN优化
RIGHT/FULL JOIN使用ConcurrentHashJoin提升并行度,最高提升2倍。
适用场景下ANY LEFT/RIGHT JOIN重写为ALL INNER JOIN。
ANTI JOIN runtime filter支持,减少锁竞争。
LEFT/INNER JOIN保留读取顺序供后续操作使用。
MergeTree和存储优化
在拥有10K+ parts的表上,重分区裁剪的SELECT速度提升8倍。
fixed hash map的并行聚合状态合并。
Parquet reader v3默认启用。
optimize_read_in_order和query_plan_optimize_lazy_materialization可同时生效。DISTINCT查询可利用aggregate projection。
Streaming LIMIT BY transform在匹配输入排序顺序时优化执行。
Nullable类型列支持sparse serialization。
MergeTree reader inplace filtering优化。
引入merge候选范围收窄启发式策略。
索引和全文检索优化
Skip index通过
use_skip_indexes_for_disjunctions分析混合AND/OR条件的WHERE子句。通过
query_plan_text_index_add_hint的预过滤提升text index过滤性能。通过字典block缓存和hashtable token查找提升text index性能。
posting list缓存提升连续查询性能。
通过预计算key set优化重复反向字典查找。
使用skip index和动态阈值过滤优化ORDER BY...LIMIT N查询。
减少大型minmax index分析延迟。
聚合优化
AggregateFunctionHistogram通过尾部排序优化,提升约10%。
减少HashSetTable::merge开销,countDistinct略微提速。
topK性能和行为改进。
Decimal比较操作加速。
S3和备份优化
S3备份数据文件使用内容hash命名,通过
data_file_name_generator=checksum启用。通过
_path过滤下推优化glob pattern的S3表查询性能。
数据湖优化
任务分割改为基于row group ID而非文件。
Paimon函数支持分区裁剪。
改进
查询优化和执行
FETCH PARTITION在replicated merge tree磁盘损坏时允许执行。h3PolygonToCells函数用h3 hexagon填充geometry。DDL
ON CLUSTER查询使用原始用户上下文执行。ALTER TABLE ... FREEZE查询支持并行化。IN支持非常量第二参数;启用tuple参数支持。Normal projection可作为secondary index用于高效行过滤。
enable_shared_storage_snapshot_in_query默认启用。UNION在需要时使用Variant统一类型。
内部查询(字典、refreshable view)在日志中通过
is_internal列标记。支持向
ALIAS列执行INSERT。CREATE OR REPLACE TABLE ... SELECT显示进度条和统计信息。JSON和Dynamic类型支持hash函数。
query_plan_optimize_join_order_limit默认值改为10。enable_lazy_columns_replication优化默认启用。allow_statistics_optimize默认启用用于JOIN优化。create_table_empty_primary_key_by_default默认启用。enable_time_time64_type设置默认启用。allow_special_serialization_kinds_in_output_formats默认启用。Shared Catalog在执行查询时忽略ON CLUSTER。
Shared Catalog支持
ALTER DATABASE MODIFY COMMENT。SharedSet/SharedJoin在Shared database中支持
CREATE OR REPLACE。SYNC REPLICA在SharedMergeTree中避免不必要的等待。
存储和MergeTree改进
虚拟列
_tags(Map(String, String))显示S3 blob标签。去重消息中标明part是否被去重。
升级至OpenSSL 3.5.4。
新增Bcrypt认证缓存。
Parquet无时区timestamp读取为DateTime64(..., 'UTC')。
SQL定义的角色可授予users.xml中定义的用户。
FINAL查询跳过不必要的primary key交叉检查。
在设置
disable_insertion_and_mutation时允许remote/data lake表执行插入。表级统计信息缓存,支持
refresh_statistics_interval和use_statistics_cache。alter_column_secondary_index_mode控制索引mutation行为。ColumnsDescription的按表缓存减少多part表的内存占用。
系统表和监控
Keeper新增请求执行阶段耗时直方图。
system.columns中列出列统计信息类型。HTTP接口在查询结果缓存时提供
Age/Expiresheader。Web UI显示表属性,行数/字节数可点击。
system.error_log新增last_error_time、last_error_message、last_error_query_id、last_error_trace字段。去重block ID存入
system.part_logs。check_query_single_value_result默认改为false,提供按part的详细结果。system.mutations新增parts_in_progress_names用于诊断。system.background_schedule_pool{,_log}改进后台任务内省能力。新增
FailedInitialQuery和FailedInitialSelectQueryprofile event。system.tables新增悬空part相关指标。distributed_cache_client.connection_pool_size作为指标暴露。
客户端和UI改进
pager运行时Ctrl-C可取消查询。
Web UI支持显示负值的条形图。
以空白开头的查询不保存到历史记录。
交互模式高亮与光标位置匹配的标识符。
Web UI中查询输入框的调整大小控件改为全宽。
类型提示不再溢出表格标题。
Ctrl+/(Mac为Cmd+/)注释/取消注释选中行。
支持XDG Base Directory配置路径。
S3和云存储改进
未指定时自动选择opt-in AWS region。
s3_retry_attempts默认值设为500以提升备份成功率。STS endpoint的S3凭证缓存供函数复用。
Pre-signed URL支持S3。
数据湖改进
通过
delta_lake_snapshot_start_version/end_version支持DeltaLake CDF读取。INSERT表函数中的storage设置保持一致性。
数据湖的truncate查询抛出"未实现"错误。
Kafka改进
新增producer的
kafka_compression_codec和kafka_compression_level设置。kafka_consumer_reschedule_ms改为可调整的设置。
Keeper改进
通过
max_requests_append_bytes_size限制append请求批次的字节大小。服务端握手检查拒绝
last_zxid_seen > last_processed_zxid的客户端。降低S3Queue清理时RemoveRecursive的节点限制。
输入/输出格式改进
Parquet支持通过UUID logical type读写FixedString(16)形式的UUID。
hasAnyTokens/hasAllTokens函数接受字符串数组。Pretty格式将具名tuple显示为Pretty JSON。
通过
format_capn_proto_max_message_size限制CapnProto消息大小。
Text Index改进
Text index支持ReplacingMergeTree。
Inverted index可用于PREWHERE。
Ngrams tokenizer支持
ngram_length = 1。反序列化header缓存减少I/O。
其他改进
Array/Map二进制反序列化使用
max_binary_array_size设置。系统内存小于5GB时默认禁用executable mlock。
通过merge设置减少
system.metric_log内存占用。S3 XML响应解析支持网络错误重试。
安全限制警告消息显示当前值和触发阈值。
system.filesystem_cache改为流式返回chunk。vector similarity index缓存条目随part删除一并清除。
预认证HTTP错误中隐藏ClickHouse版本信息。
新增
apply_row_policy_after_final和apply_prewhere_after_final设置。tupleElement支持JSON类型。支持负数tuple索引(如tuple.-1)。
支持Array到QBit类型的隐式转换。
system.blob_storage_log新增elapsed_time_microseconds字段。database_shared_drop_table_delay_seconds控制drop延迟时间。Named collection的加密key延迟加载。
支持按buffer禁用distributed cache client。
Shared distributed cache连接数限制。
Bug修复
查询执行修复
修复多个远程shard时
rows_before_limit_at_least计算错误。修复
INSERT INTO...SELECT后显示"0 rows in set"的问题。修复
multiIf带常量参数和短路求值时的错误结果。修复从带子查询约束的表中SELECT时的LogicalError。
修复cross join重排序时的logical error。
修复带OR条件和unique key的JOIN结果错误。
修复full_sorting_merge join的重复列错误。
修复JOIN中"Invalid number of rows in Chunk"错误。
修复parallel replicas下RIGHT JOIN数据重复问题。
修复
join_use_nulls与多个join时的logical error。
数据类型和JSON修复
修复从带点号名称的列中读取子列的问题。
修复JSON解析中混合float/bool数组的问题。
修复LowCardinality(Nullable(T))到Dynamic的类型转换。
修复读取JSON paths/subcolumn时的logical error。
修复数据类型二进制反序列化中的栈溢出。
修复JSON shared data/dynamic paths状态不一致。
修复Summing/Aggregating/Coalescing MergeTree中JSON列合并问题。
MergeTree和存储修复
修复TTL列提前移除的问题。
修复反向排序PK时min(PK)/max(PK)计算错误。
修复降序primary key下JOIN sharding错误。
修复projection index读取的竞态条件。
修复TTL清空但projection非空的parts合并处理。
修复compact parts上执行ALTER后出现TOO_MANY_MARKS错误。
Parquet和格式修复
修复seek设置为0时Parquet reader的段错误。
修复Parquet writer的
created_by字符串格式。Parquet单线程写入保持顺序。
修复ORC reader中DICTIONARY_V2仅含NULL的字符串列问题。
修复ORC读取Date/DateTime64溢出问题。
Iceberg和数据湖修复
icebergS3Cluster协议支持schema evolution和delete。修复Iceberg Glue catalog timestamp列的JSON异常。
无manifest排序顺序时禁用Iceberg read-in-order优化。
函数修复
修复
reverseUTF8处理4字节UTF-8代码点的bug。修复
cramersV/theilsU中phi方计算错误。修复
top_k阈值参数不生效的问题。修复
countIf(*)参数被截断的问题。恢复
trim/ltrim/rtrim双参数函数支持。修复
arrayFilter在空数组与isNull组合时的错误。
内存和崩溃修复
修复带ARRAY JOIN和
enable_lazy_columns_replication的远程查询崩溃。修复服务器关闭时因析构顺序导致的崩溃。
修复LowCardinality(String)聚合函数状态崩溃。
修复StorageDistributed解析格式错误的shard目录时崩溃。
修复userspace page cache引发的误报内存限制错误。
修复MEMORY_LIMIT_EXCEEDED后聚合函数崩溃。
改进hash join结果生成的内存跟踪。
安全和权限修复
修复
clusterAllReplicas中不存在的角色触发ACCESS_ENTITY_NOT_FOUND。修复带remote localhost函数的ALTER UPDATE访问校验。
修复通配符grant的部分revoke检查。
修复全局grant带通配符revoke的处理逻辑。
Replicated Database修复
修复Replicated database replica卡在打印"Failed to marked query"的问题。
修复shutdown与后台INSERT之间的distributed use-after-free竞态。
修复refreshable materialized view在刷新过程中源表被删除时崩溃。
Keeper修复
修复启动时changelog不当轮转导致的读取错误。
其他重要修复
修复skip index分析性能退化。
修复Hive partitioning升级不兼容问题。
修复带
nan/inf的WITH FILL查询无限循环。修复Time/Time64从DateTime/DateTime64转换时的时区处理。
修复lightweight update后查询条件缓存返回错误结果。
恢复String聚合状态的内存序列化兼容性。
修复SummingMergeTree中Nested LowCardinality列的聚合问题。
修复
system.view_refreshes中"No macro 'replica'"错误。修复Shared Catalog中MV列新增的复制问题。
修复MV commit失败导致Shared Catalog状态应用挂起。
修复Shared Catalog从副本上的ALTER设置约束检查。
修复SharedCatalog迁移时数据库注释丢失。
修复Shared Catalog从副本上物化视图替换问题。
修复
system.distributed_cache_usage计数器错误。修复Shared Catalog中带ILLEGAL_COLUMN异常的DROP卡住问题。
修复Replicated database中SharedSet/SharedJoin的CREATE OR REPLACE。
修复RMV Shared database刷新中的UNFINISHED异常。
修复Shared database中TABLE_ALREADY_EXISTS崩溃。
修复Shared Catalog中损坏的建表语句迁移。
getStatus中使用virtual parts。启动时Shared Catalog状态应用支持重试。
修复表创建异常后DROP DATABASE卡住的问题。
修复distributed cache logical error。
修复distributed cache错误处理。
修复Shared Catalog中~TemporaryLockForUUIDDirectory的LOGICAL_ERROR。
修复database重命名后metadata cache依赖关系错误。
修复Shared Catalog从副本上大表DROP的问题。
修复distributed cache
processWriteRequest的logical error。移除MV在从副本上的ALTER检查。