本文介绍云数据库ClickHouse24.2.2.16399企业发布的功能详情。
新特性
新增system.dns_cache表,此表有助于调试DNS问题。
新增表函数mergeTreeIndex。
此函数是关于MergeTree表的索引和标记文件的内容。可以用于自检。
语法:
说明以下SQL语法中,database.table是一个具有MergeTree引擎的现有表。
mergeTreeIndex(database.table, [with_marks = true])
新增表函数generate_series。此函数可生成一个具有自然数等差数列的表。
内存引擎StorageMemory新增了四个属性。
说明启用对表参数范围的访问需要在memory.md文档的MemorySink添加表context属性。
min_bytes_to_keep
max_bytes_to_keep
min_rows_to_keep
max_rows_to_keep
支持merge表函数的单参数版本。语法为
merge([<db_name>, ] <tables_regexp>)
。新增聚合函数groupArrayIntersect。
新增函数toMillisecond。
说明此函数的DateTime或DateTime64类型值的单位为秒。
支持使用SQL移除与空分区相关的ZooKeeper节点。
语法:
ALTER TABLE <table_name> FORGET PARTITION partition;
参数说明:
参数名称
参数说明
示例值
table_name
表名称
test
新增
DIFINER=<userName>
语法,允许在View或者Materialized View中指定视图定义者。视图定义者拥有对视图执行查询/插入操作的权限,无需对底层表的显式授权。Topk/topkweighed模式支持返回计数和误差。
支持在schema推断过程中自动检测在file/s3/hdfs/url/azureBlobStorage引擎中未知的文件格式。
默认压缩算法从LZ4HC(3)变为LZ4HC(2),提高了查询效率,但压缩率有所降低。
支持扩展名忽略大小写,例如Tsv、TSV、tsv。
支持ATTACH PARTITION ALL语句。
管控改进
支持ClickHouse-Server和Keeper内核中内存软限随CCU动态调整,解除了Keeper最大支持内存过小的限制,并在一定程度上避免了OOM。
关闭Uncompressed Cache。
优化MarkCache大小的设置逻辑,减少了一些情况下的内存占用,以便弹降。
支持FileSystemCache随CCU规格动态变化(原先固定100GB)。
支持调整为更激进的Serverless策略。(目前邀测)
默认开启text_log,方便您自助排查问题。
提升系统对内存弹性的感知速度,降低。
对打包格式文件排序,以优化缓存下载内容,降低对象存储网络访问流量和QPS放大倍数。
改进
允许对S3Queue表引擎进行并行和分布式处理。
说明对于分布式处理,使用设置s3queue_total_shards_num(默认值为1)。
之前设置s3queue_processing_threads_num不允许有序处理模式,现在允许。
需要注意:s3queue_processing_threads_num(每个分片的处理线程)和s3queue_total_shards_num设置对有序模式更改元数据存储方式(使max_processed_file节点的数量等于
s3queue_processing_threads_num * s3queue_total_shards_num
),因此它们必须在所有分片中保持相同,并且一旦创建了至少一个分片就不能更改。
在运行物化视图的MODIFY COLUMN查询时,确保内部表的每列都在。
新增system.keywords表,此表包含了解析器中所有关键字,有助于您更好的进行模糊测试和语法高亮显示。
支持带有分析器的参数化视图,不对创建参数化视图进行分析。重构现有参数化视图逻辑,不对创建参数化视图进行分析
不再支持新建ordinary引擎的数据库,存量ordinary引擎数据库可正常使用。
在删除表时,必须同时删除与表相关的所有零拷贝锁以及这些锁的目录。
dictGetOrDefault函数新增了短路功能。
允许在外部表结构中声明枚举。
对具有
DEFAULT
或MATERIALIZED
表达式的列执行ALTER COLUMN MATERIALIZE
命令时,将会写入正确的值。说明新版本对于已有部分中带有默认值的行,将写入默认值;而对于已有部分中带有非默认值的行,则写入其原有的非默认值。
旧版本对于所有已存在的部分,不论其原先是否有非默认值,都会被错误地写入默认值。
启用了退避逻辑(例如指数退避),降低了CPU使用率、内存占用量,并减小了日志文件的大小。
在数据合并操作时,考虑了轻量级删除的行。
说明轻量级删除的行指的是数据实际上并没有从存储中删除,只是被标记为已删除。更多轻量级删除的行详情,请参见DELETE Statement。
T64编解码器开始支持Date32类型。
PR使得HTTP/HTTPS的连接在所有应用场景中都可重用,即便遇到3xx或4xx的响应状态码也不例外。
为系统表的所有列添加注释。
支持在PREWHERE子句中使用虚拟列。
说明对于非常量型的虚拟列_part_offset,这种优化具有重要意义。
Keeper改进:在内存中缓存一定数量的日志,通过设置latest_logs_cache_size_threshold和commit_logs_cache_size_threshold参数进行控制。
对象存储不再使用固定密钥,而是生成密钥来确定其删除对象的能力。
默认不推断指数表示法中的浮点数。
允许用括号包围ALTER操作。
说明较旧版本无法读取新语法,因此在单个集群中混合使用新旧版本的ClickHouse可能会导致问题。
默认情况下,在格式化查询中包含圆括号,是因为在某些地方(例如:变异)将格式化的ALTER操作为元数据。
新语法支持一些修改操作以列表结尾的查询。例如:旧语法无法正确解析
ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c
,但是,在新语法中,ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c)
可以正确执行。
对Intel QPL的升级,改进了DEFLATE_QPL编解码器,并且修复了一个可能导致并发处理问题的轮询超时机制的错误。
在libhdfs3中新增了位置性预读功能。
说明如果您想在libhdfs3中进行位置读取,需要调用hdfs.h中的hdfsPread函数。示例如下:
tSize hdfsPread(hdfsFS fs, hdfsFile file, void * buffer, tSize length, tOffset position);
即使您错误地将max_parser_depth设置为了一个非常高的值,解析器也会检查堆栈溢出。
说明旧版本如果将max_parser_depth值设置地太大可能会导致服务器崩溃。
max_parser_depth的默认值为1000。更多信息,请参见max_parser_depth。
统一kafka存储中由XML和SQL创建命名集合的行为。
说明kafka存储有两种参数类型:存储自身的存储参数以及librdkafka配置设置参数。
未优化前,存储参数在两种情况下均会被应用,但Kafka设置只加载使用XML创建的命名集合。
此优化统一了Kafka存储对命名集合的访问方式,并且允许在不重启服务器的情况下使用新的XML命名集合。
如果
CREATE TABLE
明确指定了uuid,则允许在replica_path中使用此uuid。示例:
CREATE TABLE x UUID 'aaaaaaaa-1111-2222-3333-aaaaaaaaaaaa' (key Int) ENGINE = ReplicatedMergeTree('/tables/{database}/{uuid}', 'r1') ORDER BY tuple();
在系统表system.tables中添加了ReplicatedMergeTree表的metadata_version列。
Keeper改进:为磁盘相关操作添加失败重试。
如果StorageBuffer有多个分片(num_layers > 1),后台会启动多个线程对所有分片进行刷新。
ULIDStringToDateTime函数新增了短路功能。
优化ClickHouse在无活跃事务时的表现,从报INVALID_TRANSACTION异常变成和MySQL一样无异常抛出。
distributed_ddl_output_mode新增了none_only_active模式。
通过MySQL端口的连接ClickHouse时,参数prefer_column_name_to_alias默认设置为1, 同时也默认启用mysql_map_string_to_text_in_show_columns和mysql_map_fixed_string_to_text_in_show_columns,提高了clickhouse与BI工具的兼容性。
函数substring新增了一个别名byteSlice。
SHOW INDEX | INDEXES | INDICES | KEYS
不再按主键列排序。Keeper改进:在启动期间检测到无效快照时中止启动,以避免数据丢失。
字符串类型和枚举可以在相同的上下文中使用,例如:数组、UNION查询、条件表达式。
为SMJ添加标志用以便将NULL值视为最大/最小。这样可以使ClickHouse与其他SQL系统(如Apache Spark)兼容。
新增设置项
parallel_replicas_allow_in_with_subquery = 1
,允许IN子查询在并行副本中工作。DNSResolver随机分配解析的IP集合。
默认启用处理器分析(排序、聚合的时间花费/输入和输出字节)。
新增函数toUInt128OrZero,兼容别名FROM_UNIXTIME和DATE_FORMAT(不区分大小写)。
改进了访问检查,支持在目标用户没有撤销权限的情况下撤销未拥有的权限。
示例:
GRANT SELECT ON . TO user1; REVOKE SELECT ON system.* FROM user1;
移除break以确保第一个过滤列具有最小长度。
修复has()函数与Nullable列的兼容性。
为虚拟内存映射添加异步指标VMMaxMapCount和VMNumMaps。
在创建临时数据使用temporary_files_codec设置项,例如外部内存排序和外部内存分组。之前它仅在partial_merge的JOIN算法中。
不允许S3存储队列的分片模式,因为它将被重写。
删除blob_storage_log中的一些重复条目。
添加current_user函数作为MySQL的兼容性别名。
bug修复
修复由于内存统计错误导致查询被意外终止的问题。
修复重启实例后,第一个DDL报异常的问题。
修复intDiv函数在处理decimal参数类型时的错误。
修复由wingfuzz发现的KQL问题。
修复AsynchronousBoundedReadBuffer的
Read beyond last offset
错误。修复RabbitMQ和ClickHouse通信异常时消息状态既不返回ACK也不返回NACK的问题,目前读写阶段异常后会返回NACK。
修复QueryAnalyzer在对含有GROUP BY一个LowCardinality类型常量的query执行分析时返回失败的问题。
修复DateTime64的比例转换。
修复插
INSERT into SQLite
时单引号的转义(通过用单引号而不是反斜杠转义单引号)。修复使用ClickHouse无法识别列别名并报错的问题。
修复MergeTree的
finished_mutations_to_keep=0
(如文档所述,0是保留所有内容)。修复S3Queue表在删除时可能发生的异常。
PartsSplitter相同部分的无效范围。
在DDLLogEntry中,使用上下文中的max_query_size代替硬编码4096。
修复查询格式不一致问题。
修复子查询中explain格式不一致问题。
修复由于Nullable引发cosineDistance崩溃的问题。
允许将字符串表示的布尔值转换为真正的布尔值。
说明支持执行类似
SELECT true = 'true'
的语句,在之前版中,执行这类语句时会发生异常。修复system.s3queue_log。
说明修复系统表system.s3queue_log中未填充的列table_uuid。新增了database和table两列。并将table_uuid列重命名为uuid。
修复arrayReduce可能产生报错
Bad cast from type DB::ColumnVector<double> to DB::ColumnNullable。
修复多次insert情况下PK、分区修剪等初步过滤不生效的问题。
隐藏S3Queue表的敏感信息。
还原
Replace ORDER BY ALL by ORDER BY *
。Azure Blob Storage:修复端点和前缀问题。
修复HTTP异常代码。
修复LRUResource Cache(Hive缓存)。
s3queue:修复错误(也修复了flaky test_storage_s3_queue/test.py::test_shards_distributed)。
修复IPv6哈希函数中的未初始化值和无效结果。
如果并行副本发生变化,强制重新分析。
修复带有新磁盘配置选项的普通元数据类型的使用。
不允许将
max_parallel_replicas
设置为0,因为这没有意义。尝试修复mapContainsKeyLike中的逻辑错误
Cannot capture column because it has incompatible type
。修复带有空参数的OptimizeDateOrDateTimeConverterWithPreimageVisitor。
尝试避免为
CREATE TABLE
计算标量子查询。正确检查s3Cluster中的密钥。
修复在并行解析时,由于错误跳过大量行时的死锁。
修复KQL复合运算符(例如mv-expand)在设置max_query_size时的问题。
Keeper修复:添加在等待提交日志时的超时。
减少从system.numbers读取的行数。
不为日期类型输出数字提示。
修复从MergeTree表读取数据时,在过滤条件中使用非确定性函数导致结果集不正确的问题。
修复设置错误兼容性值类型的逻辑错误。
修复在混合x86-64/ARM集群中聚合函数状态不一致的问题。
修复(prql):更健壮的panic handler。
修复intDiv函数参数为十进制和日期/时间类型时引发的程序崩溃问题。
ALTER TABLE ... MODIFY QUERY
语句在使用CTE时异常的问题。修复非原子/普通数据库引擎(即内存)中的system.parts。
修复参数化视图的Invalid storage definition in metadata file问题。
修复CompressionCodecMultiple缓冲区溢出问题。
删除SQL/JSON中无意义内容。
删除聚合函数quantileGK中错误的清理检查。
修复了在query中使用自定义 insert_deduplication_token 参数时出现非预期的重复数据删除的问题。
修复在调用分片上传时会添加不支持的自定义元数据头的问题。
修复toStartOfInterval函数。
修复arrayEnumerateRanked函数中的崩溃。
修复在INSERT SELECT JOIN中使用input()函数时的崩溃。
修复在子查询中具有不同allow_experimental_analyzer值的崩溃。
读取S3时移除递归。
修复HashedDictionaryParallelLoader中错误情况下的可能卡住的问题。
修复Replicated数据库的异步恢复(Async Restore)机制。
修复通过本地协议异步插入到Log表时的死锁。
修复RangeHashedDictionary中dictGetOrDefault默认参数的延迟执行。
修复groupArraySorted中的多个错误。
修复Keeper的独立二进制文件的重新配置。
修复S3引擎中session_token的使用。
修复聚合函数uniqExact可能产生不正确结果的问题。
修复显示数据库中的错误。
修复具有MATERIALIZED列的RabbitMQ存储中的错误逻辑。
修复CREATE OR REPLACE DICTIONARY。
修复带有外部ON CLUSTER的ATTACH查询。
修复操作DAG拆分问题。
修复失败的RESTORE命令无法正常结束的问题。
正确禁用具有兼容性设置的async_insert_use_adaptive_busy_timeout。
允许在恢复池中排队。
修复读取system.parts使用UUID报错的问题。
修复窗口视图中的崩溃问题。
修复使用非本机整数时的重复问题。
修复客户端
-s
参数。修复使用arrayPartialReverseSort函数引发的程序崩溃问题。
修复具有常量位置的字符串搜索。
修复使用datetime64时因addDays导致的错误。
修复异步插入数据时,system.part_log中重复数据的问题。
修复system.parts的未就绪状态。
修复SMT中潜在的垃圾数据或数据丢失的问题。
允许从所有可用区域获取分布式缓存指标。
修复DISTINCT和窗口函数的崩溃问题。
DistrCache:更多的配置文件事件,更好的异常消息。
修复集群默认数据库授权问题。
修复MemoryTrackerSwitcher中未跟踪的内存问题。
修复一项因内存统计错误导致的查询被意外中断的问题。
修复OrderByLimitByDuplicateEliminationVisitor的跨子查询问题。
修复TTL执行中的向后不兼容问题。
分布式缓存中连接和连接池相关的改进。
修复Replicated数据库引擎下设置TTL可能导致崩溃的一项问题。
避免在ActionsDAG::split结果的新输入中重复命名。
分析器:修复RewriteAggregateFunctionWithIfPass问题。
修复带有默认表达式的CREATE TABLE AS查询。
分析器:修复查询树大小验证问题。
修复GLOBAL IN别名问题。
02228_merge_tree_insert_memory_usage不使用随机设置。
分析器:修复AggregateFunctionsArithmeticOperationsPass问题。
修复远程查询中带有分析器的INTERPOLATE别名问题。
允许在复制数据库的ZooKeeper路径中使用特殊宏{uuid}和{database}。
更新异常消息。
捕获ContextAccess的弱指针以确保安全。
修复哈希字典短路时的错误。
修复UniqInjectiveFunctionsEliminationPass和uniqCombined崩溃问题。
修复初始化顺序(ServerUUID/ZooKeeper)。
CI:向回溯工作流程添加aarch构建。
修复packed part存储中的getFileLastModified问题。
修复定义者的备份恢复问题。
totalqpslimitexceeded是否是可重试的s3错误。
修复因OSS QPS限流导致插入中断的问题。
修复MySQL字典源问题。
尝试修复MergeTreeReadPoolBase::createTask中的段错误。
为集成测试运行器添加jwcrypto。
MergeTreePrefetchedReadPool更安全。
修复一项罕见报错:在ALTER 后可能造成SELECT查询报错
Unexpected return type from materialize. Expected type_XXX. Got type_YYY.
的问题。修复02362_part_log_merge_algorithm易碎测试。
修复SMT插入期间的数据丢失问题。
撤销在次级查询的GROUP BY键中不移除服务器常量”。
修复嵌套lambda捕获问题。
用户空间页面缓存:如果未使用缓存则不收集统计信息。
分析器查看仅必要的列。
修复StorageS3在重启后缺少extra_credentials的问题。
在使用并行读取时,正确取消S3读取操作。
修复Linuxs上arm64的test_odbc_interaction。
S3Queue:在tracked_file_ttl_sec和traked_files_limit中计算失败的文件。
仅在移除前检查部件校验和。
修复部分合并连接中的非法列问题。
修复标量创建选择问题。
arm修复test_short_strings_aggregation。
修复test_disk_types的aarch64。
修复test_catboost_evaluate的aarch64。
移除窗口函数多余的DISTINCT。
修复复制数据库中的flatten_nested问题。
禁用arm使用test_non_default_compression/test.py::test_preconfigured_deflateqpl_codec。
修复02124_insert_deduplication_token_multiple_blocks。
修复在删除范围后,重启时数据重叠问题。
修复在使用新分析器和并行副本从MV读取时,结果错误的问题。
当某DDL任务连续失败超过max_retries_before_automatic_recovery参数预设的次数后,将自动标记该数据库副本为lost,并启动恢复程序,同时修复DDL执行阶段报错可能导致该DDL直接被跳过的问题。
修复在物化视图中使用IN函数时涉及任意深度子查询的分析器问题。
修复keeper-client的find_super_nodes和find_big_family命令的问题。
更新lambda的执行名称。
修复在发布分支上自动创建新版本的问题。
以更安全的方式反序列化不受信任的二进制输入数据。
修复投影部件备份/恢复中的问题,在投影从表元数据中移除但部件仍有投影的情况下。
支持
Array(Nothing)
转换成Map(Nothing, Nothing)
。修复分析器中的COLUMNS的问题。
在访问current_parts.size()和future_parts.size()之前获取锁。
忽略Keeper的text_log。
防止在使用
CREATE TABLE AS MaterializedView
时出现LOGICAL_ERROR。修复在不使用自适应粒度的表时,带FINAL的查询结果错误问题。
修复在撤销仲裁插入事务时的逻辑错误问题。
修复使用分析器时的SQL安全访问检查问题。
查询缓存:对于不同数据库的相同查询被视为不同查询。
修复select_sequential_consistency中的错误。
修复分析器:只有插值表达式能用于DAG。
更新InterpreterCreateQuery.cpp。
修复Buffer表使用prewhere子句时的错误逻辑。
CI:向可重用的阶段工作流yml添加密钥。
修复由于并发更新导致提交失败后,FS元数据缓存失效的问题。
修复由于CPU/实时性能分析器引起的SIGSEGV。
在备份副本过程中正确回退。
禁用enable_vertical_final。
优化ASAN镜像。
测试qps_limit_exceeded。
修复在StatusFile 中,~WriteBufferFromFileDescriptor未捕获异常导致程序中止的问题。
修复isNull/isNotNul和分析器的早期常量折叠问题。
修复ClickHouse Keeper中导致在关闭会话期间摘要不匹配的错误。
在证书重新加载期间重新加载证书链。
SharedMergeTree的TTL过期后,清理空parts。
修复Alter语句复制SQL安全性的相关问题。
修复销毁AccessControl时程序崩溃的问题,添加显式关闭。
性能改进
消除SELECT部分中GROUP BY键的min/max/any/anyLast聚合器。
改善涉及多个[可为空]列时序列化聚合方法的性能。
延迟构建连接输出以提高ALL连接的性能。
优化ArgMin/ArgMax/any/anyLast/anyHeavy聚合函数,以及对ORDER BY使用无符号整型( u8、u16、u32、u64) 和有符号整型 (i8、i16、i32、i64)排序并且使用 LIMIT 1 条件查询的优化。
通过减少分支错误来优化bigint和big decimal类型的条件sum/avg性能。
改善具有活动突变的SELECT`查询性能。
对列过滤进行细节优化。避免过滤底层数据类型不是数字的列的
result_size_hint = -1
。在某些情况下,峰值内存可以减少到原来的44%。主键将使用更少的内存。
改善主键和其他操作的内存使用情况。
表的主键将在首次访问时延迟加载。
说明通过设置MergeTree的primary_key_lazy_load控制,默认开启。此设置有以下优缺点。
优点:
不会加载对于未使用的表。
如果内存不足,将在首次使用时抛出异常,而不是在服务器启动时。
缺点:
加载主键的延迟将在第一个查询时支付,而不是在接受连接之前
可能会引入一个突发请求问题。
矢量化函数dotProduct有助于向量搜索。
如果表的主键包含大部分无用的列,请不要将它们保留在内存中。
说明通过设置primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns控制。
默认值为0.9。其含义为对于复合主键,如果一列在至少0.9次更改其值,之后的列将不被加载。
如果multiIf函数预计会返回一个数字类型的结果,系统会采用列式执行来对这个函数的调用进行优化。这意味着在执行类似multiIf的函数时,如果涉及大量数据,系统会尝试以更高效的方式,并发地按列处理这些数据。
通过使用位与代替逻辑与,改变了过滤器组合过程的实现,使得该操作可以被编译器自动向量化。这项更改是尝试通过向量化操作来提高数据库查询执行性能的一部分,使得可以通过使用处理器的功能进行更有效的操作。
优化ThreadFuzzer的mutex性能问题,几乎快了2倍。
解决分布式查询时由于连接不能并行造成的性能问题。
优化insertManyFrom循环调用insertFrom导致的性能损失问题。
优化函数dotProduct,省略不必要且昂贵的内存复制。
文件系统缓存操作将减少锁竞争。
优化ColumnString::replicate并防止memcpySmallAllowReadWriteOverflow15Impl被优化为内置memcpy。使得ColumnString::replicate在x86-64上速度提高了2.46倍。
对于256位整数,打印速度提高了30倍。
解析器逻辑优化,修复了当语法错误的查询包含带有正则表达式的COLUMNS匹配器时,会触发解析器多次编译,影响解析速度的问题。