小编son*_*ard的帖子

处理 10 亿行并计数的数据库设计

我们以大约 5000 pr 的速率接收实时 GPS 数据。分钟(来自 4 个 TCP 服务器)。每个服务器使用单个连接来插入数据,并在插入之间缓冲数据。每隔 15 分钟左右,服务就会获取这些数据,并将其处理为行程。一旦生成了行程,实际的 GPS 数据通常就不那么重要了,只有当用户想在地图上查看路线时才会如此。

问题是数据库似乎正在努力跟上插入数据的速度。有时,当负载增加时,插入时间突然急剧增加(> 30 秒),这反过来又允许缓冲更多数据,从而导致更大的插入和更长的插入持续时间。

我希望得到一些关于当前设计的评论,一些我们必须提高性能的想法,以及我们一些问题的答案 - 以及人们可能有的任何其他提示!

当前设计

数据目前被分成代表一周的表格,并且超过一年的数据被存档到辅助数据库中。整个事情在一个可编辑的视图中连接在一起,用于插入和读取。

餐桌设计

  • Id(PK,唯一标识符)
  • 设备 ID(FK,整数)
  • PersonId (FK, int)
  • VehicleId(FK, int)
  • TokenId (FK, int)
  • UtcTime (PK, datetime2(3))
  • 纬度(浮动)
  • 经度(浮动)
  • 速度 (smallint)
  • 标题 (smallint)
  • 卫星(tinyint)
  • IOData (varbinary(100))
  • IgnitionState (tinyint)
  • 用户输入 (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。

想法

  • 将存储在主数据库中的数据量限制为最多 …

performance database-design sql-server vldb

10
推荐指数
1
解决办法
5680
查看次数

标签 统计

database-design ×1

performance ×1

sql-server ×1

vldb ×1