---
title: 'Databend 产品更新：从 Spatial Index Join 到 Eval 数据管道'
date: 2026-08-04
slug: category-product/spatial-join-eval-pipeline
cover_url: 'https://static.databend.cn/img/202608/20260804-monthlyreport78-CN.png'
description: '本文梳理 2026 年 6–7 月 Databend 及 Databend Cloud 的重点更新，并基于一条真实的模型 Eval 观测数据管道，实战演示如何将这些新能力有机串联。'
tags: [databend, monthly]
category: Product
authors:
  - DatabendLabs
---

过去两个月，Databend 的技术迭代沿着三大方向加速推进：从让优化器更精准地理解数据，到推动空间索引从扫描剪枝跨越至 Join 优化，再到持续扩充 Paimon、Iceberg 等开放湖仓生态。与此同时，80 余项 Bug 修复进一步清除了查询正确性、执行稳定性与升级兼容性上的问题。

本文梳理 2026 年 6–7 月 Databend 及 Databend Cloud 的重点更新，并基于一条真实的模型 Eval 观测数据管道，实战演示如何将这些新能力有机串联。

{/* truncate */}

## 两个月，182 项更新

从 `v1.2.916-nightly` 到 `v1.2.930-nightly`，加上 7 月发布的两个 patch 版本，Databend 主仓库在 2026 年 6–7 月共发布：

- 15 个 nightly 版本：6 月 11 个，7 月 4 个

- 2 个 patch 版本：均发布于 7 月

按 release note 统计，两个月累计合并约 182 项更新：

- 40 个新功能

- 80 个 bug 修复

- 33 项重构

- 18 项维护工作

- 9 项 CI / 构建改进

- 1 项文档更新

- 1 份 RFC

修复仍然占据最大比重，但这次更新并不只是稳定性迭代。优化器统计、Spatial Index Join 和 Paimon Catalog 都代表了明确的新方向。

## 优化器统计：从“估一个大概”到更接近真实分布

查询优化器需要根据数据分布决定 Join 顺序、扫描方式和算子组合。如果统计信息不准确，尤其是在数据倾斜或高频值明显的情况下，即使 SQL 不变，也可能得到代价很高的执行计划。

这两个月，Databend 对统计模块进行了集中升级：

- KLL Histogram：RFC 定义了基于 KLL Sketch 生成 `ANALYZE` 直方图的方案，并完成实现。它在统计精度与内存占用之间取得了更好的平衡。

- Count-Min Sketch：以较低的空间成本估算值的出现频率，帮助优化器识别高频值和数据倾斜。

- Top-N 选择率估算：利用 Top-N 统计改进等值条件的选择率判断，并在数据追加后自动刷新。

- 在 `EXPLAIN` 中展示剪枝 IO：执行计划现在能够直接显示剪枝阶段的 IO 代价，索引减少了多少扫描不再只能靠推测。

对于使用者，这类更新通常表现为“无须修改 SQL，但计划更合理”。对完成过 `ANALYZE` 的表，等值过滤和范围过滤的行数估算会更接近真实数据分布。

```SQL
ANALYZE TABLE events;

EXPLAIN
SELECT *
FROM events
WHERE user_id = 42;
```

## 空间分析：索引开始参与 Join

上一阶段，Databend 已经可以使用空间索引进行扫描剪枝。这次更新继续向前一步：**空间索引开始参与连接计算**。

典型的空间关联查询，例如“找出位于每个行政区域内的兴趣点”，如果直接对两张表逐行执行几何判断，数据量增长后代价会迅速上升。基于 R-Tree 的 Spatial Index Join 可以先缩小候选范围，再执行精确的空间关系计算。

本次主要更新包括：

- 单机 Spatial Index Join：利用 R-Tree 加速空间关联，避免对两张表进行完整的两两比较。

- 分布式 Broadcast Spatial Join：在集群中广播较小的空间表，提升大表关联小空间表时的执行效率。

- 更低的 Geometry 处理开销：通过流式提取 bounding box 避免整体反序列化，并使用 geozero 直接从 EWKB Header 读取 SRID。

同时，Join Planning 中原有的 spatial runtime filters 已被移除，并补充了空间连接的正确性回归测试。

