---
title: 'Databend 十月月报：存储过程正式可用，数据流程全面自动化'
date: 2025-11-07
slug: category-product/monthly-oct2025
cover_url: '20251013-wechat/oct.webp'
description: '十月，我们专注于生产自动化的落地。存储过程正式可用并移除了实验性标记，SQL 脚本引擎支持 dynamic schema introspection，能够处理复杂的 ETL 流程。同时，我们发布了 JSON 全文检索的 inverted index、智能内存溢出控制，并全面升级了运维工具——本月共发布了十一个版本。'
tags: [databend, monthly]
category: Product
authors:
  - DatabendLabs
---

# Databend 十月月报：存储过程正式可用，数据流程全面自动化

Hi，Databend 的朋友们！🚀

十月，我们专注于**生产自动化**的落地。存储过程正式可用并移除了实验性标记，SQL 脚本引擎支持 dynamic schema introspection，能够处理复杂的 ETL 流程。同时，我们发布了 JSON 全文检索的 inverted index、智能内存溢出控制，并全面升级了运维工具——本月共发布了十一个版本。

{/* truncate */}

## 月度数据

**22 个新功能**，**19 个 bug 修复**，**15 项重构**，**12 项维护更新**。

## 本月亮点

### 🔥 核心新功能

- **存储过程正式可用** —— 支持 dynamic schema introspection，移除实验性标记，内置完整的脚本能力
- **ANY JOIN 操作** —— INNER/LEFT/RIGHT ANY JOIN，高效的集合成员检查和半连接模式
- **JSON 全文搜索** —— inverted index 支持 Variant 内部字段扫描，半结构化数据的快速文本搜索
- **COPY 历史追踪** —— 新增 `copy_history` 系统表，记录所有 COPY 操作的完整历史
- **Vacuum 保护** —— 不可逆的 DROP 操作需要明确确认，防止误删数据
- **数学函数扩展** —— 新增 `isnan()` 和 `isinf()` 函数，用于 IEEE 754 浮点数验证

### ⚡ 性能与运维

- **智能内存溢出** —— BackpressureSpiller 在内存压力下协调提前溢出，防止 OOM
- **Pipeline 优化** —— 修正 max_threads 计算，根据 pipe 宽度合理调整并行执行
- **S3 智能分层** —— 增强 AWS S3 存储类转换支持，降低延迟波动
- **表达式解析加速** —— 复杂表达式的 SQL 解析更快
- **统计信息增强** —— `SHOW STATISTICS` 现在包含虚拟列统计和 min/max 值，查询规划更准确

### 🔧 Meta 服务改进

- **运维诊断** —— `databend-meta -V` 显示详细构建信息；新增 `metactl dump-raft-log-wal` 调试工具
- **I/O 计时** —— 追踪日志条目应用时间，快速定位性能瓶颈
- **RPC 整合** —— RpcHandler 统一计时指标，可观测性更好
- **原子化 watch 流** —— 修复 watch 流注册的竞态条件，集群更稳定

### 🐛 稳定性与可靠性

- **CSV 内存修复** —— 大型 CSV COPY 操作不再 OOM，得益于流式处理改进
- **JWT 优化** —— 更智能的密钥查找，避免不必要的 JWKS 刷新请求
- **Parquet 流式处理** —— 修复基表列类型变更时的反序列化错误
- **Grouping sets** —— 修正复杂 GROUP BY 操作的 shuffle 模式处理
- **行访问策略** —— 修复参数顺序和大小写敏感问题
- **NULL 约束** —— 列修改时的正确验证

### 🎯 默认配置

- **Geo 和虚拟列** —— 现在默认为所有新部署启用
- **MERGE INTO** —— 移除实验性标记；完全生产可用

### 🤝 社区

- 欢迎新贡献者 **@camilesing** 和 **@RiversJin** —— 感谢你们的参与！

## 核心功能：AI 训练数据自动化的存储过程

存储过程是十月的核心功能。SQL 脚本引擎支持 dynamic schema introspection 后，实验性标记也一并移除——现在开箱即用。你可以完全用 SQL 自动化复杂的数据处理流程，不再需要外部工具。

来看真实场景：自动驾驶模型训练。路测视频被提取成单帧，AI 自动标注每一帧（行人、车辆、天气、光照）。你需要根据特定条件筛选视频帧——比如"城市夜景有行人"或"雨天城市镜头"——来构建针对性的训练数据集。

这个教程演示了 `LET` 变量、`IF` 条件、临时表、子查询、多表聚合、`RETURN TABLE`——所有生产自动化需要的核心功能。

### Step-by-Step 教程

**1. 创建数据库和表**

```sql
CREATE DATABASE IF NOT EXISTS av_training;
USE av_training;

-- 视频帧标注表（AI 生成的标签）
CREATE TABLE video_frames (
    video_id STRING,
    frame_id INT,
    scene_type STRING,        -- 'urban', 'highway'
    has_pedestrian BOOLEAN,
    has_vehicle BOOLEAN,
    lighting STRING,          -- 'day', 'night', 'dusk'
    weather STRING,           -- 'clear', 'rainy', 'foggy', 'sunny'
    pedestrian_count INT,
    confidence FLOAT,         -- AI 标注置信度
    capture_date DATE
);
```

