向后不兼容的变更
查询和语法变更
- 修复了因错误的别名替换导致的查询格式不一致问题。注意:当 analyzer 被禁用时,某些在
IN中使用别名引用的CREATE VIEW查询可能无法再被处理。为避免这种情况,请确保启用 analyzer (自 24.3 起默认已启用) 。#82838 (Alexey Milovidov). JOIN USING ()中的空列列表现在会被视为语法错误。此前,这类问题会在查询执行时报告为INVALID_JOIN_ON_EXPRESSION,并且在某些情况下 (例如与Join存储连接时) 还可能导致LOGICAL_ERROR。#92371 (Vladimir Cherkasov).ORDER BY和其他表键表达式中不再允许使用子查询。#96847 (Alexey Milovidov).
数据类型变更
- 新增了对
Nullable(Tuple)的支持。要启用该功能,请设置allow_experimental_nullable_tuple_type = 1。#89643 (Nihal Z. Miaji) 。 - JSON type 的高级 shared data 现已默认启用。由于旧版本无法读取以新 JSON format 写入的数据分区片段,因此将无法降级到 25.8 之前的版本。为确保升级安全,请将
compatibilitysetting 设为上一版本,或将 MergeTree settingsdynamic_serialization_version='v2'和object_serialization_version='v2'设置为相应值。#92511 (Pavel Kruglov) 。 - JSON type 中的
SKIP REGEXP现在默认采用部分匹配。#92847 (Pavel Kruglov) 。 - 修复了
Variant类型不匹配时出现的逻辑错误。#95811 (Bharat Nallan) 。 - 来自 PostgreSQL 的
DATE列现在会在 ClickHouse 中推断为Date32(此前会被推断为Date,对于超出其较小取值范围的值,可能会导致溢出) 。现在也支持将Date32值插回 PostgreSQL。#95999 (Alexey Milovidov) 。
存储和索引变更
- 改进了倒排文本索引的存储布局,可更高效地从对象存储中读取数据,同时还提升了带有倒排文本索引的表的合并性能。如果你在 25.12 之前使用过 Experimental 文本索引,则必须在升级前删除该索引,并在新版本中重新构建。#91518 (Anton Popov).
- 统计信息的存储格式已更改——现在所有统计信息都存储在单个文件中。#93414 (Anton Popov).
- 现在会对索引文件名进行转义,以避免 parts 损坏。对于由先前版本创建且名称中包含非 ASCII 字符的索引,ClickHouse 将无法加载。要处理此问题,请使用 MergeTree 设置
escape_index_filenames。#94079 (Raúl Marín).
已移除的功能
DEFLATE_QPL和ZSTD_QAT编解码器已移除。升级前,请先将所有使用这些编解码器压缩的现有数据转换为其他编解码器。请注意,此前使用这些编解码器需要启用enable_deflate_qpl_codec或enable_zstd_qat_codec。#92150 (Robert Schulze) 。- 不再支持向简单
ALIAS列执行INSERT(撤销了 #84154) 。该功能无法与自定义格式配合使用,也没有相应的设置项进行控制。#92849 (Azat Khuzhin) 。 Lazy数据库引擎已移除,不再可用。#93627 (Alexey Milovidov) 。- 由于存在使其无法使用的缺陷,
metric_log的transposed_with_wide_view模式已被移除。现在已无法再使用此模式定义system.metric_log。#93867 (Alexey Milovidov) 。
设置和配置变更
- 新增了一项设置:如果数据湖 catalog 无法访问对象存储,则会报错。#93606 (Konstantin Vedernikov).
- 工作负载的 CPU 调度现在默认采用抢占式。请参见服务器设置
cpu_slot_preemption。#94060 (Sergei Trifonov). - 设置
exact_rows_before_limit、rows_before_aggregation、cross_to_inner_join_rewrite、regexp_dict_allow_hyperscan、regexp_dict_flag_case_insensitive、regexp_dict_flag_dotall和dictionary_use_async_executor现已从 format settings 重新归类为常规设置。这主要是内部变更,通常不会带来用户可见的副作用;但如果你曾在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog 或 NATS 表引擎定义中指定了其中任意一项,现在这类定义将报错,而不再是被静默忽略。#94106 (Robert Schulze). do_not_merge_across_partitions_select_final的语义已简化。此前,即使未显式设置,该功能也可能被自动启用,从而造成困惑并引发生产环境问题。现在:将其设为1会无条件启用该功能;将其设为0则会交由新设置enable_automatic_decision_for_merging_across_partitions_for_final(默认值为1) 决定。#96110 (Nikita Taranov).- 新增了 S3 schema 验证。#96194 (Konstantin Vedernikov).
- 设置
apply_row_policy_after_final现已默认启用,以确保ROW POLICY像最初一样遵循FINAL。如果你之前依赖optimize_move_to_prewhere_if_final=1在FINAL之前应用行策略,请改用apply_row_policy_after_final=0。#97279 (Nikolai Kochetov).
安全和访问控制变更
joinGet/joinGetOrNull现在会对底层 Join 表强制检查SELECT特权。执行joinGet('db.table', 'column', key)时,需要同时对键列和要获取的 attribute 列具有SELECT特权。缺少这些特权的查询将因ACCESS_DENIED而失败。要适配这一变更,可使用GRANT SELECT ON db.join_table TO user授予整表访问权限,或使用GRANT SELECT(key_col, attr_col) ON db.join_table TO user授予列级访问权限。 #94307 (Vladimir Cherkasov).CREATE TABLE ... AS ...查询现在需要SHOW COLUMNS特权,而不再是此前被错误检查的SHOW TABLES。 #94556 (pufit).
插入与去重变更
- 现在,所有插入操作默认都会启用去重。此前,异步插入和 materialized view 默认不启用去重,而同步插入默认启用。若要保留旧行为,请显式设置
deduplicate_insert='backward_compatible_choice'(deduplicate_blocks_in_dependent_materialized_views同样如此) 。#95970 (Sema Checherinda) 。
系统表变更
- S3Queue 和 AzureQueue 的内存元数据现已受到限制。系统表已重命名:
system.s3queue现为system.s3queue_metadata_cache,system.azure_queue现为system.azure_queue_metadata_cache。#95809 (Kseniia Sumarokova) 。
其他重大变更
- 修复了
H3 索引函数在使用无效输入调用时可能发生崩溃或卡死的问题。#93657 (Michael Kolupaev) 。
新功能
身份验证
- 新增支持将基于时间的一次性密码 (TOTP) 作为身份验证方法。#71273 (Vladimir Cherkasov) 。
函数
- 新增
reverseBySeparator函数,用于反转字符串中由指定分隔符分隔的子字符串顺序。#91780 (Xuewei Wang). - 新增
colorOKLABToSRGB和colorSRGBToOKLAB函数,用于在 sRGB 和 OKLAB 色彩空间之间转换。#93361 (Pranav Tiwari). - 新增
cosineDistanceTransposed函数,用于近似计算两点之间的余弦距离。#93621 (Raufs Dunamalijevs). - 新增
xxh3_128哈希函数。#96055 (Raúl Marín). - 新增
mergeTreeAnalyzeIndex()函数,用于分析 MergeTree 索引的使用情况。#92954 (Azat Khuzhin). - 函数现已通过新的
FunctionVariantAdaptor支持Variant类型。#90900 (Bharat Nallan). - 现在,某些函数在 SQL 中可不带括号调用。#94678 (Aly Kafoury).
系统表
- 新增了
system.user_defined_functions表,用于监控 UDF 的加载状态和配置。#90340 (Xu Jia). - 新增了
system.zookeeper_info表。#90809 (Smita Kulkarni). - 新增了
system.primes表以及包含按升序排列的质数的primes表函数。#92776 (Nihal Z. Miaji). - 在
system.parts中新增了files列,用于显示每个数据分区片段中的文件数量。#94337 (Match). - 新增了
system.fail_points表,用于查看现有 failpoint 及其是否已启用。#96762 (Pedro Ferreira).
表引擎和存储
- 为
Array列新增了文本索引支持。#89895 (Jimmy Aguilar Mena). - 新增了对 Paimon REST catalog 的支持。#92011 (JIaQi Tang).
- 新增了
icebergLocalCluster表函数。#93323 (Anton Ivashkin). - 新增了
lazy_load_tables数据库设置。启用后,数据库启动时不会加载表,而是先创建一个轻量级的StorageTableProxy,并在首次访问时再 materialize 真正的表引擎。#96283 (xiaohuanlin). - 为
DatabaseReplicated新增了 auxiliary ZooKeeper 支持。#91683 (RinChanNOW). - 缓存中的数据文件和系统文件现在可以拆分为独立的分段。#87834 (MikhailBurdukov).
- 新增了一个用于 Parquet 元数据的 SLRU 缓存,可通过避免重复下载文件来提升读取性能。可使用
SYSTEM DROP PARQUET METADATA CACHE清除此缓存。#89750 (Grant Holly). - 数据湖表现已在 Parquet reader v3 中支持
PREWHERE和多阶段PREWHERE。#93542 (Konstantin Vedernikov). - 新增了跨多个副本的分布式索引分析功能,对共享存储和大数据量场景尤为有益。#86786 (Azat Khuzhin).
插入与去重
- 异步插入去重现已支持依赖的 materialized view。当发生
block_id冲突时,会先过滤原始块,移除与冲突block_id关联的行,然后将剩余行通过所有相关的 materialized view 查询进行转换。#89140 (Sema Checherinda). - 异步插入现已支持并行 quorum——插入的数据会复制到 quorum 所需的副本数;如果发现重复项,查询会等待此前插入的数据也完成复制。#93356 (Sema Checherinda).
- 新增
insert_deduplication_version服务器设置,用于启用向统一去重哈希的迁移。#95409 (Sema Checherinda). - 已开始迁移去重哈希。#97562 (Sema Checherinda).
SQL 和查询功能
- 新增
SYSTEM CLEAR [...] CACHE语法,作为现有SYSTEM DROP [...] CACHE的更清晰替代方案。旧语法仍然可用。#93727 (Pranav Tiwari) 。 - 新增
OPTIMIZE <table> DRY RUN PARTS <part names>查询,可在不提交结果分片的情况下模拟合并操作。适用于验证合并正确性、复现与合并相关的 bug,以及对合并性能进行基准测试。#96122 (Anton Popov) 。 - 现在,当启用
ignore_on_cluster_for_replicated_database设置时,可对 Replicated 数据库执行带有ON CLUSTER的 DDL 查询。集群名称将被忽略。#92872 (Kirill) 。 - 引入了新的语法和框架,以简化并扩展投影索引功能。#91844 (Amos Bird) 。
设置与配置
- 新增
max_insert_block_size_bytes设置,以更精细地控制插入时块的形成。 #92833 (Kirill Kopnev). - 新增
use_primary_key设置。将其设为false可禁用基于主键的粒度剪枝。 #93319 (Nihal Z. Miaji). - 新增
default_dictionary_database设置,允许 ClickHouse 在指定的默认数据库中解析未显式指定数据库的外部字典引用。这简化了从 XML 定义的全局字典迁移到 SQL 定义的按数据库划分字典的过程。 #91412 (Dmitrii Plotnikov). - 新增
check_named_collection_dependencies设置 (默认启用) ,用于防止删除被表使用的命名集合。 #96181 (Pablo Marcos). - 新增一种用于并发控制的 max-min 公平调度器,在大量查询竞争有限 CPU 插槽的高过载场景下可提供更好的公平性。
concurrent_threads_scheduler服务器设置 现在默认使用max_min_fair,而不是fair_round_robin,因此短时运行的查询不再受长时运行查询的拖累。 #94732 #95300 (Sergei Trifonov). - 新增
logger.startup_console_level和logger.shutdown_console_level配置选项,分别用于在 ClickHouse 启动和关闭期间覆盖控制台日志级别。 #95919 (Garrett Thomas).
监控
- 在 Prometheus 的
/metrics端点新增了ClickHouse_Info指标,包含版本信息,因此可以构建图表来跟踪详细版本信息随时间的变化。#91125 (Christoph Wurm).
Experimental 功能
- 向量搜索现在可以将负载分散到集群中的各个副本上,从而支持超过单台 VM 内存容量的大型向量索引。#95876 (Shankar Iyer) 。
- 新增了一个由
ast_fuzzer_runs和ast_fuzzer_any_query设置控制的服务器端 AST fuzzer。启用后,服务器会在每个查询正常执行完毕后,再运行其随机变体并丢弃结果。#97568 (Alexey Milovidov) 。
改进
查询与 SQL
- 关联子查询现已支持更多表引擎和数据源类型。#90175 (Dmitry Novik) 。
- 现在已支持用于标量的非常量
IN(例如:val1 NOT IN if(cond, val2, val3)) 。#93495 (Yarik Briukhovetskyi) 。 - 新增了对 JOIN 扩展表别名的支持 (例如
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b) 。#95331 (Yarik Briukhovetskyi) 。 - 现已支持将
EXPLAIN indices = 1作为EXPLAIN indexes = 1的别名。#92774 (Pranav Tiwari) 。 - 改进了
numbers和primes表函数的过滤器下推 —— ClickHouse 现在可根据WHERE条件推导出保守的值边界,从而限制序列生成,避免无界扫描。#96115 (Nihal Z. Miaji) 。 - 等价集合优化现已支持跨多个连续的
INNER JOIN操作,因此在这条连接链中应用于任意表的过滤器都会自动下推到所有相关表。#96596 (Vladimir Cherkasov) 。 - 现在,对于
FROM中的单个子查询,会自动使用 cluster 表函数。#96332 (phulv94). - 现在,如果前缀仅包含 ASCII 字符,在使用
startsWithUTF8进行过滤时就会使用主键索引。#97055 (vkcku). assumeNotNull、coalesce和ifNull现在支持在键列被这些函数包装时,对范围谓词进行主键和跳过索引裁剪。#94754 (Nihal Z. Miaji).- 现在,从 MergeTree 读取数据时,也会在读取阶段移除未使用的列,这在将过滤器下推至
PREWHERE时尤其有用。#89982 (János Benjamin Antal). use_join_disjunctions_push_down优化现已默认启用。#89313 (Alexey Milovidov) 。enable_join_runtime_filters优化现已默认启用。#89314 (Alexey Milovidov) 。- JOIN 运行时过滤器的开销现已降低:当 bloom filter 中被置位的位过多,或实际过滤掉的行数过少时,系统会自动禁用过滤器。#91578 (Alexander Gololobov).
- 新增了
use_hash_table_stats_for_join_reordering设置 (默认启用) ,用于控制是否使用运行时哈希表大小统计信息进行 join 重排序。#93912 (Vladimir Cherkasov) 。 - 现在,无论查询是在本地执行还是借助并行副本执行,索引分析都只需进行一次。#94854 (Nikita Taranov) 。
- 如果
FINAL查询中的某个跳过索引针对主键中的某一列,则现在会跳过对其他 parts 的额外主键相交检查。#93899 (Shankar Iyer) 。 DROP DATABASE现在会按依赖关系的逆序删除表,从而在数据库包含具有加载依赖关系的表时提升崩溃安全性。#97057 (Alexey Milovidov).- 现在,同步等待变更时会遵循查询取消和时间限制。#96756 (Alexey Milovidov).
- 防止在
DROP COLUMN变更后紧接着执行ADD COLUMN时,已删除的数据重新出现。#96713 (Alexey Milovidov) 。 - 涉及
UPDATE和RENAME COLUMN的冲突ALTER表达式现在会抛出正确的异常,而不再是逻辑错误。#96022 (Alexey Milovidov). - 现已为聚合键列收集预估总行数和 NDV (不同值数量) 统计信息。#92812 (Alexander Gololobov) 。
- 现在,在并行副本读取期间,所有副本都可以并行接管无主范围,从而改进负载均衡并降低长尾延迟。 #91374 (zoomxi).
- 提升了在高选择性
PREWHERE过滤器条件下自动并行副本的估算准确度。#97231 (Nikita Taranov) 。 joinGet现已支持临时表。#92973 (Eduard Karacharov) 。- 外部聚合、排序和 join 现在会在所有上下文中遵循
temporary_files_codec查询设置。#92388 (Vladimir Cherkasov) 。 - 向量相似度搜索的执行计划优化现在仅在搜索列存在索引时才会应用。#94998 (Eduard Karacharov) 。
表引擎和存储
StorageEmbeddedRocksDB现在支持使用多列作为主键。#33917 (usurai).- 新增
ALTER TABLE <table> ATTACH PART <part_name> FROM <directory_name>语法,无需手动重命名文件系统中的目录,即可从detached/下任意子目录附加 parts (例如带有broken-on-start或unexpected前缀的 parts) 。#74816 (Anton Popov). min_free_disk_bytes_to_perform_insert现在可在 JBOD 卷上正确运行。#90878 (Aleksandr Musorin).max_parts_to_merge_at_once现在会在生存时间 (TTL) drop-part 合并期间生效。#95315 (Kseniia Sumarokova).- 后台操作 (mutate、merge) 现在可以通过
backgroundprofile 独立配置,而不再通过defaultprofile 与常规查询共享设置。#93905 (Arsen Muk). - 改进了 subcolumn 读取,能够正确计算大小,从而降低内存使用并提升速度。#96251 (Pavel Kruglov).
- 现在限制了
split_intersecting_parts_ranges_into_layers生成的管道流数量,以避免过度占用内存。#96478 (Nikita Taranov). - 文本索引 现已 GA。#96794 (Robert Schulze).
QBit现已 GA。#95358 (Raufs Dunamalijevs).QBit现在支持相等性比较。#94078 (Raufs Dunamalijevs).- 使用
enable_positional_arguments_for_projections保存表 schema 时,现在会替换为 expression 而不是位置 argument,因此即使禁用该设置,服务器也能重启。#96372 (Alexey Milovidov). - 在 Replicated 数据库中,缓存的 cluster 不再因每个 dummy 查询而更新。#96897 (Tuan Pham Anh).
- 新增
SYSTEM RESET DDL WORKER [ON CLUSTER]查询,用于重置 DDLWorker 状态,在 host ID 更新时可用于刷新副本活动状态。#93780 (Tuan Pham Anh).
数据湖
- 新增对 DeltaLake 删除向量的支持。#93852 (Kseniia Sumarokova).
deltaLakeCluster现在也支持删除向量。#94365 (Kseniia Sumarokova).- DeltaLake 现已支持 macOS。#95985 (Alexey Milovidov).
- DeltaLake 现在会从元数据中获取
count()结果,并在system.tables中显示正确的表统计信息 (总字节数/总行数) 。#96190 (Kseniia Sumarokova). - 从
system.tables查询 DeltaLake 表时,会跳过对象存储读取。#95899 (Antonio Andelic). - 新增
SYSTEM RELOAD DELTA KERNEL TRACING <level>命令,用于调试 delta-kernel 日志。#96763 (Kseniia Sumarokova). - 如果 Glue 元数据中未指定
metadata_location,现在会自动推断 Iceberg 表元数据的位置。#91994 (Andrey Zvonov). - Iceberg manifest 文件条目现在会解析 position delete file 名称的上下界,从而改进数据文件选择。#93980 (Daniil Ivanik).
- 为 Iceberg 表启用了
PREWHERE优化。#95476 (Konstantin Vedernikov). - Iceberg 表中的数据文件读取器和 position delete file 读取器现在共享线程和内存限制。#94701 (Yang Jiang).
- 新增对 Iceberg 表
ALTER TABLE RENAME COLUMN的支持。#97455 (murphy-4o). - 为数据湖新增对 Google Cloud Storage 的支持。#93866 (Konstantin Vedernikov).
- 配合 Unity Catalog 执行长时间查询时,S3 访问令牌现在会动态刷新。#95069 (Konstantin Vedernikov).
- 通过
aws_role_arn和aws_role_session_name设置,为 Glue catalog 新增了基于角色的访问控制支持。#90825 (Antonio Andelic).
S3Queue
- S3Queue 现在可在有序模式下跟踪 Hive 分区。 #81040 (Anton Ivashkin).
- 重构了 S3Queue 在有序模式下基于桶的处理逻辑,减少了 Keeper 请求数量并提升了性能。 #92889 (Kseniia Sumarokova).
- 为 S3Queue 的有序模式新增了更通用的分区支持。 #94321 (Bharat Nallan).
- 为有序模式下的 S3Queue 新增了基于分区键的分桶。 #94698 (Bharat Nallan).
- S3Queue 现已可通过
keeper_path设置支持辅助 ZooKeeper。 #95203 (Diego Nieto). - S3(Azure)Queue 现在会在有序模式下通过跟踪限制值来清理失败节点。 #94412 (Kseniia Sumarokova).
S3 和对象存储
- S3
x-amz-server-side-encryption请求头不再传递到HeadObject、UploadPart和CompleteMultipartUpload请求中。#64577 (Francisco J. Jurado Moreno). - 现在可以在命名集合中为 S3 表引擎和
s3表函数指定storage_class_name。#91926 (János Benjamin Antal). - 修复了在使用实例配置文件凭证运行大量并发 S3 查询时,EC2 元数据端点被限流的问题——现在会缓存凭证提供器,并在所有查询之间共享。#92891 (Sav).
- 为 AWS S3 C++ SDK 增加了对 MinIO 的兼容性支持,并添加了 MinIO 特有错误的错误码映射,从而提升了自托管 MinIO 集群的可靠性。#93082 (XiaoBinMu).
- 改进了 S3 身份验证错误消息,并增加了检查凭证的提示。#95648 (Gerald Latkovic).
- Azure Blob 存储现在会在原生复制因任意错误失败时回退为读写方式复制 (此前仅在 Unauthorized 时如此) 。#92888 (Smita Kulkarni).
函数
avg()现在支持将Date、DateTime和Time类型的值作为参数。#87845 (Yarik Briukhovetskyi).mapContainsKeyLike和mapContainsValueLike现在可以利用mapKeys()或mapValues()上的文本索引。#93049 (Michael Jarrett).flipCoordinates现在支持Geometry类型。#93303 (Bharat Nallan).- 已移除
hasAnyTokens和hasAllTokens函数的 64 标记限制。#95152 (Elmi Ahmadov). - 新增
distanceCosine作为cosineDistance的别名,与其他距离函数保持一致。#96065 (Raufs Dunamalijevs). - 已将
iif函数添加到 ClickHouse KQL 中。#94790 (happyso). use_variant_as_common_type现已默认启用,允许在Array、UNION查询以及if/multiIf/case分支中使用不兼容的类型。#90677 (Alexey Milovidov).
设置与配置
use_skip_indexes_on_data_read现已默认启用。#93407 (Shankar Iyer) 。- 新增了
add_minmax_index_for_time_columns设置——启用后,会自动为所有Date、Date32、Time、Time64、DateTime和DateTime64列创建 MinMax 索引。#93355 (Michael Jarrett) 。 - 新增了
materialize_statistics_on_merge设置 (默认启用) ,用于控制在合并期间是否将统计信息物化。#93379 (Han Fei) 。 - 新增了
input_format_binary_max_type_complexity设置,用于限制在二进制格式中可解码的类型节点总数,以防止恶意载荷。#92519 (Raufs Dunamalijevs) 。 - 添加了
trace_profile_events_list设置,用于将trace_profile_event的 tracing 限定为特定的事件名称。#92298 (Alexey Milovidov) 。 - 新增了
type_json_allow_duplicated_key_with_literal_and_nested_object设置,允许 JSON 中存在重复路径,其中一个是字面量,另一个是嵌套对象,以便与在强制执行路径去重之前创建的数据保持向后兼容。#93604 (Pavel Kruglov) 。 - 新增了 MergeTree 设置
merge_max_dynamic_subcolumns_in_compact_part和查询级设置max_dynamic_subcolumns_in_json_type_parsing,用于限制在合并和解析期间 JSON 列中的动态子列数量。#94184 (Pavel Kruglov). - 新增
use_statistics作为allow_statistics_optimize的别名,与use_primary_key和use_skip_indexes一致。#94366 (Robert Schulze) 。 - 启用
input_format_numbers_enum_on_conversion_error,用于在将数值转换为枚举时检查元素是否存在。#94384 (Elmi Ahmadov). - 新增了一个设置:当某个表存在行策略,但没有任何策略适用于当前用户时,将抛出异常,以便发现潜在的配置错误。#95014 (Vitaly Baranov).
- 对于 26.2 及更高兼容版本,
enable_max_bytes_limit_for_min_age_to_force_merge现已默认启用。#95917 (Christoph Wurm). core_dump.size_limit现已支持热重载,无需重启服务器。#96524 (Miсhael Stetsyuk) 。- 重新加载配置时,现在会正确应用命令行覆盖参数。#80295 (Alexey Milovidov) 。
- 为服务器日志增加了复合轮转策略 (大小 + 时间) 。#87620 (Jianmei Zhang) 。
- 现在可以根据 part 数量 (
distributed_index_analysis_min_parts_to_activate) 和索引大小 (distributed_index_analysis_min_indexes_size_to_activate) 来启用分布式索引分析。#95216 (Azat Khuzhin) 。 - 统计信息缓存现已默认启用,更新间隔为 300 秒。#95841 (Han Fei) 。
- 现在,
pathconfiguration parameter 会在启动时按相对于工作目录的方式解析,从而避免将数据目录放置在异常位置。#96305 (Alexey Milovidov).
系统表与监控
- 在
system.mutations中新增parts_postpone_reasons列,以提升诊断能力。#92206 (Shaohua Wang). - 在
system.data_skipping_indices中新增creation(implicit/explicit) 列。#92378 (Raúl Marín). - 运行中的任务现已反映在
system.background_schedule_pool及其对应的日志表中。#92587 (Azat Khuzhin). - 新增
QueryNonInternal指标,用于跟踪正在执行的非内部查询数量,帮助监控相对于max_concurrent_queries限制的并发情况。#94284 (Ashwath Singh). - 新增异步指标,用于记录运行时间最长的 merge 的耗时。#94825 (Raúl Marín).
- 在
query_log中新增connection_address和connection_port,以反映实际物理连接 (在通过 proxy 连接时特别有用) 。#95471 (Yakov Olkhovskiy). - 为
system.crash_log增加了更多信息。#94112 (Miсhael Stetsyuk). - 为
system.aggregated_zookeeper_log新增 component 名称。#95882 (Antonio Andelic). - 新增
system.tokenizers表,展示所有可用的分词器。#96753 (Robert Schulze). - 新增
system.jemalloc_stats表和/jemalloc.htmlHTTP 端点,用于交互式可视化 jemalloc 内存分配器的统计信息。#97077 (Antonio Andelic). - 新增
system.jemalloc_profile_text表,用于读取和分析 jemalloc 堆内存剖析,并支持 raw、symbolized 和 collapsed 输出格式。#97218 (Antonio Andelic). - 为
MUTATE_PART和MUTATE_PART_START事件向system.part_log新增mutation_ids。#93811 (Shaohua Wang). - 嵌套的全局 server settings (例如
logger.level) 现在可在system.server_settings中部分看到。#94001 (Hechem Selmi). view_duration_ms现在显示的是 group 处于活跃状态的时间,而不是各线程耗时之和。#94966 (Sema Checherinda).system.blob_storage_log现已可用于 Azure Blob 存储、Local 和 HDFS。新增error_code列。#93105 (Alexey Milovidov).- 耗时高于平均水平的后台任务现在会按可配置阈值记录到日志中 (
background_schedule_pool_log.duration_threshold_milliseconds,默认值为 30ms) 。#92965 (Azat Khuzhin). - URL 存储中的密码不再显示在查询日志中。#93245 (Konstantin Vedernikov).
ClickHouse Keeper
- 如果日志位于最后一个已提交索引之前,现可正确处理 Keeper 日志条目中的空缺。#90403 (Antonio Andelic).
- 为 Keeper 请求添加了 OpenTelemetry 链路追踪支持。#91332 (Miсhael Stetsyuk).
- 新增 Keeper 指标:
KeeperChangelogWrittenBytes、KeeperChangelogFileSyncMicroseconds、KeeperSnapshotWrittenBytes、KeeperSnapshotFileSyncMicroseconds、KeeperBatchSizeElements和KeeperBatchSizeBytes。#92149 (Miсhael Stetsyuk). CHECK_STAT和TRY_REMOVEKeeper 扩展现已默认启用。#93886 (Mikhail Artemenko).- Keeper 现在在检测到损坏的快照或不一致的更新日志时,会抛出异常而不是直接中止,从而通过要求手动干预来实现更安全的恢复。#94168 (Antonio Andelic).
- 为
getChildrenKeeper 请求添加了with_data和with_stat扩展,允许在一次操作中拉取子节点及其数据和统计信息。#94826 (Nikolay Degterinsky). - 增加了对 Keeper 配置错误的检查,此类错误可能导致集群组建失败。#94682 (Konstantin Bogdanov).
- 新增了对
with_dataKeeper 扩展的支持,以改进 Database Replicated 中的表拉取。#96090 (Nikolay Degterinsky). - 现在可以通过
system.zookeeper向辅助 ZooKeeper 写入数据。#92092 (RinChanNOW).
内存管理
- 优化了文件系统缓存空间预留——现在收集淘汰候选项时无需持有独占锁。#82764 (Kseniia Sumarokova) 。
- 为远程表引擎/函数的文件系统缓存读取缓冲区启用了并行读取。#71781 (Kseniia Sumarokova) 。
- 通过启用 jemalloc 脏页的即时清理,降低了非 Linux 系统上的内存占用。#93360 (Eduard Karacharov) 。
- jemalloc 脏页清理现在会在独立于主 MemoryWorker 线程的单独线程中运行。新增了
memory_worker_purge_total_memory_threshold_ratioconfig,用于根据总内存使用比例执行清理。#94902 (Antonio Andelic) 。 - 当 ClickHouse 持续处于内存压力下时,现在会动态禁用 jemalloc 脏页衰减。#95145 (Antonio Andelic) 。
- 在从 MergeTree 读取数据前增加了显式的内存消耗检查,并基于生产环境经验调低了线程池队列大小。#94692 (Nikita Mikhaylov) 。
- 现在会在用户身份验证前检查总内存限制;如果超出限制,则抛出
memory limit exceeded。#95003 (Nikolai Kochetov) 。 - 修复了查询 conditions 缓存的内存统计错误问题。#95478 (Nikita Mikhaylov) 。
- 提高了在聚合/排序过程中检测查询内存使用量以进行落盘的稳健性。#92500 (Azat Khuzhin) 。
- 调度器现在会在 CPU 资源匮乏时优先调度 MemoryWorker 线程,以保护进程。#94864 (Nikita Mikhaylov) 。
- 修复了 ClickHouse 在某些情况下从表读取时不遵守内存限制的问题。#93715 (Nikita Mikhaylov) 。
数据格式
- Parquet reader 现在允许将
Tuple或Map列读取为 JSON。#92864 (Michael Kolupaev). - Parquet reader 现在支持空元组。#92868 (Michael Kolupaev).
Date类型现在在 Arrow/ArrowStream 格式中会被序列化为 Arrow 原生的date32类型 (此前为uint16) 。旧行为可通过output_format_arrow_date_as_uint16设置恢复。#96860 (Alexey Milovidov).Hash输出格式现在不再受块大小影响。#94503 (Alexey Milovidov).- Pretty JSON 格式中的简单类型不再单独打印在不同的行上。#93836 (Pavel Kruglov).
- schema 推断现在会遵循
allow_experimental_nullable_tuple_type——启用后,缺失的嵌套对象可以变为NULL,而不是变成由NULL元素组成的元组。#95525 (Nihal Z. Miaji). - SQL 格式化器现在会在
AS SELECT之前输出COMMENT,而不是用括号将SELECT包裹起来。#96293 (Alexey Milovidov). - 使用 simdcomp 优化了倒排列表压缩。#92871 (Peng Jian).
备份与恢复
- 新增
backup_data_from_refreshable_materialized_view_targets备份设置,用于控制是否备份可刷新materialized view目标中的数据。采用APPEND刷新策略的 RMV 目标始终会被备份。#93658 (Julia Kartseva). - 为 S3 和 Azure Blob 存储中的
BACKUP/RESTORE新增了对通过 SQL 定义的命名集合的支持。#94605 (Pablo Marcos).
命名集合和字典
- 现在允许在 MongoDB 表函数中对命名集合参数进行覆盖。#89616 (vanchaklar).
- 现已为 YTsaurus 字典和表启用命名集合。#94582 (MikhailBurdukov).
- 现在可为 YTsaurus 动态表字典源传入列描述。#92391 (MikhailBurdukov).
- 现在在显式指定时会显示参数化视图的 schema。#90220 (Grigorii Sokolik).
去重
- 已重构
insert_select_deduplicate设置,新增向后兼容选项。#92951 (Sema Checherinda). - 现在,在涉及 materialized views 时,也允许异步插入进行去重。#93957 (Sema Checherinda).
其他改进
- 改进了
SYSTEM INSTRUMENT ADD/REMOVE的使用体验:现在函数名使用字符串字面量,所有匹配的函数都会被修补,且REMOVE现已支持function_name。#93345 (Pablo Marcos). - 为可暂停的 failpoint 新增了
SYSTEM NOTIFY FAILPOINT,并为 PAUSE/RESUME 新增了SYSTEM WAIT FAILPOINT。#92368 (Shaohua Wang). system.trace_log、system.symbols以及demangle函数中的 C++ 函数名现在都能正确显示。#93075 (Alexey Milovidov).- jemalloc profile 现在会连同符号信息一起写出,因此生成堆内存剖析时不再需要 binary。#93099 (Azat Khuzhin).
- 修复了将表 Attach 到
MaterializedPostgreSQLdatabase 时,如果dropReplicationSlot在栈展开期间 throw 会导致崩溃的问题。#96871 (Alexey Milovidov). - 修复了
CREATE TABLE失败时可能留下残留内容的问题。#94174 (Azat Khuzhin). - 修复了使用受密码保护的 TLS key 时访问未初始化内存的问题。#94182 (Konstantin Bogdanov).
- 当
alter table ... modify setting ...在获取锁时发生 timeout,现在会返回 timeout error,而不是 logical error。#93856 (Han Fei). - 改进了 CPU 和 real-time profiler 在套接字 timeout 场景下的互操作性。#96601 (Sergei Trifonov).
- 为 release 构建启用了快速 libcxx 加固 (主要是越界检查) ,且没有明显的性能影响。#94757 (Miсhael Stetsyuk).
性能提升
JOIN 性能
- 通过为
ColumnVector::replicate实现动态分派,加快了部分哈希 JOIN 操作。 #79573 (Raúl Marín). - 现在可将更多过滤器下推到 JOIN 中。 #85556 (Nikita Taranov).
- 扩展了基于 JOIN
ON条件的过滤器下推:当过滤器仅使用单侧输入时,适用于ANY、SEMI和ANTIJOIN。 #92584 (Dmitry Novik). - 现在可利用等价集为
SEMI JOIN下推过滤器。 #92837 (Dmitry Novik). - 在
ParallelHashJoin中,对复杂谓词下未匹配行的处理已实现并行化,由parallel_non_joined_rows_processing设置控制 (默认启用) 。 #92068 (Yarik Briukhovetskyi). - 当右侧为空时,哈希 JOIN 现在会完全跳过读取左侧,从而避免因大量过滤或聚合造成的不必要开销。 #94062 (Alexander Gololobov).
RIGHT OUTERJOIN 现已支持 JOIN 运行时过滤器。 #96183 (Hechem Selmi).- PREWHERE optimization 现会推迟到 JOIN 运行时过滤器优化之后再执行,从而也能将运行时过滤器下推到 PREWHERE。 #95838 (Alexander Gololobov).
查询优化
- 当分区键与排序键相同或为其前缀时,已禁用窗口函数的排序顺序优化,以提升并行执行性能。#87299 (Nikita Taranov).
- 现在会将外层过滤器下推到视图中,使 PREWHERE 可同时应用于本地节点和远程节点。#88316 (Igor Nikonov).
- 优化了带小数的
LIMIT和OFFSET的性能和内存使用。#91167 (Ahmed Gouda). - 不再重复计算虚拟列上的常量过滤器。#91588 (c-end).
- 主键中的任何确定性表达式 (例如
ORDER BY cityHash64(user_id)) 现在都可用于数据跳过。ClickHouse 会将该表达式应用于查询常量,并将结果用于通过=、IN和has进行主键索引查找。对于单射表达式,还支持其取反形式 (!=、NOT IN、NOT has) 。#92952 (Nihal Z. Miaji). - 按序读取优化现在可以识别因
WHERE条件而变为常量的ORDER BY列,从而实现高效的逆序读取。这让WHERE tenant='42' ORDER BY tenant, event_time DESC这类多租户查询也能从中受益。#94103 (matanper). - 对于先使用主键条件、再使用跳过索引的
FINAL查询,PrimaryKeyExpand步骤现在只会检查初步筛选出的主键范围。#94903 (Shankar Iyer). - 惰性物化优化现已应用于
UNION ALL查询的所有分支,而不再仅限于第一个分支,从而减少了这类查询的 I/O;这类查询会组合来自不同 MergeTree 表的多次已排序且带限制的读取。#96832 (Federico Ginosa).
函数与聚合性能
- JIT 编译现已覆盖更多函数。#88770 (Alexey Milovidov).
- 优化了
distinctJSONPaths聚合函数,现在只会从数据分区片段中读取 JSON 路径,而不是整个 JSON 列。#92196 (Pavel Kruglov). - 在相同元素经常连续出现的情况下,优化了
uniqExact。#93268 (Alexey Milovidov). - 针对全 ASCII 的输入值优化了
isValidASCII。#93347 (Robert Schulze). - 在可能的情况下,通过对插入操作进行批处理,加快了
uniq在数值类型上的执行速度 (非 NULL、非-If、无GROUP BY、无IPv6或String) 。#95904 (Raúl Marín).
存储与 I/O 性能
- 修复了 Parquet Reader V3 Prefetcher,使其采用更快的随机读取逻辑。#91435 (Arsen Muk).
- 提升了
icebergCluster的性能。#91537 (Yang Jiang). - 通过启用自适应写入缓冲区,降低了带有 Wide parts 的超宽表在
INSERT和 merge 时的内存使用量。同时还为加密 disk 增加了自适应写入缓冲区支持。#92250 (Azat Khuzhin). - 通过减少需要搜索的标记数量,提升了文本索引与
sparseGrams分词器的全文检索性能。#93078 (Anton Popov). - 在 x86 上通过动态分派加速了 T64 codec 压缩。#95881 (Raúl Marín).
- 加速了 x86 上 32 字节块的 LZ4 解压缩。#96778 (Raúl Marín).
- 文本索引的直接读取优化现已可部分生效——带有 materialized 文本索引的 parts 将使用该索引,而没有该索引的 parts 则回退到原始过滤表达式。#96411 (Anton Popov).
- 在
INSERT期间,通过移除一次不必要的数据拷贝,并为数值列启用向量化的最小/最大值计算,优化了 minmax 跳过索引的计算。#97392 (Raúl Marín). - 在系统日志表的时间列上新增了
minmax次级索引,并在query_id/initial_query_id列上新增了bloom_filter索引,以加快过滤速度。#96712 (Alexey Milovidov). - 避免了在未启用去重时,
INSERT出现内存使用量回归的问题。#96503 (Alexey Milovidov).
内存优化
- 在未启用高亮和
VALUES解析时,移除未使用字段,从而降低了ASTLiteral的内存占用。#93974 (Ilya Yatsishin) 。 - 引入了专用的 Enum AST 类,将值参数存储为字符串/整数对,而非通用的
ASTLiteral子节点,以减少内存占用。#94178 (Ilya Yatsishin) 。 - 通过将列名直接存储为字符串,而不是存放在通用 AST 字面量节点中,优化了命名元组 AST 对象的内存占用。#94704 (Ilya Yatsishin) 。
- 将
CachedOnDiskReadBufferFromFile结构的大小缩小了约 50 倍。#96098 (Azat Khuzhin) 。 - 当表为空时,
HashTable::resize不再复制旧数据。#96180 (Raúl Marín) 。
内部优化
- 在查询管道内对数据分区时采用了 “fastrange” (Daniel Lemire) 方法,提升了并行排序和 JOIN 操作的性能。#93080 (Alexey Milovidov) 。
- 通过添加额外的链接器选项,改进了去虚拟化效果。#94737 (Nikita Taranov) 。
- 通过对 ZooKeeper 请求进行批次处理,提升了包含大量 parts 的
ReplicatedMergeTree表的副本克隆性能。#94847 (c-end) 。 - 通过改用更快的哈希和无锁计数器,将
observeOperations中 ZooKeeper 接收线程的 CPU 占用降低了 20% 以上。#95962 (Miсhael Stetsyuk) 。
缺陷修复
全部缺陷修复(点击展开)
全部缺陷修复(点击展开)