地理空间数据是工业 IoT、车联网、物流冷链和户外设备监控中的高频需求。SonnetDB 已内置 GEOPOINT、空间谓词、轨迹聚合和段内 geohash 剪枝,因此地理空间基准单独成篇。
本轮地理空间基准以车辆轨迹为数据模型,在上海附近生成 16 个设备的连续移动点,测试圆形围栏、矩形边界框、轨迹长度和底层 GEOPOINT 范围扫描。该基准验证的不只是数学函数开销,还包括落盘 Segment 上的 geohash block 剪枝是否参与查询。
当前可执行基准聚焦 SonnetDB Core。PostGIS、TimescaleDB + PostGIS、TDengine 地理函数等横向对照需要额外服务编排,已列入后续补充项。
| 对照对象 | 当前状态 | 方案 |
|---|---|---|
| SonnetDB Core | 已实现,GeoQueryBenchmark |
GEOPOINT 字段 + geo_within / geo_bbox / trajectory_length |
| SonnetDB Server | 待补 | HTTP SQL 查询 + GeoJSON/NDJSON 消费 |
| PostgreSQL/PostGIS | 待补 | geometry(Point, 4326) + GiST/SP-GiST 索引 |
| TimescaleDB + PostGIS | 待补 | hypertable + PostGIS 空间索引 |
| TDengine | 待补 | 若使用原生地理函数,需映射等价语义 |
| InfluxDB | 待补 | 通常需 Flux 数学函数或客户端过滤,不作为原生空间库 |
标准查询:
SELECT time, position
FROM vehicle
WHERE geo_within(position, 31.2304, 121.4737, 1500);
SELECT count(position)
FROM vehicle
WHERE geo_bbox(position, 31.21, 121.45, 31.25, 121.50);
SELECT trajectory_length(position)
FROM vehicle
WHERE device = 'car_00';
运行命令:
dotnet run -c Release --project tests/SonnetDB.Benchmarks -- --filter *Geo*
| 方法 | 数据规模 | 平均耗时 | 分配 | 备注 |
|---|---|---|---|---|
SonnetDB geo_within |
100k | 29.49 ms | 24.05 MB | 圆形围栏 |
SonnetDB geo_bbox + count |
100k | 24.59 ms | 26.96 MB | 矩形范围 + 聚合 |
SonnetDB trajectory_length |
100k | 1.12 ms | 1.39 MB | 单设备轨迹聚合 |
| SonnetDB GEOPOINT range scan | 100k | 0.465 ms | 0.38 MB | 底层扫描参考 |
地理空间报告要把“当前 SonnetDB 自身基准”和“未来 PostGIS 横向对照”分开。没有 PostGIS 实测前,不宣称超越 PostGIS;只说明 SonnetDB 已在时序引擎内部完成空间类型、空间函数与轨迹聚合闭环。