SonnetDB:批量写入的大小、背压与刷新策略

本文介绍 SonnetDB 的批量写入与刷新策略,重点是分别控制请求大小、等待队列和确认语义,而不是给出未经测量的吞吐承诺。

SQL 批量与类型化写入是不同入口

SQL 多行 VALUES 可以在一个 INSERT 中表达多行数据。类型化时序客户端则提供 SndbTimeSeriesClient、CreateWriter 与 WriteAsync 等入口。不能把某个客户端的批次上限直接套用成所有 SQL 或远程入口的统一限制。

当前 SndbTimeSeriesWriteOptions 中,BatchSize 默认 512,控制一次传输的点数;MaxBatchPoints 默认 8192,控制一次 WriteBatchAsync 可接收的点数,当前校验范围为 1...65536。输入更大时应由调用方有界拆分。

csharp 复制代码
using SonnetDB.Data.TimeSeries;

var options = new SndbTimeSeriesWriteOptions
{
    BatchSize = 512,
    MaxBatchPoints = 8192,
    MaxPendingBatches = 4,
    MaxRetries = 0
};

这里展示当前默认选项,不能将它当作特定硬件上的最佳参数。实际 BatchSize 的校验范围与 MaxBatchPoints 也不同,应分别核对。

背压不是无限缓存

MaxPendingBatches 控制等待批次数,达到上限时写入方异步等待。它既不是按字节计算的完整内存预算,也不证明任意生产者输入都可以无限缓存。

调参时应同时记录批次字节数、点数、等待时间、服务端延迟及分配压力。固定行数的批次可能因字符串长度、TAG 数量或字段数不同而有很不一样的内存和传输成本。

刷新策略不能冒称事务或关闭 WAL

当前客户端选项有 None、Async、Sync 刷新模式。嵌入式批次完成后,Async 路径调用 SignalFlush,Sync 路径调用 FlushNow;None 表示不附加该批次主动刷新动作,不等于"无 WAL 模式"。

远程 Frame 与 REST 路径会传递刷新选择,其运行时及故障恢复边界仍须单独验收。批次确认、WAL 持久化、Segment 刷新和多语句事务是不同层次,不能凭一个 flush 选项就宣称所有写入原子提交。

响应丢失时保留未知

MaxRetries 默认 0。请求报错或响应丢失时,服务端可能已经接受部分或全部数据。只有明确核过业务幂等语义后,才考虑启用重试;逐项结果和整体调用异常应分别处理。

本文不保留原稿中未经当前证据支持的"每秒数十万行"、固定延迟表或 BEGIN BATCH 示例。需要性能结论时,应在指定版本、数据模型、硬件、确认策略和故障场景下单独测量。封面为写入流程示意,不代表实测性能。

本文依据 2026-10-17 当前源码复核;本轮未执行数据库、基准或生产恢复验证。

依据:TimeSeriesWriteModels.cs、SndbTimeSeriesClient.cs 与 SqlParser.cs。

相关推荐
weixin_460443562 小时前
Java+Linux私有化训考平台:服务、数据库与终端部署结构解析
java·linux·数据库·私有化部署·企业培训考试系统·企业考试系统
编程火箭车2 小时前
MySQL 拥抱 AI:向量、RAG、AutoML 全进了数据库
数据库·mysql·ai编程·向量数据库·rag·automl·mysql9
用户8662978480083 小时前
KingbaseES 中文乱码、排序不对?区域和字符集的问题,一次说清
数据库
aruo3 小时前
回退旧镜像之前,先确认数据库还能兼容
数据库
张洛闻Eren3 小时前
Ansible【第三课】:管理变量和事实
数据库·oracle
weixin_382395234 小时前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite
l1t4 小时前
DeepSeek总结的 DuckDB 2.0 文档新内容
服务器·网络·数据库
IvorySQL5 小时前
PostgreSQL 日报| PG19 主备切换挂起修复(10 月 17 日)
数据库·postgresql
roman_日积跬步-终至千里5 小时前
【数据Agent论文·查询与语义|11】EntSQL:给了业务文档,模型为何还是写不对SQL?
数据库·人工智能·sql·数据分析