Stories

Detail Return Return

Databend 十月月報:存儲過程正式可用,數據流程全面自動化 - Stories Detail

Hi,Databend 的朋友們!🚀

十月,我們專注於生產自動化的落地。存儲過程正式可用並移除了實驗性標記,SQL 腳本引擎支持 dynamic schema introspection,能夠處理複雜的 ETL 流程。同時,我們發佈了 JSON 全文檢索的 inverted index、智能內存溢出控制,並全面升級了運維工具——本月共發佈了十一個版本。

月度數據

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. 創建數據庫和表

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. 插入樣例數據

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)的行人場景,同時允許按場景類型和天氣縮小範圍:

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. 運行存儲過程:篩選城市行人場景(任意天氣)

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://databend.cn 註冊體驗

總結

存儲過程的正式可用標誌着 Databend 邁入新的階段:從查詢引擎進化為完整的數據平台。用户可以在統一的 Rust 引擎上,用 Snowflake 兼容的 SQL 語法,處理結構化分析、半結構化搜索、向量檢索、地理空間分析和數據自動化——所有功能開箱即用,完全開源。

我們即將推出 table branching 功能,讓數據表像代碼一樣支持分支、測試和合並,敬請期待!

關於 Databend

Databend 是一款開源、彈性、低成本,基於對象存儲也可以做實時分析的新式湖倉。期待您的關注,一起探索雲原生數倉解決方案,打造新一代開源 Data Cloud。

👨‍💻‍ Databend Cloud:databend.cn

📖 Databend 文檔:docs.databend.cn

💻 Wechat:Databend

✨ GitHub:github.com/databendlab…

Add a new Comments

Some HTML is okay.