本文介绍云数据库ClickHouse26.2企业版的主要变更内容,包括新特性、非兼容变更、改进、性能优化和Bug修复。
重要变更
Full Text Search正式GA。
Paimon支持REST catalog。
非兼容变更
查询和函数变更
别名替换导致的查询格式化不一致问题已修复;部分在禁用analyzer时使用
IN加别名引用的CREATE VIEW查询可能报错(analyzer自v24.3起默认启用)。JOIN USING ()中的空列列表现在触发语法错误而非运行时错误。ORDER BY及其他表key表达式中禁止使用子查询。
数据类型变更
通过
allow_experimental_nullable_tuple_type = 1支持Nullable(Tuple)。JSON类型的高级shared data默认启用;升级后将无法降级到25.8之前的版本。
JSON中的
SKIP REGEXP默认改为部分匹配。PostgreSQL
DATE列现在推断为Date32而非Date。
存储和索引变更
Inverted text index存储布局改进;25.12之前版本的旧索引必须删除重建。
统计信息存储格式改为单文件方式。
索引文件名现在会进行转义;旧版本中包含非ASCII字符的名称将无法加载。
移除的功能
DEFLATE_QPL和ZSTD_QATcodec已完全移除。不再支持向
ALIAS列执行INSERT。Lazy数据库引擎已移除。transposed_with_wide_viewmetric_log模式已移除。
设置和配置变更
数据湖catalog在无法访问object storage时报错。
CPU调度通过
cpu_slot_preemption默认改为抢占式。部分设置从format级别改为普通设置。
do_not_merge_across_partitions_select_final语义简化。apply_row_policy_after_final默认启用。
安全和权限变更
joinGet/joinGetOrNull现在对Join表强制检查SELECT权限。CREATE TABLE ... AS ...需要SHOW COLUMNS权限而非SHOW TABLES。
插入和去重变更
所有插入操作默认启用去重。
系统表变更
S3Queue和AzureQueue的metadata表从
system.s3queue重命名为system.s3queue_metadata_cache。
新特性
认证
新增TOTP(基于时间的一次性密码)认证支持。
函数
reverseBySeparator函数用于反转分隔符间的子串。colorOKLABToSRGB和colorSRGBToOKLAB色彩空间转换函数。cosineDistanceTransposed函数用于近似计算余弦距离。xxh3_128哈希函数。mergeTreeAnalyzeIndex()用于分析索引使用情况。函数通过
FunctionVariantAdaptor支持Variant类型。SQL中的函数可以不加括号调用。
系统表
system.user_defined_functions用于监控UDF加载状态。新增
system.zookeeper_info表。新增
system.primes表及素数函数。system.parts新增files列。新增
system.fail_points表用于failpoint检查。
表引擎和存储
Text index支持
Array列。支持Paimon REST catalog。
新增
icebergLocalCluster表函数。数据库新增
lazy_load_tables设置,支持延迟表初始化。DatabaseReplicated支持辅助ZooKeeper。数据文件和系统文件支持cache segment splitting。
Parquet metadata的SLRU缓存。
Parquet reader v3支持数据湖
PREWHERE和多阶段优化。支持跨replica的分布式索引分析。
插入和去重
支持异步插入去重与依赖物化视图的联动。
异步插入支持parallel quorum。
新增
insert_deduplication_version设置用于hash迁移。
SQL和查询特性
新增
SYSTEM CLEAR [...] CACHE语法。OPTIMIZE <table> DRY RUN PARTS支持merge模拟。DatabaseReplicated支持带ON CLUSTER的DDL。简化的projection index框架。
配置和参数
max_insert_block_size_bytes控制插入block大小。use_primary_key设置可禁用granule裁剪。default_dictionary_database简化字典解析。check_named_collection_dependencies防止删除正在使用的named collection。concurrent_threads_scheduler引入max-min公平调度器。新增
logger.startup_console_level和logger.shutdown_console_level选项。
监控
新增
ClickHouse_InfoPrometheus指标,包含版本信息。
实验性功能
向量搜索支持跨集群replica分布。
服务端AST fuzzer,通过
ast_fuzzer_runs和ast_fuzzer_any_query控制。
改进
查询和SQL改进
关联子查询支持更多表引擎。
标量的非常量
IN已启用。扩展JOIN的表别名支持。
EXPLAIN indices = 1作为EXPLAIN indexes = 1的别名。numbers和primes表函数的过滤条件下推改进。多个INNER JOIN间的等价集合优化。
单子查询自动使用集群表函数。
startsWithUTF8用于ASCII前缀时使用primary key index。assumeNotNull、coalesce、ifNull支持范围谓词裁剪。MergeTree读取时移除未使用列。
use_join_disjunctions_push_down默认启用。enable_join_runtime_filters默认启用。降低JOIN runtime filter开销。
use_hash_table_stats_for_join_reordering默认启用。索引分析无论执行上下文只执行一次。
FINAL查询支持skip index交集优化。DROP DATABASE按反向依赖顺序删除表。Mutation遵守查询取消和时间限制。
ADD COLUMN防止已删除数据复活。冲突的
ALTER表达式抛出正确异常。聚合key收集行数和NDV统计信息。
Parallel replicas读取中的并行range stealing。
自动parallel replicas估算改进。
joinGet支持临时表。外部操作遵守
temporary_files_codec。向量搜索优化仅在存在索引时应用。
表引擎和存储改进
StorageEmbeddedRocksDB支持多个primary key列。新增
ALTER TABLE ... ATTACH PART ... FROM语法用于子目录附加。min_free_disk_bytes_to_perform_insert支持JBOD卷。TTL merge遵守
max_parts_to_merge_at_once。后台操作可通过
backgroundprofile配置。改进subcolumn读取的正确大小计算。
限制pipeline stream数量防止内存过高。
Text index升级为GA状态。
QBit升级为GA状态,支持等值比较。Projection表达式替换改为代入方式而非位置参数。
Replicated database中虚拟查询的集群缓存更新减少。
新增
SYSTEM RESET DDL WORKER命令。
数据湖改进
DeltaLake支持deletion vector。
deltaLakeCluster支持deletion vector。DeltaLake支持macOS。
DeltaLake metadata统计信息显示在
system.tables。DeltaLake system查询跳过object storage读取。
新增
SYSTEM RELOAD DELTA KERNEL TRACING命令。Iceberg metadata位置自动推断。
改进Iceberg position delete解析。
Iceberg支持
PREWHERE优化。Iceberg reader间共享线程和内存限制。
Iceberg支持
ALTER TABLE RENAME COLUMN。数据湖支持Google Cloud Storage。
Unity Catalog下S3 token动态刷新。
Glue catalog支持基于角色的访问控制。
S3Queue改进
Ordered模式下支持Hive partitioning跟踪。
重构基于bucket的处理逻辑。
支持通用分区。
支持基于partition key的bucket划分。
通过
keeper_path支持辅助ZooKeeper。基于限制跟踪的失败节点清理。
S3和Object Storage改进
S3加密header不再传播到特定请求。
Named collection中可指定
storage_class_name。通过凭证缓存修复EC2 metadata endpoint限流。
修复MinIO兼容性的错误码映射。
改进S3认证错误信息。
Azure Blob Storage原生复制失败时的回退处理。
函数改进
avg()支持Date、DateTime、Time类型。mapContainsKeyLike和mapContainsValueLike可利用text index。flipCoordinates支持Geometry类型。hasAnyTokens和hasAllTokens移除64 token限制。新增
distanceCosine作为cosineDistance的别名。KQL新增
iif函数。use_variant_as_common_type默认启用。
配置和参数改进
use_skip_indexes_on_data_read默认启用。add_minmax_index_for_time_columns自动为时间列创建minmax index。materialize_statistics_on_merge控制统计信息在merge时的物化。input_format_binary_max_type_complexity限制类型节点解码深度。trace_profile_events_list限制tracing到特定event。type_json_allow_duplicated_key_with_literal_and_nested_object向后兼容。新增
merge_max_dynamic_subcolumns_in_compact_part等相关设置。use_statistics作为allow_statistics_optimize的别名。数字到Enum的转换检查元素是否存在。
无适用row policy时给出警告。
enable_max_bytes_limit_for_min_age_to_force_merge默认启用。core_dump.size_limit支持热重载。配置重新加载时遵守命令行覆盖项。
服务日志支持组合轮转策略。
分布式索引分析激活阈值。
统计信息缓存默认启用。
path配置相对工作目录解析。
系统表和监控改进
system.mutations新增parts_postpone_reasons字段。system.data_skipping_indices新增creation列。system.background_schedule_pool反映正在运行的任务。新增
QueryNonInternal指标跟踪非内部查询。新增最长运行merge耗时的异步指标。
query_log新增connection_address和connection_port字段。system.crash_log信息增强。system.aggregated_zookeeper_log新增组件名称。新增
system.tokenizers表显示可用tokenizer。新增
system.jemalloc_stats表和HTML endpoint。新增
system.jemalloc_profile_text表用于heap profile。system.part_log新增mutation_ids字段。嵌套全局设置部分可见于
system.server_settings。view_duration_ms显示group活跃时间。system.blob_storage_log支持Azure、Local、HDFS。后台任务日志记录支持可配置阈值。
query log中的存储URL移除密码信息。
ClickHouse Keeper改进
正确处理Keeper日志条目间隙。
Keeper请求支持OpenTelemetry tracing。
新增changelog和snapshot操作的指标。
CHECK_STAT和TRY_REMOVE扩展默认启用。损坏的snapshot抛出异常而非abort。
getChildren支持with_data和with_stat扩展。Keeper错误配置检测。
辅助ZooKeeper可通过
system.zookeeper插入。
内存管理改进
优化filesystem cache空间预留。
filesystem cache并行化读取。
通过jemalloc purging减少非Linux系统内存占用。
单独线程执行jemalloc purging。
内存压力下动态jemalloc decay。
MergeTree读取前显式检查内存。
认证前检查总内存限制。
修复query conditions cache内存计算。
改进spilling的查询内存检测。
CPU饥饿时优先执行MemoryWorker。
表读取时遵守内存限制。
数据格式改进
Parquet reader支持将
Tuple/Map读取为JSON。Parquet reader支持空tuple。
Date序列化为Arrow的date32而非uint16。Hash输出格式与block大小无关。Pretty JSON简单类型显示在单行。
Schema推断遵守
allow_experimental_nullable_tuple_type。SQL formatter在
AS SELECT前输出COMMENT。优化postings list压缩。
备份和恢复改进
新增
backup_data_from_refreshable_materialized_view_targets设置。BACKUP/RESTORE支持SQL定义的named collection。
Named Collection和字典改进
MongoDB函数支持named collection参数覆盖。
YTsaurus字典和表支持named collection。
YTsaurus dynamic table source支持列描述。
参数化视图支持schema展示。
其他改进
改进
SYSTEM INSTRUMENT的字符串字面量UX。SYSTEM NOTIFY FAILPOINT支持可暂停的failpoint。trace中正确显示C++函数名。
jemalloc profile写入时携带符号。
修复MaterializedPostgreSQL attachment崩溃。
修复
CREATE TABLE残留文件清理。修复TLS key内存访问。
ALTER TABLE MODIFY SETTING锁超时时报错。改进CPU与profiler的互操作性。
release构建启用fast libcxx hardening。
性能优化
JOIN性能
通过
ColumnVector::replicate动态分发加速hash join。更多过滤条件下推进JOIN。
ANY、SEMI、ANTIjoin支持过滤下推。SEMI JOIN的等价集合过滤下推。ParallelHashJoin并行化非join行的处理。右表为空时hash join跳过左侧处理。
RIGHT OUTER JOIN支持JOIN runtime filter。runtime filter的PREWHERE优化延迟执行。
查询优化
特定window函数禁用排序顺序优化。
外层过滤条件下推进视图。
优化小数
LIMIT和OFFSET。常量虚拟列过滤不再求值。
确定性primary key表达式支持数据跳过。
read-in-order识别常量
ORDER BY列。带primary key条件的
FINAL查询优化。lazy materialization应用到所有
UNION ALL分支。
函数和聚合性能
扩展JIT编译覆盖范围。
distinctJSONPaths优化为只读取路径。uniqExact对连续相同元素优化。isValidASCII对全ASCII输入优化。uniq通过批处理加速数值类型。
存储和I/O性能
Parquet Reader V3 Prefetcher使用更快的随机读逻辑。
icebergCluster性能提升。超宽表的INSERT和merge内存占用降低。
Text index提升full-text search性能。
x86上T64 codec压缩加速。
32字节block的LZ4解压加速。
Text index部分读取优化。
Minmax index计算优化。
system log表新增secondary index。
禁用去重时避免INSERT内存回归。
内存优化
减少
ASTLiteral内存占用。专用Enum AST类减少内存。
Named tuple AST内存优化。
CachedOnDiskReadBufferFromFile大小缩减50倍。HashTable::resize对空表跳过复制。
内部优化
数据分区采用"Fastrange"方法。
通过linker选项改进去虚拟化。
ZooKeeper批处理提升clone replica性能。
更快的hash算法降低ZooKeeper接收线程CPU占用。
Bug修复
JOIN修复
修复outer-to-inner优化时Join storage的
INCOMPATIBLE_TYPE_OF_JOIN。修复
USING和join_use_nulls多JOIN时的logical error。修复join重排序时的logical error。
修复
join_on_disk_max_files_to_merge可能的崩溃。修复join转换时意外修改查询计划。
修复常量条件多join的logical error。
修复
full_sorting_join中LowCardinality(Nullable)的NULL != NULL。修复稀疏右侧key的join结果错误。
修复
LEFT ANTI JOIN后置条件的runtime filter。修复runtime filter与totals的logical error。
修复runtime filter中重复const列。
修复
__applyFilter返回ILLEGAL_TYPE_OF_ARGUMENT。修复右表已填充时的runtime filter。
修复重复列导致的
NOT_FOUND_COLUMN_IN_BLOCK。修复
Merge表runtime filter的FilterStep。修复
USING下Join storage的类型转换。修复parallel replicas与非MergeTree JOIN的查询。
修复Nullable join列的竞态条件。
修复Join表中空字符串变为
NULL。修复空MergeTree的direct join
NOT_SUPPORTED。修复多个INNER JOIN的outer join结果错误。
修复Nullable Tuple子字段的runtime filter异常。
修复parallel replicas下的CROSS JOIN。
修复INNER JOIN中
arrayJoin重复行。修复
arrayJoin引用JOIN两侧的LOGICAL_ERROR。修复VALUES lambda中的matcher logical error。
修复
analyzer_compatibility_join_using_top_level_identifier的matcher。修复ALIAS列的logical error。
修复旧analyzer中重复JOIN别名的崩溃。
查询和Analyzer修复
修复带尾部空白的预定义query handler。
修复metadata-only ALTER后projection的聚合错误。
修复
count_distinct_optimization与window函数。修复
arrayElementAST格式化不一致。修复非常量数组的
NOT IN。修复
Nothing类型的null-safe比较。修复
use_top_k_dynamic_filtering的Not found column。修复子查询中未使用列的移除。
修复分布式查询中
optimize_inverse_dictionary_lookup。修复
lag/lead与distributedremote()查询。修复
not match(...)的数据跳过。修复
not materialize(...)或not CAST(...)的数据跳过。修复
has函数空数组的logical error。修复空tuple和
Map列的logical error。修复带PK sharding和false条件的查询。
修复
Merge引擎hostName()抛出ILLEGAL_COLUMN。修复带别名的Merge的
NO_SUCH_COLUMN_IN_TABLE。修复bloom filter index在
OR和NOT条件下的问题。修复带subcolumn过滤的projection应用。
修复projection重建后
_part_offset损坏。防止插值列别名折叠。
修复projection重建中未使用列。
修复负数
LIMIT/OFFSET的logical error。修复小数
LIMIT/OFFSET的logical error。修复
transform_null_in下IN返回错误结果。修复单列引用的
IN (col)。修复
LowCardinality(Nullable)的sumCount()重写。修复
not IN和not has的分区裁剪。修复lambda表达式的prewhere过滤错误。
修复期望值处lambda的
LOGICAL_ERROR。修复lambda表达式的空指针解引用。
修复CTE中表函数的
SETTINGS未应用。修复query condition cache hash碰撞。
修复ALIAS列lambda的
BAD_ARGUMENTS。修复
EXCEPT ALL和INTERSECT ALL忽略重数。修复大
PRECEDINGoffset的断言失败。修复window函数与
group_by_use_nulls的异常。修复
GROUPING SETS的block结构问题。修复
GROUP BY ROLLUP/CUBE复杂类型的logical error。修复
IfTransformStringsToEnumPass中的断言。修复
dictGet谓词重写的ACCESS_DENIED。修复分布式查询中
if函数类型不匹配。修复
Bool类型的JIT编译查询。修复DateTime混合类型的JIT类型转换。
修复
formatDateTime中的未初始化值。修复
indexOfAssumeSorted中的std::terminate。修复Geometry函数接受子类型的问题。
修复索引影响row policy/FINAL结果。
修复row policy下的read-in-order。
修复text-indexed列与
QUALIFY的LOGICAL_ERROR。修复超过32个
AND/OR表达式可能的崩溃。修复
indexHint和FINAL的block结构不匹配。修复别名tuple的AST格式化roundtrip。
修复
NOT (1, 1, 1)的AST格式化。
MergeTree和存储修复
修复大小写不敏感文件系统上文件名替换导致数据损坏。
物化视图使用创建时的数据库作为执行上下文。
新增对物化视图底层查询的完整权限检查。
修复事务回滚后mutation操作导致的logical error。
修复数据库转换后
system.warnings未更新。修复
ATTACH AS REPLICATED时的LOGICAL_ERROR。修复sparse列mutation后的
FILE_DOESNT_EXIST。修复TOCTOU竞态导致的过期part使用。
修复mutation过程中的序列化信息继承。
修复列名与subcolumn名冲突。
修复分区中subcolumn导致的
NOT_FOUND_COLUMN_IN_BLOCK。修复ALTER后物化视图缺少subcolumn。
修复去重竞态下恢复时的
LOGICAL_ERROR。修复TTL更新使用sparse列。
修复SET表达式中
LowCardinalitywrapper恢复。修复
ALTER TABLE REWRITE PARTSaction错误。修复
CREATE USER中的查询参数替换。修复在只读磁盘上尝试删除临时目录。
修复subcolumn上的skip index物化。
修复带依赖索引的
CLEAR COLUMN。修复主机变更后Replicated database的attachment。
修复Replicated database中
CREATE TABLE ... AS urlCluster()。修复
REPLACE PARTITION与mutation之间的竞态。修复允许旧数据重新出现的剩余竞态。
修复
PartCheckThread导致的mutation卡住。修复lightweight update后的
DROP COLUMN。修复lightweight update过程中的空指针解引用。
修复未知projection parts被标记为丢失。
修复
CREATE TABLE ... CLONE AS ...忽略完整限定符。修复metadata变更时的implicit index重新生成。
修复带alias列的implicit index。
修复TTL merge后
min(timestamp)返回epoch。修复
use_const_adaptive_granularity的错误计算。修复非自适应granularity下的"Number of rows in lazy chunk"。
修复zero-copy replication删除竞态。
修复
SYSTEM RESTART REPLICA导致表丢失。修复类型修改后列统计信息的
assert_cast。修复不必要的统计信息加载。
修复并发database drop的分布式DDL错误。
修复nullable primary key的
KeyConditionlogical error。
数据类型和序列化修复
修复从Dynamic/JSON读取size subcolumn错误。
修复JSON数组上
tupleElement崩溃。修复嵌套路径的
tupleElementJSON问题。修复带类型提示JSON path的
tupleElement异常。修复JSON
SKIPpath跳过前缀匹配而非精确key。修复
type_json_allow_duplicated_key_with_literal_and_nested_object应用。修复typed path兼容性检查。
修复'skip' path的类型提示创建。
修复别名中dynamic subcolumn的解析。
修复Variant过滤不一致错误。
修复
GROUP BY中Variant的ifNull崩溃。修复
FunctionVariantAdaptor带const要求的logical error。修复函数返回
Nothing时的LOGICAL_ERROR。修复比较含LowCardinality的Variant与NULL时的异常。
修复含LowCardinality的Variant在
concat中的LOGICAL_ERROR。修复
LowCardinality到Nullable转换结果错误。修复
cast_keep_nullable下LowCardinality Nullable的CAST。修复复杂类型转换中的
ColumnNullable is not compatible异常。修复
Nullable(Tuple)subcolumn上isNull/isNotNull的LOGICAL_ERROR。修复Array-to-QBit转换中的
LOGICAL_ERROR。修复读取带subcolumn的sparse列的
LOGICAL_ERROR。修复读取sparse列的
NOT_FOUND_COLUMN_IN_BLOCK。