```SQL
SELECT
    r.region_name,
    p.name
FROM regions AS r
JOIN pois AS p
    ON ST_CONTAINS(r.boundary, p.location);
```

## 开放湖仓：新增 Paimon Catalog

湖仓生态中最重要的进展是 Paimon Catalog 接入，而且这项能力来自社区贡献。

Databend 现在可以直接读取 Paimon 表，并支持分布式写入。已经使用 Paimon 构建数据湖的团队，可以在保留现有存储和表格式的情况下，将 Databend 接入分析链路，减少数据复制和中间转换。

Iceberg 兼容性也得到进一步完善：

- 修复谓词下推过程中未保留受支持谓词合取项的问题，让下推更加完整。

- 在 CI 中增加对 Iceberg Variant Metadata 读取的覆盖，降低兼容性回归风险。

这些改动延续了 Databend 对开放表格式的支持方向：让计算引擎可以直接连接已有湖仓，而不是要求团队先迁移数据。

## 数据加载与导出：补齐数据“出口”

相较于已经较为完整的导入能力，这两个月的更新重点补强了数据导出和文件可追溯性。

### 更多 Unload 格式

`COPY INTO @stage` 新增 Avro 和 ORC 导出；Arrow 也可以直接作为 Stage 文件格式使用。对于已经采用 Arrow 传输链路的系统，这可以减少一次不必要的格式转换。

```SQL
COPY INTO @stage/out
FROM events
FILE_FORMAT = (TYPE = ORC);
```

### 更可靠的 Schema 推断与文件追踪

NDJSON Schema 推断得到改进。同时，Stage 增加了一组文件级元数据列：

- `metadata$file_path`

- `metadata$file_basename`

- `metadata$file_content_key`

- `metadata$file_last_modified`

`metadata$filename` 对 CSV、Text、NDJSON 和 Avro 也会返回 Stage 相对路径。发生数据异常时，可以直接定位记录来自哪个文件、何时进入系统。

```SQL
SELECT
    metadata$file_path,
    metadata$file_last_modified,
    $1
FROM @stage/in (FILE_FORMAT => 'ndjson');
```

## SQL 与数据管道：减少日常操作中的绕路

这次更新还包含一组面向日常开发的改进：

- `ILIKE`：支持大小写不敏感的模式匹配，不再需要手动组合 `LOWER()`。

- PostgreSQL 聚合语法兼容：降低 PostgreSQL 查询迁移时的改写成本。

- Stream Backlog：新增 Backlog API 和表函数，并通过快照逻辑变更计数改进估算。

- Materialized CTE：为需要复用中间结果的查询提供更明确的执行语义。

- 虚拟列开放到社区版：让半结构化数据的常用字段可以更高效地参与查询。

- Time Travel 快捷路径：新增 `NO_CHECK` 快照查找，并利用 UUID v7 进行时间戳导航。

```SQL
SELECT *
FROM logs WHERE msg ILIKE '%timeout%';
SELECT * FROM stream_backlog('my_stream');
```

## 存储与执行：让批量写入和后台维护更平稳

在存储与表管理方面，更新重点集中在并行执行、聚簇维护和资源峰值控制。

### Multi Insert 支持分布式写入

`INSERT ALL` 和 `INSERT FIRST` 等一条语句写入多张表的场景，过去写入阶段集中在单节点执行。现在，写入任务可以分散到多个 Fragment 并行运行，各节点产生的 Commit Metadata 最终由 Root Fragment 汇总并统一提交。

这让大批量、多目标表写入能够更充分地利用集群资源。

### 聚簇与存储维护

- 增加聚簇深度百分位指标。

- 有序任务可以跳过不必要的 Partial Sort。

- 移除旧版 Hilbert Clustering 实现。

- 引入新的 Parquet Writer，并针对公共前缀优化字符串统计长度。

- Vacuum2 改为增量删除 Block，降低峰值开销。

- 限制并发 IO 操作数量，避免瞬时请求打满存储层。

## 安全与治理：收紧网络出口和租户边界

这两个月的安全更新主要围绕外部访问控制与多租户隔离展开：

- Endpoint Egress Policy：支持 Allowlist 模式的 `endpoint_url_policy`，限制查询能够访问的外部端点。