**2. 插入样例数据**

```sql
INSERT INTO video_frames VALUES
-- 城市夜景，有行人
('V001', 1, 'urban', true, true, 'night', 'clear', 2, 0.95, '2025-10-20'),
('V001', 2, 'urban', true, false, 'night', 'clear', 1, 0.92, '2025-10-20'),

-- 高速白天场景
('V002', 1, 'highway', false, true, 'day', 'sunny', 0, 0.98, '2025-10-21'),

-- 城市夜景雨天
('V003', 1, 'urban', true, true, 'night', 'rainy', 1, 0.89, '2025-10-22'),
('V003', 2, 'urban', true, false, 'night', 'rainy', 2, 0.91, '2025-10-22'),

-- 高速夜景（无行人）
('V004', 1, 'highway', false, true, 'night', 'clear', 0, 0.97, '2025-10-23'),

-- 城市白天场景
('V005', 1, 'urban', true, true, 'day', 'clear', 3, 0.88, '2025-10-24'),
('V005', 2, 'urban', true, false, 'day', 'foggy', 1, 0.93, '2025-10-24');
```

**3. 创建视频帧筛选存储过程**

这个存储过程保持业务逻辑简单：始终筛选高置信度（≥ 0.85）的行人场景，同时允许按场景类型和天气缩小范围：

```sql
CREATE PROCEDURE filter_training_frames(
    scene_filter STRING,       -- 'urban', 'highway', 'ALL'
    weather_filter STRING,     -- 'clear', 'rainy', 'ALL'
    date_from DATE,
    date_to DATE
)
RETURNS TABLE (
    scene_type STRING,
    lighting STRING,
    weather STRING,
    frame_count INT,
    pedestrians INT,
    avg_confidence DOUBLE,
    total_frames INT
)
LANGUAGE SQL
AS $$
BEGIN
    LET min_conf := 0.85;
    LET total_frames := 0;

    CREATE OR REPLACE TEMPORARY TABLE matched_frames AS
    SELECT
        video_id, frame_id, scene_type, lighting,
        weather, pedestrian_count, confidence
    FROM video_frames
    WHERE capture_date BETWEEN :date_from AND :date_to
      AND confidence >= min_conf
      AND (:scene_filter = 'ALL' OR scene_type = :scene_filter)
      AND (:weather_filter = 'ALL' OR weather = :weather_filter)
      AND has_pedestrian = true;

    LET total_frames := (SELECT COUNT(*) FROM matched_frames);

    IF total_frames = 0 THEN
        RETURN TABLE(
            SELECT NULL::STRING AS scene_type,
                   NULL::STRING AS lighting,
                   NULL::STRING AS weather,
                   0::INT AS frame_count,
                   0::INT AS pedestrians,
                   0.0::DOUBLE AS avg_confidence,
                   0::INT AS total_frames
        );
    END IF;

    RETURN TABLE(
        SELECT
            scene_type,
            lighting,
            weather,
            COUNT(*) AS frame_count,
            SUM(pedestrian_count) AS pedestrians,
            AVG(confidence) AS avg_confidence,
            :total_frames AS total_frames
        FROM matched_frames
        GROUP BY scene_type, lighting, weather
        ORDER BY frame_count DESC
    );
END;
$$;
```

**4. 运行存储过程：筛选城市行人场景（任意天气）**

```sql
CALL PROCEDURE filter_training_frames(
    'urban',                   -- 城市场景
    'ALL',                     -- 任意天气
    DATE '2025-10-20',
    DATE '2025-10-24'
);
```

**预期输出：**

```
scene_type | lighting | weather | frame_count | pedestrians | avg_confidence | total_frames
urban      | night    | rainy   |           2 |           3 |           0.90 |            6
urban      | night    | clear   |           2 |           3 |           0.94 |            6
urban      | day      | foggy   |           1 |           1 |           0.93 |            6
urban      | day      | clear   |           1 |           3 |           0.88 |            6
```

### 核心功能演示

**核心能力**

- `LET` 用于计数器/阈值，`IF` 提前退出，临时表
- 查询中的 `:variable` 插值和聚合的 `RETURN TABLE`

### 生产应用场景

这个模式适用于：

- **AI/ML 数据准备** —— 筛选和分析训练数据集
- **数据质量检查** —— 验证并报告数据问题
- **ETL 流水线** —— 多步骤转换与中间暂存
- **业务报表** —— 参数化报表与聚合
- **数据验证** —— 带提前退出的条件检查

了解更多：[存储过程与 SQL 脚本文档](https://docs.databend.cn/sql/stored-procedure-scripting/)

**以上完整示例可以在 https://databend.cn 注册体验**

## 总结

存储过程的正式可用标志着 Databend 迈入新的阶段：从查询引擎进化为完整的数据平台。用户可以在统一的 Rust 引擎上，用 Snowflake 兼容的 SQL 语法，处理结构化分析、半结构化搜索、向量检索、地理空间分析和数据自动化——所有功能开箱即用，完全开源。

我们即将推出 **table branching** 功能，让数据表像代码一样支持分支、测试和合并，敬请期待！

---

立即体验：https://databend.cn

_Databend 团队_
