我们以大约5000 pr的速率接收实时GPS数据。分钟(来自4个TCP服务器)。每个服务器使用单个连接来插入数据,并在两次插入之间缓冲数据。每隔15分钟左右,服务就会获取一次此数据,并将其处理为行程。生成行程后,仅当用户希望在地图上查看路线时,实际的GPS数据通常并不那么重要。
问题是数据库似乎在努力跟上插入数据的速度。有时,当负载增加时,插入时间突然急剧增加(> 30秒),这又使更多数据得以缓冲,从而导致更大的插入量和更长的插入时间。
我希望能对当前的设计发表一些评论,以及一些我们必须提高性能的想法,并回答我们的一些问题-以及人们可能拥有的其他技巧!
当前设计
当前将数据分为代表一周的表格,并且将早于一年的数据存档到辅助数据库中。整个事物在可编辑视图中连接在一起,该视图用于插入和读取。
桌子设计
- ID(PK,唯一标识符)
- DeviceId(FK,int)
- PersonId(FK,int)
- VehicleId(FK,int)
- TokenId(FK,int)
- UtcTime(PK,datetime2(3))
- 纬度(浮动)
- 经度(浮点)
- 速度(smallint)
- 标题(smallint)
- 卫星(tinyint)
- IOData(varbinary(100))
- IgnitionState(tinyint)
- UserInput(tinyint)
- CreateTimeUtc(datetime2(3))
指标
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc(集群)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
当前每个星期(包括索引)占用大约10 GB的数据,并且主数据库中目前大约有300 GB的数据。
主数据库中的数据表具有自己的文件组,其中包含1个文件,但它与主数据库中的所有其他表位于同一磁盘上。辅助数据库位于不同的磁盘上,但位于同一台计算机上。
我认为,当使用新的表分区(一周)时,我们每周还会运行一次索引重建作业。不执行收缩。
该计算机是具有12 GB内存的8核HP,并且包含主数据库的磁盘正在运行RAID 10。
主意
- 将存储在主数据库中的数据量限制为最多1个月。至少它可以使数据库更易于管理以进行备份/还原,但是通过这样做,我们可以期望看到性能的提高吗?
- 在文件组中为当前数据创建2个文件,并将它们分发到2个不同的物理分区中
- 创建保存当前数据的主从数据库,因此在不同数据库上执行插入和读取操作
- 将当前数据文件放在SSD磁盘上(镜像是否会对SSD磁盘产生任何性能差异?)
请让我知道是否需要更多信息。影响性能的因素很多,并且可能有许多调整方法。