v26.1
本文介绍 SelectDB Cloud 内核 26.1 版的发布记录。
说明 SelectDB Core v26.1 基于 Apache Doris v4.1 开发。
公开预览(Public Preview) v26.1 系列处于公开预览阶段:可用于规模化评估,但尚未正式发布(GA)。有关 SelectDB Cloud 版本与 Apache Doris 版本的对应关系,请参见版本对应关系。
v26.1.1(2026年7月9日)
本版本是 v26.1 系列的首个版本,基于 Apache Doris v4.1 开发,包含截至 v26.0.4 的所有修复。v26.1 系列带来了 Apache Doris 4.1 的完整功能集,因此本文描述这些 4.1 能力在 SelectDB 内核中的表现。
新功能
- 新增
search()函数,可在 SQL 中直接执行全文检索,使用与 Elasticsearchquery_string兼容的 DSL。支持 TERM、PHRASE、WILDCARD、REGEXP、PREFIX 和 NESTED 运算符,通过score()列提供 BM25 相关性打分,支持多字段检索,并可在不预先展开的情况下检索 Variant JSON 数组内部。 - 新增 IVF 近似最近邻(ANN)向量索引(
"index_type"="ivf"),作为 HNSW 之外内存占用更低的大规模向量检索方案;同时提供落盘变体("index_type"="ivf_on_disk"),适用于索引大于可用内存的向量集。 - 新增向量索引量化,包括 INT8 标量量化、INT4 标量量化和乘积量化(PQ),可将向量索引内存降低约 4 到 8 倍,仅带来较小的召回率损失。
- 新增 Variant 列的 DOC 模式,按写入原样保留整个 JSON 文档,将拆分为按字段存储的操作推迟到 compaction 时进行,从而降低以小批量写入宽 JSON 文档的成本。
- 新增面向超宽表的 V3 存储格式(
"storage_format"="V3")。它将列元数据单独存储,而非全部打包在每个文件末尾,因此拥有数万列或大量 Variant 子列的表能够更快打开,并在随机读和点查询上表现更好。 - 新增在 Variant 列中原生存储超大 JSON 文档的能力,单个文档可达约 100 MB。诸如完整对话历史、Agent 执行轨迹和 RAG 上下文等长文档,可直接存储和查询,无需跨行拆分或存放到外部文件。
- 新增 Condition Cache,可缓存某段数据上过滤条件的计算结果,并在相同过滤条件再次作用于未变更数据时复用,从而加快重复的过滤查询。
- 新增通过
WITH RECURSIVE的递归公共表表达式(CTE),用于层级和图式查询。 - 新增
UNNEST语法,用于将数组等嵌套值展开为多行。 - 新增标准 SQL
MERGE INTO语句,可在单条语句中对表执行插入、更新和删除。 - 新增
json_each和json_each_text表函数,用于将 JSON 对象展开为键值行。 - 新增
array_cross_product函数,用于计算多个数组的笛卡尔积。 - 新增
murmur_hash3_128标量函数、exponential_moving_average聚合函数,以及 DataSketches HLL 聚合函数。 - 新增
current_database,作为现有database()函数的别名。 - 新增对 Iceberg V2 和 V3 表的完整读写支持,包括行级
UPDATE、DELETE和MERGE INTO,以及读取 Iceberg V3 的删除向量(deletion vectors)和行血缘(row lineage)。 - 新增 Iceberg JDBC catalog、排序写入、静态分区覆盖写,以及
publish_changes存储过程。 - 新增 Paimon JDBC catalog,以及创建和删除 Paimon 数据库和表的 SQL 操作。
- 新增对 MaxCompute 外部 catalog 的
CREATE TABLE、DROP TABLE和INSERT INTO支持。 - 新增 Parquet 元数据表函数,可通过 SQL 检查行组、列统计信息等文件元数据。
- 新增对文件表函数(table-valued function)的
INSERT INTO支持,可将查询结果导出到 HDFS 或 S3。 - 新增
cdc_stream表函数,用于读取 MySQL 和 PostgreSQL 的变更流,并将其用作 Streaming Job 的数据源。 - 新增 Kafka 例行导入(Routine Load)作业的 AWS MSK IAM 认证支持。
改进优化
- 优化了复杂的 join 和聚合查询,支持将聚合下推穿过 join,在 join 之前先对每个输入进行预聚合,从而减少行数、内存占用和延迟。
- 优化了一次性计算多种分组的查询(如
GROUPING SETS、ROLLUP和CUBE),先计算最细粒度的分组,再由其推导出更粗粒度的分组,从而减少计算量。 - 优化了读取嵌套列中单个字段(如
STRUCT的某个字段)的查询,仅从存储中读取该字段,内部表以及 ORC、Parquet 外部表均适用。 - 优化了包含
CASE WHEN的查询,支持分支合并、分支消除和公共子表达式提取。 - 新增 Query Cache,可缓存查询的中间聚合结果,并在相同聚合再次作用于未变更数据时复用。
- 优化了常见算子和函数的执行,包括更智能的 join 顺序和数据 shuffle 选择,以及更快的
LIKE、FROM_UNIXTIME和COUNT,从而降低整体查询的内存占用和延迟。 - 增强了大型 join、聚合和排序的落盘(spill)能力。hash join、聚合和排序算子现在可以在内存不足时将中间数据分多级落盘到本地磁盘,使内存密集型查询在有限内存下完成,而不是失败。
- 通过自适应调整扫描批大小,提升了大表扫描的吞吐量和内存效率。
- 提升了向量检索性能,近似最近邻查询可只读取向量索引,避免读取原始向量列。
- 提升了重复的 Parquet 查询性能,可复用已解压的数据页;新增 Iceberg manifest 缓存,避免在查询规划期间反复解析相同的 manifest 文件;并通过原生 reader 提升了 Paimon 查询性能。
- 加快了索引列上的
ORDER BY ... LIMIT查询,仅对最终进入结果集的行读取完整行数据,并优化了explode和posexplode的执行。 - 优化了大多数键很少被查询的超宽 JSON 文档的存储。这些不常用的键现在会分散到多个内部列中,并对其读取进行缓存,从而降低读放大和延迟抖动。
- 新增主键表模型的多流更新(multi-stream update),不同数据流可各自更新同一张表的不同列,并按各自的 sequence 列合并。
- 扩展了例行导入(Routine Load),支持灵活的部分列更新、通过
ALTER ROUTINE LOAD动态调优,以及基于积压量的自适应批大小。 - 新增自适应 MemTable flush 调度,在高写入场景下使写入并发与当前集群负载相匹配。
- 扩展了 MySQL 和 PostgreSQL 的 CDC Streaming Job,支持自定义表映射、仅快照同步、PostgreSQL 的 schema 变更处理、排除列,以及更多 PostgreSQL 数据类型。
- 为 Streaming Job 新增显式起始 offset、计算组选择、结构化的失败原因,以及每个作业的延迟和进度指标。
- 通过避免将仍在推进的任务判定为超时并重试,提升了大表或数据倾斜表的全量快照 CDC 可靠性。
- 将
window_funnel默认改为内存效率更高的 v2 实现,同时以window_funnel_v1保留原有实现。在FIXED模式下,不匹配任何漏斗条件的行不再中断序列,因此升级后相关查询可能返回更长的漏斗链。 - 扩展了多个聚合和数组函数以接受 TIMESTAMPTZ 值,并扩展了
max_by和min_by以支持复杂类型。 - 新增运行中查询的统一运行时统计和进度上报,可查看查询已执行的进度。
- 在 MTMV 刷新任务的输出中新增了计算组信息,可直接查看刷新任务的调度位置。
- 优化了存算分离架构下的弹性扩缩容,增删计算节点更快完成,且均衡调度不再依赖 tablet 总数。
- 新增
information_schema.file_cache_info系统表,按 tablet、BE 和缓存路径报告 file cache 使用情况,便于排查热点数据和缓存分布不均。 - 将 Stream Load 记录纳入审计日志,可像其他语句一样查询和审计导入历史。
- 通过更优的列编码和压缩(包括将默认压缩转向 ZSTD),减少了存储占用并提升了冷读性能。
- 降低了 row-store 摄入以及解析稀疏 Variant 文档时的内存压力。
- 新增每个分区默认 768 个分桶的上限。
CREATE TABLE和ADD PARTITION现在会拒绝超过该上限的分区。
问题修复
- 修复了
*_diff函数在使用可空字面量或跨越 0000 年时、datediff作用于零日期时,以及convert_tz跨夏令时切换时,常量折叠与运行时执行结果不一致的问题。 - 修复了当可空浮点参数包含未被使用的 NaN 值、而后续参数已提供预期的非 NULL 结果时,
coalesce却返回 NULL 的问题。 - 修复了运行时过滤器被下推到外连接(outer join)可空一侧时返回错误结果的问题。
- 修复了查询计划在不同 join 分支间复用预聚合状态,导致当各分支需要不同聚合行为时生成错误计划的问题。
- 修复了对外部表上
SELECT *视图的查询,在源表新增列并刷新元数据后以IndexOutOfBoundsException失败的问题。 - 修复了
tokenize首个参数为常量、而查询扫描多行输入时仅返回一行的问题。 - 修复了
json_contains将数值相等的 JSON 值(如1和1.0)视为不同的问题,并修复了数组中重复候选值导致包含判断错误的问题。 - 修复了
enable_insert_strict静默改变 INSERT 语句 cast 行为的问题。现在 INSERT 行过滤与enable_strict_cast相互独立。 - 修复了
COM_RESET_CONNECTION清除已选数据库并使其他会话状态部分重置的问题,该问题可能导致连接池中的 MySQL 连接在 reset 后失效。 - 修复了读取由 2.1.0 之前 Doris 版本写入的旧版 DecimalV2 数据时以精度非法错误失败的问题。
- 修复了
MATCH拒绝带别名的 Variant 点号子列(如msg.trace_id)的问题,并修复了嵌套 Variant 检索绑定到错误倒排索引的问题。 - 修复了数组下标和
element_at作用于被优化器裁剪掉的 Variant 子路径时返回 NULL 的问题。 - 修复了稀疏 Variant 路径为混合类型数组推断出错误元素类型、并在序列化时丢失 TIMESTAMPTZ 值的问题。
- 修复了后台 compaction 在处理存有嵌套 JSON 对象数组的 Variant 列时,当某行嵌套值为 NULL 或为空则失败的问题。
- 修复了 IVF 和 PQ 向量索引在仅用部分 segment 训练时召回率过低或为零的问题,并修复了 ANN 范围检索状态在 segment 间泄漏的问题。训练行数不足的 segment 现在会跳过索引创建,而不是使写入失败。
- 修复了
window_funnelv2 在DEDUPLICATION和FIXED模式下,当较晚的起始事件本可产生更长有效序列时却返回错误最长链的问题。 - 修复了 MTMV 在
excluded_trigger_tables变更后跳过必要刷新的问题,并修复了当调用方传入不可变的排除表集合时分区 MTMV 检查失败的问题。 - 修复了包含多张表且
offset=initial的 PostgreSQL CDC 作业在快照阶段永久丢失变更的问题,并修复了匹配 schema 中同名表导致Duplicate key失败的问题。 - 修复了
cdc_stream的 offset 未能在 FE checkpoint 后保留,导致恢复的作业可能从错误源位置继续的问题。 - 修复了 Stream Load 在重定向请求且请求体未被消费时以 broken pipe 失败的问题,并修复了当 BE ID 差值超过整型范围时 BE 选择失败的问题。
- 修复了 JSON 摄入在输入字段顺序与表 schema 不同时,按位置而非按名称映射 STRUCT 子字段的问题。
- 修复了 workload group 查询在内存预留尚不可用时被恢复执行、从而绕过预期暂停行为的问题。
- 修复了 FE master 切换导致最终结果包丢失时,客户端查询挂起直至 socket 超时的问题。
- 修复了多计算组部署中,当选中来自其他计算组的 BE 时,事务型
INSERT INTO ... VALUES以空指针失败的问题。 - 修复了
ADD PARTITION失败后,若回滚在部分 catalog 更新已完成之后才开始,会残留过期分区元数据的问题。 - 修复了 vertical compaction 因可用缓冲容量计算错误而在大 rowset 上耗尽内存的问题。
- 修复了未显式指定写入格式属性的迁移 Iceberg 表被以错误文件格式读取的问题,并修复了 Iceberg 写入忽略已配置的
object-store.path数据位置的问题。 - 修复了 Iceberg V3 行血缘表上
COUNT DISTINCT结果错误的问题,并修复了 position-delete 文件写入时缺少必需的 Iceberg field ID 的问题。 - 修复了 Iceberg 写入在分区值包含需要 URL 编码的字符时失败的问题,并修复了大批量排序 Iceberg 写入在落盘中间数据后失败的问题。
- 修复了 SQL Server JDBC catalog 在使用较新版本 Microsoft JDBC 驱动时,
SHOW DATABASES遗漏内置 schema 的问题。 - 修复了 Paimon JDBC 系统表查询在通过原生 Paimon 扫描路径执行时以
No suitable driver found失败的问题。