【发布时间】:2020-11-29 00:20:15
【问题描述】:
我们的应用程序为客户的远程设备显示近乎实时的物联网数据(最多 5 分钟间隔)。
最初的试点项目始终将每个设备读数存储在 SQL Server 2008 数据库上的简单“测量”表中。 该表如下所示:
Measurements: (DeviceId, Property, Value, DateTime).
在一两年内,每个设备的表中可能会有 100,000 条记录,查询通常分为两类:
- “设备最新值”(95% 的查询):仅查看最新值
- “设备每日快照”(5% 的查询):查看每天的单个代表值
我们现在正在扩展到 5000 台设备。 Measurements 表现在很小,但对于这 5000 台设备,很快就会有 50 亿条左右的记录。
该应用程序的读取量非常大,经常运行的查询尤其关注“设备最新值”。
[编辑 #1:减少基于意见的内容]
我们可以使用哪些数据库设计技术来优化“最新”物联网值的快速读取,给定一张包含多年“历史”物联网值的大表?
我们团队的一个建议是将MeasurementLatest 和MeasurementHistory 存储为两个单独的表。
[编辑#2:回应反馈]
在我们的测试数据库中,以 5000 万条记录为种子,并应用了以下索引:
CREATE NONCLUSTERED INDEX [IX_Measurement_DeviceId_DateTime] ON Measurement (DeviceId ASC, DateTime DESC)
一个典型的“获取设备最新值”查询(例如下面)仍然需要超过 4,000 毫秒才能执行,这对于我们的需求来说太慢了:
SELECT DeviceId, Property, Value, DateTime
FROM Measurements m
WHERE m.DateTime = (
SELECT MAX(DateTime)
FROM Measurements m2
WHERE m2.DeviceId = m.DeviceId)
【问题讨论】:
-
虽然它仍然太宽泛,但您的问题没有一个答案(这是 SO 的前提),有多种可能性,每种可能性都可以很好地解决问题。事实上,没有任何迹象表明您当前的设计(具有正确的索引等)会表现不佳。
标签: sql-server database-design iot database-performance