我们有一个具有以下架构的表:
CREATE TABLE Measurement (
HubId bigint NOT NULL
,DeviceId bigint NOT NULL
,Timestamp datetime NOT NULL
,Value bigint NOT NULL
)
我们希望以每秒大约 100,000 条记录的速度将记录导入此表,这些记录将被拆分到多个并发连接中。我可以通过将表视为堆(即没有索引)并使用SqlBulkCopy
. 每秒有 100,000 个独特的HubId
和DeviceId
与Timestamp
递增的组合。Value
是随时间累积的。
我们还需要每秒读取两个最近的(在这种情况下是最后一个和倒数第二个 - 插入总是按顺序排列)值GROUP BY HubId, DeviceId
,但只针对生成的行的子集(用户感兴趣的行)最后两个值之间的实时差异。
此外,出于历史目的,我们需要将每 15 分钟一次的数据聚合成 15 分钟的切片。此数据基于前 15 分钟切片的最大值和当前 15 分钟切片的最大值进行聚合...这需要在整个数据集中发生,但可以拆分为多个连接以实现唯一性HubId
和DeviceId
组合。因为Value
是累积的,所以这实际上是前一个和当前 15 分钟切片的最后一个值。
批量插入带有索引的表会导致升级为独占表锁。此外,如果不升级到独占表锁,我们似乎无法执行查询。
任何人都可以给我一些关于构建这个的最佳方式的指示吗?我正在用头撞墙,试图找出最好的方法......
谢谢,院长