- Stage 路径遍历防护：增加 Stage Path Traversal Policy，并将相关开关从 Settings 移至 Config 层。

- 连接信息脱敏：进一步隐藏日志和错误信息中的连接凭据。

- 租户隔离修复：处理 Session Tenant Override、HTTP Session State 隔离，以及 Reload Race 期间可能出现空 Role Cache 等边界问题。

这些能力对生产环境尤其重要：系统不仅要能够访问外部数据，还需要明确限定数据可以流向哪里，以及不同租户之间如何保持隔离。

## Databend Meta：用 Lua 编排事务

Databend Meta 新增 Lua Transaction 支持，可以通过 Lua 脚本编排 Meta 上的事务操作。配合 `metactl.now_ms()` 单调时钟，以及按顺序执行 Lua 源文件的能力，运维和元数据自动化拥有了更灵活的编程接口。

底层工程也在持续更新：

- 新增 Protobuf Storage Variants，并消除 Proto 编码失败路径。

- 继续拆分 Key Error Builder。

- 解耦 Index 与 Database 的 Create Option。

- 按 ID 拆分 Dictionary 更新。

- 为 metabench 增加 Bulk Load 与 Random Read 基准。

## 稳定性：80 个修复主要解决了什么

如果把 80 个 bug 修复按影响归类，可以看到几个清晰的重点。

### 避免查询崩溃或卡死

- 修复深层嵌套表达式引发的 Stack Overflow（SIGSEGV）。

- 修复 Runtime 析构阶段可能出现的自死锁。

- 修复 Recluster 因 Block 大小估算不一致陷入死循环的问题。

### 收敛结果正确性的边界

- 修复 `UNNEST` 处理 Nullable Array / Variant 时的问题。

- 修复 Date / Timestamp 算术溢出时的定义域计算。

- 修复 `GROUPING SETS` 中 SELECT Alias 遮蔽列的问题。

- 子查询返回空结果时，变量会被正确设置为 `NULL`。

### 避免 Join 与谓词优化走错路径

- 修复等值 Hash Join 错误退化为 Nested Loop Join。

- 改进单行不等式 Join 的安全处理。

- 修复 Null-Safe Join Key 被 Null Filter 规则丢弃的问题。

- 修复 Filter 下推过程中 Union Coercion 丢失的问题。

### 提升升级兼容性

- 恢复对 Legacy Bincode v4 Segment 的读取支持。

- 恢复 Cluster Stats Pages 的回滚兼容性。

- 保证 Commit Metadata 中 HLL 行数统计的确定性。

这些修复单独看并不显眼，但它们决定了长时间运行的查询、管道和升级流程是否可信。

## 实战：构建一条模型 Eval 观测数据管道

下面用一个实际场景串联 Stage 元数据、Variant、Stream、Task 和 Stream Backlog：把模型评测产生的观测数据构建成一条自动清洗管道。

数据流如下：

```Plaintext
Eval JSON → S3 Stage → Raw Table → Stream → Clean Task → Clean Table
```

模型 Eval 的观测数据首先以 NDJSON 文件写入 S3。Task 定时将新文件加载到 Raw Table，Stream 捕获新增记录，另一个 Task 消费增量并将嵌套 JSON 展开为结构化数据。

### 1. 加载原始数据并记录来源

Raw Table 使用 `VARIANT` 保存完整 Payload，同时记录来源文件和加载时间。这让后续分析可以追溯到具体的 Eval 文件。

```SQL
CREATE TABLE eval_raw (
    payload   VARIANT,
    file_path STRING,
    loaded_at TIMESTAMP
);

COPY INTO eval_raw
FROM (
    SELECT
        $1,
        metadata$file_path,
        NOW()
    FROM @eval_stage (FILE_FORMAT => 'ndjson')
);
```

### 2. 用 Stream 捕获新增数据

```SQL
CREATE STREAM eval_stream ON TABLE eval_raw;
```

Stream 让清洗任务只处理新增变化，避免重复扫描整张 Raw Table。

### 3. 展开 JSON 并写入 Clean Table

Databend 可以通过路径表达式访问 `VARIANT` 字段，使用 `::` 完成类型转换，并用 `FLATTEN` 展开数组。

