本文介绍云数据库ClickHouse25.10企业版发布的功能详情。
重要变更
添加对在云数据库ClickHouse中查询Apache Paimon的支持。
JOIN性能优化。
查询性能优化(parallel replicas支持从projection读取、Query Condition Cache优化等)。
非兼容变更
数据格式和schema变更
更改默认的
schema_inference_make_columns_nullable设置,以遵守Parquet/ORC/Arrow元数据中的列Nullable信息,而不是将所有内容都设为Nullable。文本格式没有变化。默认情况下禁用在JSON格式中对64位整数加引号。
在JSON中推断不同类型值的数组时,使用
Array(Dynamic)而不是未命名的Tuple。要使用之前的行为,请禁用设置input_format_json_infer_array_of_dynamic_from_array_of_different_types。默认情况下,在Parquet输出格式中将
Enum类型的值写入为带有ENUM逻辑类型的BYTE_ARRAY。
查询和函数变更
Query result cache忽略
log_comment设置,因此仅更改查询的log_comment不再强制cache miss。如果用户有意通过改变log_comment来分段缓存,此更改会改变该行为,因此向后不兼容。请使用设置query_cache_tag来实现此目的。在之前的版本中,与运算符实现函数同名的表函数的查询格式不一致。
EXPLAIN SYNTAX查询将不会格式化运算符,新行为更好地反映了解释语法的目的。clickhouse-format、formatQuery等工具在查询以函数形式包含它们时,不会将函数格式化为运算符。禁用IPv4/IPv6的无意义二进制操作:禁用IPv4/IPv6与非整数类型的加/减运算。之前它允许与浮点类型的操作,并对某些其他类型(如DateTime)抛出逻辑错误。
将函数
searchAny和searchAll重命名为hasAnyTokens和hasAllTokens,以便与现有函数hasToken更好地保持一致。
数据类型变更
禁止在JOIN键中使用Dynamic类型。当Dynamic类型与非Dynamic类型比较时可能导致意外结果。建议将Dynamic列转换为所需类型。
存储和索引变更
弃用设置
allow_dynamic_metadata_for_data_lakes。现在所有Iceberg表在执行每个查询之前都会尝试从存储中获取最新的表schema。倒排文本索引从头开始重新设计,以便能够扩展到不适合RAM的数据集。
storage_metadata_write_full_object_key服务器设置默认开启,且不能再关闭。从filesystem cache中删除
cache_hits_threshold。cache_hits_threshold是在添加SLRU缓存策略之前添加的,不需要同时支持两者。添加对hive分区样式写入的支持并重构读取实现(hive分区列不再是虚拟列)。
默认启用MergeTree设置
write_marks_for_substreams_in_compact_parts。这显著提升了从新创建的Compact部分读取子列的性能。版本低于25.5的服务器将无法读取新的Compact部分。禁止在SummingMergeTree中对明确列出的求和列执行
RENAME COLUMN或DROP COLUMN操作。
设置和配置变更
将
replicated_deduplication_window_seconds从1周减少到1小时,以便在插入率较低时在zookeeper上存储更少的znode。将设置
query_plan_use_new_logical_join_step重命名为query_plan_use_logical_join_step。新语法允许tokenizer参数更具表现力。
min_free_disk_ratio_to_perform_insert和min_free_disk_bytes_to_perform_insert设置的两个细微变化:使用未保留的字节而不是可用字节来确定是否应拒绝插入。这在后台合并和mutation的保留相对于配置的阈值较小时可能不重要,但似乎更正确。不要将这些设置应用于系统表。理由是我们仍然希望像query_log这样的表被更新。这对调试有很大帮助。写入系统表的数据通常比实际数据小,因此在合理的min_free_disk_ratio_to_perform_insert阈值下它们应该能够持续更长时间。
Keeper变更
为Keeper的内部复制启用async模式。Keeper将保持与以前相同的行为,并可能提高性能。如果您从23.9之前的版本更新,需要先更新到23.9以上版本,然后再更新到25.10以上版本。您也可以在更新前将keeper_server.coordination_settings.async_replication设置为0,并在更新完成后启用它。
新特性
函数
添加
naiveBayesClassifier函数,使用基于ngrams的Naive Bayes对文本进行分类。添加函数
arrayExcept,将一个数组作为集合从另一个数组中减去。新增
conv函数用于在不同进制之间转换数字,当前支持2-36进制。添加
studentTTestOneSample聚合函数。添加
isValidASCII函数来检查字符串是否只包含ASCII字符。聚合函数
timeSeriesChangesToGrid和timeSeriesResetsToGrid。行为类似于timeSeriesRateToGrid,接受开始时间戳、结束时间戳、步长和回看窗口的参数,以及时间戳和值的两个参数,但每个窗口至少需要1个样本而不是2个。计算PromQL的changes/resets,计算在由参数定义的时间网格中每个时间戳的指定窗口内样本值变化或减少的次数。返回类型是Array(Nullable(Float64))。聚合函数
quantilePrometheusHistogram,接受直方图bucket的上界和累积值作为参数,并在找到分位数位置的bucket的上界和下界之间执行线性插值。行为类似于经典直方图上的PromQLhistogram_quantile()函数。添加了
startsWith和endsWith函数的优化不区分大小写变体:startsWithCaseInsensitive、endsWithCaseInsensitive、startsWithCaseInsensitiveUTF8和endsWithCaseInsensitiveUTF8。为
extractKeyValuePairs函数引入新参数unexpected_quoting_character_strategy,用于控制意外遇到quoting_character时的处理方式。之前,函数
countMatches会在第一个空匹配处停止计数,即使模式接受它。为了解决这个问题,countMatches现在在发生空匹配时通过前进一个字符来继续执行。希望保留旧行为的用户可以启用设置count_matches_stop_at_empty_match。
系统表
添加新系统表
database_replicas,包含有关数据库副本的信息。添加新的
system.aggregated_zookeeper_log表。该表包含按session id、父路径和操作类型分组的ZooKeeper操作的统计信息(例如操作数、平均延迟、错误),并定期刷新到磁盘。添加系统表
iceberg_metadata_log以在SELECT语句期间检索Iceberg元数据文件。为
system.warnings表添加cpu和memory的警告。Delta lake元数据文件的系统表。
添加新系统表
system.dead_letter_queue以保存来自Kafka等引擎的错误传入消息。添加
system.zookeeper_connection_log系统表以存储有关ZooKeeper连接的历史信息。添加了新的系统表
system.codecs以查看可用的codec。引入
system.completions表。
表引擎和存储
支持表引擎Alias。
现在可以通过为NATS引擎指定新设置
nats_stream和nats_consumer来使用NATS JetStream消费消息。Iceberg和delta lake表使用磁盘配置。这允许使用现有磁盘指定用户表。添加设置
allowed_disks_for_table_engines,允许特定磁盘用于Iceberg。示例:CREATE TABLE test ENGINE = Iceberg('path/inside/disk') SETTING datalake_disk_name = '<some_user_disk>';。添加新表设置
min_level_for_wide_part,允许指定将part创建为wide part的最小级别。所有表均支持
_table虚拟列,不仅仅是Merge类型表。为类型为
Float32和Float64的列添加SZ3作为有损但有误差界限的压缩codec。添加了对
MergeTree系列表的轻量级更新支持。轻量级更新可以通过新语法使用:UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>。通过轻量级更新添加了轻量级删除的实现,可以通过设置lightweight_delete_mode = 'lightweight_update'启用。在MergeTree系列表中支持
_part_granule_offset虚拟列。该列指示每行在其数据部分内所属的granule/mark的从零开始的索引。
Iceberg和data lakes
添加对在云数据库ClickHouse中查询Apache Paimon的支持。此集成将使云数据库ClickHouse用户能够直接与Paimon的data lake存储交互。
Iceberg表引擎的
ALTER UPDATE。在Iceberg schema演化中支持复杂类型。
为
insert查询引入Iceberg写入功能。支持Iceberg表引擎的位置删除。
通过字段ID读取Iceberg数据文件。
Iceberg写入用于create。
Glue catalog的写入支持。
Iceberg Rest catalog的写入支持。
将所有iceberg位置删除文件合并到数据文件中。这将减少iceberg存储中parquet文件的数量和大小。语法:
OPTIMIZE TABLE table_name。支持Iceberg的
DROP TABLE(从REST/Glue catalog中删除+删除表的元数据)。支持Iceberg以merge-on-read格式的
ALTER DELETEmutation。支持写入DeltaLake。
在元数据(manifest条目)中写入更多Iceberg统计信息(列大小、下限和上限)以进行min-max修剪。
支持为简单类型在Iceberg中添加/删除/修改列。
索引和统计
新的
sparse_gram bloom filter索引,用于查找长子字符串。添加了在
MergeTree表中的所有合适列上自动创建统计信息的能力。添加了表级设置auto_statistics_types,存储要创建的统计信息类型的逗号分隔列表(例如auto_statistics_types = 'minmax, uniq, countmin')。
SQL和查询功能
添加
LIMIT BY ALL语法支持。类似于GROUP BY ALL和ORDER BY ALL,LIMIT BY ALL会自动扩展以使用SELECT子句中的所有非聚合表达式作为LIMIT BY键。例如,SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY ALL等同于SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY id, name。此功能简化了当您想要按所有选定的非聚合列进行限制而无需显式列出它们时的查询。在查询设置中将裸设置名称视为等于
1(例如SELECT ... SETTINGS use_query_cache等同于use_query_cache = 1)。允许用户使用与临时表相同的语法创建临时视图。
添加对负数
LIMIT和负数OFFSET的支持。支持
DESCRIBE SELECT而不仅仅是DESCRIBE (SELECT ...)。支持编写
USE DATABASE {name}。为parallel replicas实现了从projection读取。添加了新设置
parallel_replicas_support_projection来控制是否启用projection支持。为了简化实现,仅在parallel_replicas_local_plan处于活动状态时才启用projection支持。
服务器配置和工作负载管理
新配置选项:
logger.startupLevel和logger.shutdownLevel允许在云数据库ClickHouse启动和关闭期间分别覆盖日志级别。添加了一种方法,使用服务器配置“resources_and_workloads”部分在SQL中提供
WORKLOAD和RESOURCE定义。服务器设置
cpu_slot_preemption为工作负载启用抢占式CPU调度,并确保工作负载之间CPU时间的max-min公平分配。添加了用于CPU限流的新工作负载设置:max_cpus、max_cpu_share和max_burst_cpu_seconds。现在支持工作负载设置
max_waiting_queries。它可用于限制查询队列的大小。如果达到限制,所有后续查询将以SERVER_OVERLOADED错误终止。在配置的查询数或时间阈值后断开TCP连接。
系统命令
添加
SYSTEM RECONNECT ZOOKEEPER命令以强制zookeeper断开连接并重新连接。通过设置
max_named_collection_num_to_warn和max_named_collection_num_to_throw限制命名集合的数量。添加新指标NamedCollection和错误TOO_MANY_NAMED_COLLECTIONS。
Keeper
在Keeper客户端中添加cp-cpr和mv-mvr命令的递归变体。
协议和客户端支持
通过添加
arrowflight表引擎实现对ArrowFlight RPC协议的支持。添加PostgreSQL协议
COPY命令支持。支持mysql协议的C#客户端。
为
mysql_port和postgresql_port强制使用安全连接。
格式
添加
format_schema_source设置,定义format_schema的来源。添加
Hash作为新的输出格式。它为结果的所有列和行计算单个哈希值。这对于计算结果的“指纹”很有用,例如在数据传输成为瓶颈的用例中。
实验性功能
函数
searchAll和searchAny可以在没有文本列的列之上工作。在这些情况下,它们使用默认tokenizer。实现
QBit数据类型,以bit-sliced格式存储向量,以及L2DistanceTransposed函数,允许通过参数控制精度-速度权衡的近似向量搜索。添加Ytsaurus表引擎和表函数。
添加函数
searchAny和searchAll,这些是搜索文本索引的通用工具。文本索引现在支持
stringtokenizer。将
text索引的默认索引粒度值更改为64。
性能优化
查询执行和优化
通过重构Query Condition Cache (QCC)与索引分析的顺序和集成来改进查询性能。QCC过滤现在在主键和skip索引分析之前应用,减少了不必要的索引计算。索引分析已扩展以支持多个范围过滤器,其过滤结果现在存储回QCC。这显著加快了索引分析主导执行时间的查询——特别是依赖skip索引(例如vector或inverted索引)的查询。
一系列微优化以加速小查询。
在native协议中压缩日志和profile事件。在具有100+个副本的集群上,未压缩的profile事件占用1~10 MB/秒,在慢速互联网连接上进度条会很慢。
改进
func(primary_column) = 'xx'和column in (xxx)等条件的pre where优化。避免使用
uuid过滤器对system.tables进行全扫描(如果您只有来自日志或zookeeper路径的UUID,这可能很有用)。对
-If聚合函数组合器进行了简单优化。添加了新逻辑(由设置
enable_producing_buckets_out_of_order_in_aggregation控制,默认启用),允许在内存高效聚合期间无序发送一些bucket。使
TOTALS步骤之后的pipeline多线程化。当聚合查询仅包含对
NOT NULL列的单个COUNT()函数时,在哈希表探测期间完全内联聚合逻辑。当通过多个string或number列进行group by时,按列计算序列化键。
为
-If组合器实现addManyDefaults。
JOIN优化
提供了关于下推析取JOIN谓词的逻辑。
实现了JOIN重写:
如果过滤条件对匹配或非匹配行始终为false,则将
LEFT ANY JOIN和RIGHT ANY JOIN转换为SEMI/ANTIJOIN。此优化由新设置query_plan_convert_any_join_to_semi_or_anti_join控制。如果过滤条件对一侧的非匹配行始终为false,则将
FULL ALL JOIN转换为LEFT ALL或RIGHT ALLJOIN。
在具有大量不匹配行的
LEFT/RIGHTjoin情况下,HashJoin性能略有优化。Join重排序现在使用统计信息。可以通过设置
allow_statistics_optimize = 1和query_plan_optimize_join_order_limit = 10来启用该功能。在join优化期间跳过运行时哈希表统计信息重新计算。添加了新的profile事件
JoinOptimizeMicroseconds和QueryPlanOptimizeMicroseconds。在某些情况下,为了稍微更好的join性能,内联
AddedColumns::appendFromBlock。添加新设置
min_joined_block_size_rows(类似于min_joined_block_size_bytes;默认为65409)以控制JOIN输入和输出块的最小块大小(以行为单位)(如果join算法支持)。通过在只有一个键列的典型情况下删除对哈希映射的额外循环来优化
HashJoin的性能。来自具有多个析取的JOIN情况应用了
null_map和JoinMask的优化。对于join标志使用普通的
std::vector<std::atomic_bool>。在哈希JOIN主循环之外处理
max_joined_block_rows。当
HashJoin使用lazy输出模式时,不要提前为结果列预分配内存。如果右侧由join键列在功能上确定,所有
LEFT/INNERJOIN将自动转换为RightAny。改进了在
Join模式下应用patch部分的性能。
字符串和函数优化
通过使用StringZilla库(在可用时使用SIMD CPU指令)改进大小写敏感字符串搜索的性能(例如过滤操作,如
WHERE URL LIKE '%google%')。通过使用新的默认设置
optimize_rewrite_like_perfect_affix改进带前缀或后缀的LIKE的性能。改进了函数
tokens、hasAllTokens、hasAnyTokens的性能。
MergeTree和存储优化
为MergeTree表中的顶级String列添加可选的
.size子列序列化,以改进压缩并启用高效的子列访问。当表具有类型为
SimpleAggregateFunction(anyLast)的列时,使用FINAL从聚合合并树表中选择时减少内存分配和内存复制。改进了执行轻量级删除后垂直合并的性能。
通过优化
MarkRanges(使用devector代替deque)改进了表中有大量part的快速查询的性能。为MergeTreeLazy读取器启用在缓存中保存marks并避免直接IO。
具有
is_deleted列的ReplacingMergeTree表上带有FINAL子句的SELECT查询现在执行得更快,因为从2个现有优化改进了并行化。
聚合和GROUP BY优化
修复在通过多个string/number列进行分组时由大序列化键引起的性能下降。
RadixSort:帮助编译器使用SIMD,CPU更好地进行预取。
分布式查询改进
引入了一个选项,将块的(反)压缩和(反)序列化卸载到pipeline线程中,而不是与网络连接关联的单个线程。
在每个分片上独立执行
INSERT SELECT的模式下,默认启用并行分布式INSERT SELECT。在native协议中压缩日志和profile事件。
修复了parallel replicas的最小任务大小计算。
索引改进
改进了为主要包含非频繁token的文档构建文本索引的性能。
由于减少了存储读取和CPU使用,使用向量相似性索引的向量搜索查询以更低的延迟完成。
在
filterPartsByQueryConditionCache中遵守merge_tree_min_{rows,bytes}_for_seek。首先处理更高粒度的min-max索引。
bloom filter索引现在用于
has([c1, c2, ...], column)等条件。按文件大小递增顺序处理索引。
之前,文本索引数据将被分成多个段(每个段大小默认为256 MiB)。
子查询优化
通过使用等价类删除冗余的
JOIN操作,优化相关子查询的生成计划。当相关子查询作为函数
EXISTS的参数出现时,仅读取所需的列。
存储引擎改进
修复Redis和KeeperMap存储的按键过滤。
ATTACH PARTITION不再导致所有缓存被删除。避免在创建存储快照数据时持有锁。
删除临时部分可能需要一段时间(特别是对于S3)。
格式改进
新的parquet阅读器实现。它通常更快,支持页面级过滤器下推和
PREWHERE。通过在没有解析错误时重用序列化器,改进了ProtobufSingle输入格式的性能。
数据类型和序列化优化
通过为MergeTree中的
JSON共享数据实现新的序列化,显著提高了从MergeTree读取JSON子列的性能。通过简化代码优化字符串反序列化。
Pipeline和执行改进
在pipeline构建期间最小化端口头中的内存复制。
改进pipeline构建的性能。
优化MergeTreeReadersChain::getSampleBlock。
在我们只进行此实体化以返回单行的情况下,优化常量的实体化。
内存和资源优化
调整一些jemalloc配置以提高性能。
在ProfileEvents的Counter中添加对齐以减少false sharing。
减少CompressedReadBufferBase::readCompressedData中不必要的memcpy调用。
改进
查询优化和执行
mannWhitneyUTest在两个样本都只包含相同值时不再抛出异常。添加了实验性的join顺序优化,可以自动重新排序JOIN以获得更好的性能(由
query_plan_optimize_join_order_limit设置控制)。支持在读取期间使用skip索引过滤数据部分以减少不必要的索引读取。
重写磁盘对象存储事务在元数据事务提交时删除先前的远程blob。
使S3重试策略可配置。
修复了当优化前后结果类型的LowCardinality不同时冗余相等表达式的优化pass。
特殊列可用于指示oneof部分的存在。
当为新Kafka表引擎指定不正确的设置时,现在会向用户提供更清晰的说明。
当HTTP客户端除了
Expect: 100-continue之外还设置标头X-ClickHouse-100-Continue: defer时,云数据库ClickHouse在配额验证通过之前不会向客户端发送100 Continue响应。不再可能为Time类型指定时区。
通过使用
system.completions而不是发出多个系统表查询,客户端自动完成更快、更一致。简化(并避免了一些错误)与以
best_effort格式解析Time[64]相关的逻辑。通过在运行时从右子树构建bloom过滤器并将此过滤器传递给左子树中的扫描来加速某些JOIN查询。
创建物化视图时可以在
TO之后使用查询参数。使用S3存储的DATABASE ENGINE = Backup时在日志中掩码S3凭据。
更新jemalloc到更新版本。改进基于jemalloc内部工具的分配分析。
添加deltaLakeAzureCluster函数(类似于cluster的deltaLakeAzure)和deltaLakeS3Cluster(deltaLakeCluster的别名)函数。
重命名InterpreterSystemQuery::dropReplicaImpl为InterpreterSystemQuery::dropStorageReplica。
修复包含
materialize函数的TTL的不一致格式化。在S3对象存储中遇到可重试错误时减慢S3客户端线程。
将设置allow_experimental_variant/dynamic/json和enable_variant/dynamic/json标记为过时。现在无条件启用所有三种类型。
改进S3(Azure)Queue表引擎,使其能够在不出现潜在重复的情况下在zookeeper连接丢失后存活。
Iceberg表状态不再存储在存储对象中。
添加设置
query_condition_cache_selectivity_threshold(默认值:1.0),将低选择性谓词的扫描结果排除在插入查询条件缓存之外。在
http_handlers中支持按完整URL字符串(full_url指令)过滤(包括schema和host:port)。为Delta Lake写入功能添加实验性设置
allow_experimental_delta_lake_writes,默认禁用。修复init.d脚本中systemd的检测(修复“Install packages”检查)。
添加新的
startup_scripts_failure_reason维度指标。Iceberg写入中的多个数据文件。
Iceberg写入中分区的更多类型。
允许为Iceberg表的分区省略
identity()函数。添加仅为特定channel启用JSON日志记录的能力。
为Delta Lake中插入的数据文件添加行/字节限制。
允许在
WHERE中使用native数字。修复对具有损坏元数据的Catalog执行
SYSTEM DROP REPLICA时的错误。将设置
evaluation_time重命名为promql_evaluation_time。Iceberg drop中删除文件的设置。
减少Iceberg写入中的内存使用。
使
today()函数不区分大小写。使
timeSeries*()函数中的staleness窗口左开右闭。添加
FailedInternal*Queryprofile事件。在S3Queue有序模式下使bucket锁成为持久模式。
修复通过配置文件添加时名称中带点的用户的处理。
为查询中的内存使用添加异步指标(
QueriesMemoryUsage和QueriesPeakMemoryUsage)。可以使用
clickhouse-benchmark --precise标志进行更精确的QPS和其他每间隔指标报告。修复误导性的“specified upload does not exist”错误。
限制
EXPLAIN查询中的查询计划描述。添加调整待处理信号的能力。
Data lakes的分布式insert/select。
改进Keeper中RemoveRecursive请求的性能。
在JSON类型输出期间删除PrettyJSONEachRow中的额外空格。
将复制去重窗口增加到10000。
现在我们为plain rewriteable磁盘在删除目录时写入
prefix.path的blob大小。使
yesterday()函数不区分大小写。支持针对远程ClickHouse实例(包括ClickHouse Cloud)的
.xml性能测试。在已知会分配大量内存(>16MiB)的某些地方尊重内存限制。
防止非布尔设置在查询中不设置值。
支持格式名称的提示。
当没有projection时,远程副本跳过索引分析。
如果设置
network_compression_method不是支持的通用codec,则抛出异常。系统表
system.query_cache现在返回所有查询结果缓存条目。在
arrowFlight()表函数中添加对身份验证和SSL的支持。为
S3表引擎和s3表函数添加新参数storage_class_name。允许为ytsaurus表禁用utf8编码。
支持data lakes磁盘的Azure。
添加新的
dictionary_block_frontcoding_compression文本索引参数。为parseDateTime函数启用短路求值。
支持
alter table ... materialize statistics all将实体化表的所有统计信息。默认禁用
s3_slow_all_threads_after_retryable_error。添加新的
system.aggregated_zookeeper_log表。将表函数
arrowflight重命名为arrowFlight。更新
clickhouse-benchmark以接受在cli标志中使用-代替_。添加会话设置以从插入时的实体化中排除skip索引列表。
使刷新到
system.crash_log的信号处理同步。在system.parts_columns中添加新列
statistics。添加设置
inject_random_order_for_select_without_order_by。在Iceberg写入中支持其他格式(ORC、Avro)。
改进joinGet错误消息。
根据设置从所有线程压缩数据后再插入到物化视图。
此patch添加了在写入tx期间检查任意Keeper节点stat的能力。
将繁重的ytsaurus请求重定向到繁重的代理。
此patch修复了unlink/rename/removeRecursive/removeDirectory等操作的回滚。
添加了
keeper_server.tcp_nodelay配置参数。在
clickhouse-benchmarks中支持--connection。现在设置
max_insert_threads将对Iceberg表生效。为
PrometheusMetricsWriter添加直方图和维度指标。函数
hasToken现在对空token返回零匹配。为
Array和Map(mapKeys和mapValues)值添加文本索引支持。添加新的
ZooKeeperSessionExpired指标。为服务器端(native)复制到备份目标使用具有备份特定设置的S3存储客户端。
修复在使用实验性
make_distributed_plan进行查询计划序列化期间对设置max_joined_block_size_rows和max_joined_block_size_bytes的不正确处理。设置
enable_http_compression现在是默认的。添加了新设置
keeper_hosts。添加
ALTER TABLE REWRITE PARTS。为系统仪表板添加
from和to值。为Iceberg SELECT中的性能跟踪添加更多信息。
添加新的
joined_block_split_single_row设置。文件系统缓存改进:在并发保留缓存空间的线程之间重用缓存优先级迭代器。
添加限制
Keeper请求的能力。修复
clickhouse-benchmark,默认情况下不在错误消息中包含堆栈跟踪。当marks在缓存中时,避免使用线程池异步marks加载。
Ytsaurus:允许使用列子集创建table/table functions/dictionaries。
从现在开始,
system.zookeeper_connection_log默认启用。使TCP和HTTP行为在传递重复外部表时保持一致。
删除用于读取Arrow/ORC/Parquet的自定义MemoryPools。
允许创建不带参数的
Replicated数据库。添加对连接到clickhouse-keeper的tls端口的支持。
添加了新的profile事件来跟踪由于超出内存限制而拒绝后台合并的次数。
为
generateSerialID函数添加可选的start_value参数。为CREATE/ALTER TABLE列默认表达式验证启用analyzer。
内部查询计划改进:对
CROSS JOIN使用JoinStepLogical。完全支持运算符
IS NOT DISTINCT FROM(<=>)。默认启用全局采样分析器。
修复了对具有
Alias引擎的表的EXCHANGE TABLES操作的支持。添加设置
temporary_files_buffer_size。添加了对使用parallel replicas直接从文本索引读取的支持。
现在函数
generateSerialID支持具有系列名称的非常量参数。用于分布式处理的Datalakes catalogs数据库。
使函数lag不区分大小写以与MySQL兼容。
添加配置
keeper_server.coordination_settings.check_node_acl_on_remove。使用
Vertical格式时,JSON列现在会美化打印。将
clickhouse-client文件(例如查询历史)存储在XDG Base Directories规范描述的位置。修复由于
GLOBAL IN导致的内存泄露。为hasAny/hasAllTokens添加重载以接受字符串输入。
在此patch之后,启发式
to_remove_small_parts_at_right将在计算合并范围分数之前执行。为
clickhouse-keeper的postinstall脚本添加步骤。仅在粘贴时在Web UI中检查凭据。
违反约束时限制异常消息长度。
bug修复
查询执行修复
对于复制数据库和内部复制表,ALTER查询的结果仅在发起者节点上验证。这将修复已提交的ALTER查询可能在其他节点上卡住的情况。
限制
BackgroundSchedulePool中每种类型任务的数量。避免所有槽位被一种类型的任务占用而其他任务饿死的情况。也避免任务相互等待时的死锁。这由background_schedule_pool_max_parallel_tasks_per_type_ratio服务器设置控制。修复GeoParquet导致客户端协议错误的问题。
修复在发起者节点上解析子查询中主机相关函数(如shardNum())的问题。
恢复数据库副本时正确关闭表。不正确的关闭会导致在数据库副本恢复期间某些表引擎出现LOGICAL_ERROR。
在为数据库名称生成拼写错误更正提示期间检查访问权限。
修复了在各种日期时间相关函数中对带小数秒的纪元前日期的不正确处理,例如
parseDateTime64BestEffort、change{Year,Month,Day}和makeDateTime64。之前亚秒部分是从秒中减去而不是添加。多项hive相关修复:LowCardinality支持、虚拟列处理、空格式处理等。
防止对
IN函数的第一个参数进行不必要的优化,这有时会在使用数组映射时导致错误。iceberg源ID和parquet名称之间的映射未根据parquet文件写入时的schema进行调整。此PR处理与每个iceberg数据文件相关的schema,而不是当前的schema。
修复与打开文件分开读取文件大小的问题。
ClickHouse Keeper不再在内核级别禁用IPv6的系统上启动失败(例如,带有ipv6.disable=1的RHEL)。
为globalJoin中的parallel replicas添加TableFunctionRemote支持。
修复OrcSchemaReader::initializeIfNeeded()中的空指针。
添加检查以仅在相关子查询使用外部查询的列时才允许FROM子句中的相关子查询。
修复使用子列更新列的alter update,该子列在其他列的物化表达式中使用。
禁止更改其子列在PK或分区表达式中使用的列。
修复在同一ALTER语句中列状态更改时ALTER COLUMN IF EXISTS命令失败的问题。
修复在存储DeltaLake中使用非默认列映射模式读取子列的问题。
修复在JSON内部带有Enum提示的路径使用错误默认值的问题。
DataLake hive catalog url解析与输入清理。
修复文件系统缓存动态调整大小期间的逻辑错误。
为DatabaseReplicatedSettings中的
logs_to_keep使用NonZeroUInt64。如果使用设置
index_granularity_bytes = 0创建表(例如ReplacingMergeTree),带有skip索引的FINAL查询会抛出异常。该异常现已修复。删除UB并修复Iceberg分区表达式解析的问题。
修复推断超出支持范围的日期时的Date/DateTime/DateTime64。
修复在一个INSERT中const和non-const块的崩溃情况。
从SQL创建磁盘时,将
/etc/metrika.xml中的includes作为默认值处理。修复从String到JSON的accurateCastOrNull/accurateCastOrDefault。
在iceberg引擎中支持不带'/'的目录。
修复使用replaceRegex、FixedString haystack和空needle时的崩溃。
修复ALTER UPDATE Nullable(JSON)期间的崩溃。
修复system.tables中缺少的列definer。
修复从LowCardinality(Nullable(T))到Dynamic的转换。
修复写入DeltaLake期间的逻辑错误。
修复从Azure blob存储的plain_rewritable磁盘读取空blob时的
416 The range specified is invalid for the current size of the resource错误。修复GROUP BY Nullable(JSON)。
修复物化视图中的错误:如果MV被创建、删除,然后使用相同名称再次创建,则可能无法工作。
从*cluster函数读取时,如果所有副本都不可用则失败。
修复由于
Buffer表导致的MergesMutationsMemoryTracking泄漏,并修复从Kafka(和其他)流式传输的query_views_log。删除alias存储的引用表后修复show tables。
修复启用send_chunk_header且通过HTTP协议调用UDF时缺少chunk头的问题。
修复启用jemalloc profile刷新时可能的死锁。
修复在DeltaLake表引擎中读取子列的问题。
正确处理loopback主机ID以避免处理DDL任务时的冲突。
修复具有numeric/decimal列的PostgreSQL数据库引擎表的detach/attach。
修复getSubcolumnType中使用未初始化内存的问题。
函数
searchAny和searchAll在使用空needles调用时现在返回true(即"匹配所有内容")。之前它们返回false。修复当第一个bucket没有值时函数
timeSeriesResampleToGridWithStaleness()的问题。修复由
merge_tree_min_read_task_size设置为0引起的崩溃。读取时从Iceberg元数据获取每个数据文件的格式(之前是从表参数获取)。
修复某些有效用户提交到
AggregateFunction(quantileDD)列的数据可能导致合并无限递归的崩溃。修复Backup db引擎在零大小part文件的查询上引发异常的问题。
修复启用send_chunk_header且通过HTTP协议调用UDF时缺少chunk头的问题。
修复由于keeper会话过期导致的S3Queue逻辑错误"Expected current processor {} to be equal to {}"。
插入和修剪中的可空性错误。
如果禁用Iceberg元数据缓存,不要禁用文件系统缓存。
修复parquet读取器v3中的'Deadlock in Parquet::ReadManager (single-threaded)'错误。
修复ArrowFlight的
listen_host中对IPv6的支持。修复
ArrowFlight处理器中的关闭问题。修复
describe_compact_output=1的分布式查询。修复窗口定义解析和应用查询参数。
修复在使用
PARTITION BY但没有分区通配符创建表时的异常Partition strategy wildcard can not be used without a '_partition_id' wildcard.,这在25.8之前的版本中可以工作。修复并行查询尝试获取单个锁时的LogicalError。
修复在RowBinary输入格式中将NULL写入JSON共享数据的问题,并在ColumnObject中添加一些额外的验证。
在作为
cluster表函数创建的表中支持JSON/Dynamic类型。修复带limit的空Tuple排列。
不要为持久处理节点使用单独的keeper节点。
修复TimeSeries引擎表破坏Replicated数据库中新副本创建的问题。
修复在任务缺少某些Keeper节点的情况下查询
system.distributed_ddl_queue的问题。修复在解压缩块末尾的查找。
处理Iceberg Iterator异步执行期间抛出的异常。
修复保存大型预处理XML配置的问题。
修复system.iceberg_metadata_log表中日期字段的填充。
修复带
WHERE的TTL的无限重新计算。修复在CTE中计算的函数在查询中非确定性的结果。
修复主键列上使用pointInPolygon时EXPLAIN中的LOGICAL_ERROR。
修复带
ROLLUP和CUBE修饰符的uniqExact函数可能的不正确结果。修复名称中带有百分号编码序列的data lake表。
修复当
parallel_replicas_for_cluster_functions设置为1时使用url()表函数解析表schema的问题。将PREWHERE拆分为多个步骤后正确转换输出。
修复带
ON CLUSTER子句的轻量级更新。修复某些带有String参数的聚合函数状态的兼容性。
修复在使用
optimize_functions_to_subcolumns的OUTER JOIN中nullable列上的不正确IS NULL行为。修复OpenAI的模型名称未传递的问题。
EmbeddedRocksDB:路径必须在user_files内。
修复25.1之前创建的KeeperMap表在DROP查询后在ZooKeeper中留下数据的问题。
修复读取parquet时的maps和arrays字段ID。
修复在lazy materialization中读取带有数组大小子列的数组。
修复
max_temporary_data_on_disk_size限制跟踪中临时数据释放的不正确计数。函数checkHeaders现在正确验证提供的headers并拒绝禁止的headers。
使
toDate和toDate32对所有数值类型的行为相同。修复从int16转换期间的Date32下溢检查。修复带有Dynamic参数的CASE函数。
修复具有多个JOIN的查询使用parallel replicas时的逻辑错误,特别是LEFT/INNER JOIN之后的RIGHT JOIN。
在schema推断缓存中遵守设置
input_format_try_infer_variants。使pathStartsWith仅匹配前缀下的路径。
修复从CSV中的空字符串读取空数组。
修复非相关
EXISTS可能的错误结果。它在execute_exists_as_scalar_subquery=1时被破坏,这在25.8中引入并影响25.8。修复
_row_number虚拟列和iceberg positioned deletes中的逻辑错误。修复由于混合const和non-const块导致的
JOIN中的"Too large size passed to allocator"LOGICAL_ERROR。如果未配置iceberg_metadata_log但用户尝试获取调试iceberg元数据信息,则抛出错误。
修复从另一个
MergeTree表读取的子查询的轻量级更新。修复move-to-prewhere优化,该优化在存在行策略时不起作用。
修复对数据部分中缺少的具有默认表达式的列应用patches。
修复EmbeddedRocksDB升级。
修复从对象存储直接读取文本索引的问题。
防止创建具有不存在引擎的权限。
仅忽略
s3_plain_rewritable的未找到错误。修复具有YTSaurus源和*range_hashed布局的字典。
修复创建空元组数组。
在临时表创建期间检查非法列。
永远不要在格式头中放置hive分区列。
修复使用文本格式时在DeltaLake中从格式准备读取的问题。
修复Buffer表的select和insert的访问验证。
禁止为S3表创建数据跳过索引。
避免异步日志记录的跟踪内存泄露(可能有显著漂移,10小时约100GiB)和text_log(几乎相同的漂移)。
修复了一个错误,如果视图被异步删除且服务器在完成后台清理之前重新启动,可能会导致使用View或Materialized View的SELECT设置覆盖全局服务器设置。
计算内存过载警告时排除用户空间页面缓存字节(如果可能)。
修复CSV反序列化期间不正确的类型顺序导致
LOGICAL_ERROR的错误。修复可执行字典的
command_read_timeout的不正确处理。修复使用新analyzer时WHERE子句中过滤替换列时的不正确SELECT * REPLACE行为。
修复在
Distributed上使用Merge时的两级聚合。修复未使用右行列表时HashJoin算法中输出块的生成。
如果应用索引分析后没有数据要读取,则可能会错误选择Parallel replicas读取模式。
修复Glue中
timestamp/timestamptz列的处理。修复在PostgreSQL接口中写入布尔值的问题。
修复带有CTE的insert select查询中的未知表错误。
修复从无法在Nullable内部的Variants读取null map子列。
修复在集群的辅助节点上完全删除数据库失败时的错误处理。
修复几个skip索引错误。
在AzureBlobStorage中,更新为首先尝试native复制,并在'Unauthorized'错误时进行读写。
如果ArrowStream文件具有非唯一字典,云数据库ClickHouse会崩溃。
修复最后一个块为空时带有projection的合并。
如果参数类型不允许在GROUP BY中,则不要从GROUP BY中删除单射函数。
修复在查询中使用
session_timezone设置时基于datetime的键的不正确granules/分区消除。在PostgreSQL接口中查询后返回受影响的行数。
限制对PASTE JOIN使用过滤器下推,因为它可能导致不正确的结果。
在授权检查引入的评估之前应用URI规范化。
修复当新analyzer中ARRAY JOIN COLUMNS()不匹配任何列时的逻辑错误。
修复“High ClickHouse memory usage”警告(排除页面缓存)。
修复设置了列
TTL的MergeTree表中可能的数据损坏。修复使用空元组参数调用时
mortonEncode和hilbertEncode函数的崩溃。现在,在集群中存在不活动副本的情况下,
ON CLUSTER查询将花费更少的时间。现在DDL worker从副本集清理过时的主机。这将减少ZooKeeper中存储的元数据量。
在发生错误时正确撤销移动目录操作。
修复
ColumnLowCardinality中is_shared标志的传播。修复工作负载设置
max_cpu_share。现在可以在不设置max_cpus工作负载设置的情况下使用它。修复带有子查询的非常繁重的mutation可能在准备阶段卡住的错误。
现在相关子查询将与对象存储一起工作。
访问
system.projections和system.data_skipping_indices时避免尝试初始化DataLake数据库。现在只有在明确启用
show_data_lake_catalogs_in_system_tables时,datalakes catalog才会显示在系统内省表中。修复DatabaseReplicated以遵守
interserver_http_host配置。在定义Projection的上下文中明确禁用位置参数。
修复
countMatches函数中的二次复杂度。使KeeperMap表的
ALTER COLUMN ... COMMENT命令被复制。修复Database Replicated中物化视图的错误循环依赖情况。
修复当
group_by_overflow_mode设置为any时稀疏列的聚合。修复使用
query_plan_use_logical_join_step=0和多个FULL JOIN USING子句时的"column not found"错误。节点数>10的大型集群在恢复时失败的概率很高。修复使控制尝试的设置动态化。
此PR仅用于兼容23.8及之前版本。
修复将大值转换为DateTime时
accurateCast错误消息中的UBSAN整数溢出。修复tuple类型的coalescing merge tree。
禁止对
iceberg_format_version=1进行删除。此patch修复了任意深度文件夹的
plain-rewritable磁盘的移动操作。修复
*cluster函数的SQL SECURITY DEFINER。修复由并发mutation底层const PREWHERE列引起的潜在崩溃。
修复从文本索引读取和启用查询条件缓存(启用设置
use_skip_indexes_on_data_read和use_query_condition_cache)的问题。从
Poco::Net::HTTPChunkedStreamBuf::readFromDevice抛出的Poco::TimeoutException异常会导致SIGABRT崩溃。修复在配置重新加载后云数据库ClickHouse首次连接时附加到
system.zookeeper_connection_log的问题。修复了一个错误,即在使用时区时,使用
date_time_overflow_behavior = 'saturate'将DateTime64转换为Date可能导致超出范围值的不正确结果。第N次尝试修复启用缓存的s3表引擎的“having zero bytes error”。
修复
loop表函数的select访问验证。当异步日志记录失败时捕获异常以防止程序中止。