聚合查询决定了时序数据库能否支撑仪表盘、报表和规则引擎。SonnetDB 的聚合基准以 100 万点全量数据为输入,按 60,000 ms 窗口生成约 16,667 个时间桶,并对每个桶计算常见统计指标。
本轮聚合基准对比 SonnetDB Core、SQLite、InfluxDB、TDengine 与 SonnetDB Server 在同一数据集上的时间桶聚合能力。测试重点不是单个 avg 函数的算法开销,而是完整 SQL 路径:解析、过滤、分桶、聚合、结果构建和输出。
对生产场景而言,这个测试接近“过去两周按 60,000 ms 采样的均值趋势图”的常见查询。它能体现数据库是否能在大结果集上稳定执行时间分桶,而不是只在小窗口查询里表现好。
| 组别 | 对照对象 | 当前状态 |
|---|---|---|
| 嵌入式 | SonnetDB Core | 已实现,AggregateBenchmark.SonnetDB_Aggregate_1Min |
| 嵌入式 | SQLite | 已实现,整数除法分桶 + SQL 聚合 |
| 嵌入式 | LiteDB | 已实现,AggregateBenchmark.LiteDB_Aggregate_1Min,文档顺扫 + 进程内分桶 |
| 服务端 | SonnetDB Server | 已实现,ServerAggregateBenchmark |
| 服务端 | InfluxDB 2.7 | 已实现,Flux aggregateWindow |
| 服务端 | TDengine 3.3.4.3 | 已实现,60,000 ms 时间窗口 |
| 服务端 | Apache IoTDB | 已实现,GROUP BY ([start,end), 60000ms) 时间窗口 |
| 服务端 | PostgreSQL/TimescaleDB | 已实现,time_bucket('1 minute', time) |
标准查询:
SELECT avg(value), min(value), max(value), count(value)
FROM sensor_data
WHERE time >= <start> AND time < <end>
GROUP BY time(60000ms);
运行命令:
$env:SONNETDB_BENCH_URL="http://localhost:5081"
dotnet run -c Release --project tests/SonnetDB.Benchmarks -- --filter *Aggregate*
dotnet run -c Release --project tests/SonnetDB.Benchmarks -- --filter *ServerAggregate*
dotnet run -c Release --project tests/SonnetDB.Benchmarks -- --filter *IoTDB_Aggregate_1Min*
dotnet run -c Release --project tests/SonnetDB.Benchmarks -- --filter *TimescaleDB_Aggregate_1Min*
| 方法 | 平均耗时 | 分配 | 时间桶数 | 备注 |
|---|---|---|---|---|
| SonnetDB Core 60,000 ms 聚合 | 12.18 ms | 3.84 MB | ~16,667 | 嵌入式基线 |
| SQLite 60,000 ms 聚合 | 387.64 ms | 2.50 MB | ~16,667 | SQL 分桶对照 |
| LiteDB 60,000 ms 聚合 | 1,550 ms | 2,037.76 MB | ~16,667 | 文档顺扫 + 进程内 AVG/MIN/MAX/COUNT |
| InfluxDB 60,000 ms 聚合 | 122.05 ms | 47.25 MB | ~16,667 | Flux 聚合 |
| TDengine 60,000 ms 聚合 | 93.16 ms | 4.10 MB | ~16,667 | TSDB 时间窗口 |
| Apache IoTDB 60,000 ms 聚合 | 866.1 ms | 4.38 MB | ~16,667 | REST v2 SQL,GROUP BY 时间窗口 |
| PostgreSQL/TimescaleDB 60,000 ms 聚合 | 90.43 ms | 0.01 MB | ~16,667 | time_bucket;分配为客户端托管分配 |
| SonnetDB Server 60,000 ms 聚合 | 205.6 ms | 2.76 MB | ~16,667 | HTTP SQL |
聚合报告应避免只强调最短耗时,也要展示内存分配和结果桶数量。若数据库只返回单一 avg 而没有同时计算 min/max/count,需在表格备注中标清语义差异。