```SQL
INSERT INTO eval_clean
SELECT
    payload:model_name::STRING   AS model_name,
    payload:eval_id::STRING      AS eval_id,
    payload:timestamp::TIMESTAMP AS eval_time,
    sample:input::STRING         AS input,
    sample:score::DOUBLE         AS score,
    sample:passed::BOOLEAN       AS passed
FROM eval_stream,
LATERAL FLATTEN(input => payload:samples) AS sample
WHERE payload:model_name IS NOT NULL;
```

### 4. 监控清洗任务是否跟得上

```SQL
SELECT *
FROM stream_backlog('eval_stream');
```

如果 Backlog 持续增长，说明清洗 Task 的执行频率或计算资源需要调整。Stage 元数据负责来源追踪，Stream 负责增量捕获，Stream Backlog 则提供管道积压的直接观测。

支撑这条管道的 Private Task 在 6–7 月也完成了一系列可靠性修复，包括：

- 让 Task History 与 Databend Cloud 保持一致。

- 解开失败 Task Run 的卡死状态。

- 在 `ALTER SET` 时保留 Task 选项。

- 删除 Task 时取消正在运行的 Task Run。

- 触发所有已经就绪的后继 Task。

- 改进 Task Run 的追踪能力。

对于需要长期自动运行的数据管道，这些行为边界往往比单个新语法更重要。

## Databend Cloud Agent 进入内测

Cloud Agent 是嵌入 Databend Cloud 控制台的 AI 助手，目前正在内测，后续将逐步开放试用。

用户可以使用自然语言提出任务，Agent 通过 21 个能力域、约 110 个工具，在控制台内执行数据查询、集群管理、账单排查、数据同步和图表可视化等操作。它的目标不只是回答“应该怎么做”，而是进一步完成实际操作。

## 客户端与驱动更新

主仓库之外，客户端和驱动也完成了配套迭代。

### bendsql

- `v0.34.1`（7 月 8 日）：新增 Python 3.14 支持与密钥对认证；修复 CLI 将 `BEGIN ... END` 脚本块按内部分号错误切分的问题。

- `v0.34.2`（7 月 16 日）：修复 Node.js Windows 构建。

### databend-jdbc

`v0.4.7` 和 `v0.4.8` 于 7 月 14 日发布，重点包括：

- 接入 Arrow HTTP Result 与分页预取。

- Arrow 格式支持 Decimal。

- 支持 Auto Presign。

- 从 databend-client 解耦。

- 改进 Session / Presign 错误处理与指数退避重试。

这些更新未必会出现在功能演示的第一屏，却直接影响应用接入 Databend 时的稳定性和开发体验。

## 结语

回看 6–7 月，Databend 一边继续收敛生产环境中的正确性与稳定性问题，一边扩展优化器、空间分析和开放湖仓能力。优化器开始用 KLL Histogram、Count-Min Sketch 和 Top-N 更准确地理解数据；空间索引从扫描剪枝进入 Join；Paimon 通过社区贡献接入 Databend；Stage、Stream 和 Task 则逐渐组合成更完整的数据管道能力。

这些改进也让 Databend 更适合 Agent Trace 场景。Agent 运行会持续产生结构多变的 Prompt、Tool Call、Span、延迟、Token 消耗和 Eval 结果。Databend 可以用 `VARIANT` 保留原始 Trace，通过 Stream 与 Task 增量处理，并利用列式分析、数据剪枝和 Time Travel 完成聚合、排障与回放。

Databend 的优势不只是存储 Trace，而是把接入、处理、Eval、查询和长期留存放在同一套系统中。它面向 Data Agent 提供统一的数据基础设施，在一个 S3 原生、弹性的数据仓库中承载 SQL 分析、JSON 与全文搜索、向量检索，以及 Agent Trace 和 Eval 工作负载。相关能力已在中国头部 AI 公司的大规模生产场景中得到验证。

Databend 是一款面向现代数据与 AI 工作负载的开源云原生数据仓库，欢迎参与社区讨论、贡献和产品试用：

- 官网：[databend.cn](https://www.databend.cn/)

- 文档：[docs.databend.cn](https://docs.databend.cn/)

- GitHub：[databendlabs/databend](https://github.com/databendlabs/databend)




