Oli*_*ver 14 database-design sql-server
我的任务是实施一个解决方案(应用程序和数据库)来存储来自巨大传感器阵列的数据样本。该阵列目前由大约 20,000 个传感器组成,但很快就会增长到 100,000 个传感器。每个传感器每 10 秒发送一个数据样本,每个样本的大小为 28 字节。
因此,进行求和会导致:
现在我一直想知道存储/检索数据的最佳方法是什么?我在指定软件后“加入”了这个项目,所以它需要在使用 SQL Server 的 Windows 平台上实现。
我目前的解决方案是创建一个带有两个表的数据库来存储数据样本。第一个用作第二个的索引,将整理的样本存储在每个传感器每天的二进制字段中:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
Run Code Online (Sandbox Code Playgroud)
基本上我会将来自所有传感器的样本写入临时文件(每个传感器 1 个)。在每天结束时,我将在表 1 中创建一个条目,使用生成的 RecordID 并将文件转储到表 2 中的数据字段中。
这样,我最终每天只有 100,000 个条目进入表,而不是 8.64 亿个条目。数据应该在 LAN 或高速 WAN 上可用,因此可以接受整天检索传感器数据。
尽管必须存储所有数据,但其中大部分数据可能永远不会被读取。所以表上的读取量不会比写入量多很多。
我知道我可以通过只存储数据文件的路径来使用文件系统来实现一些东西,但我读到 SQL Server 的性能优于 NTFS,而你的二进制字段则少了 256kB。(灰色区域存在于 256kB 和 1MB 之间,而对于大于 1MB 的二进制大小,NTFS 远远优于 SQL Server)。
我也有点担心将来自 100,000 个传感器的数据存储到它们自己的文件中,而不会导致文件系统出现问题,因为文件夹中有大量文件,或者每个文件夹中有几个文件的复杂树结构,而没有甚至考虑到文件碎片。
任何人都可以就上述问题向我提供一些实用的建议/评论吗?
我会陷入明显的陷阱吗?
样本数据确实压缩得很好。一个 242 kB 的文件压缩到大约 85 kB。但是,我可以在数据库级别实现某种类型的压缩,以便自动压缩示例数据(列)吗?
对于这个项目,SQL Server 是一个明显错误的选择吗?
我对两张桌子的设计是否明智,或者我可以将它组合成一个仍然与两张桌子一样“高性能”的桌子吗?
Dav*_*kle 12
是的,您很快就会遇到一个相当大的陷阱,那就是表的大小和维护。您说您想每天将数据放入临时表中,然后将其移动到永久表中,这在某种程度上是正确的,但是您很快就会遇到此方案的麻烦。
例如,假设您想在两年后“滚动”最旧月份的数据。在您的设计中,您必须针对您的大表发出 DELETE 语句。这可能会有点慢,具体取决于您拥有的索引数量。此外,它会导致索引碎片,解决这个问题的唯一方法是重建或重新组织这个非常大的表上的索引,这也会导致性能问题。大型单表类型设计还有很多其他问题。例如,对于一个大的单表,你不能做基于FILEGROUP的备份,这意味着如果你想对你的数据库进行完整备份,它会很大,并且需要很长时间才能完成。
解决办法是什么? 表分区. 在尽可能多的地方深入了解这一点。基本上,分区允许您将数据拆分为“表中的表”——每个分区共享相同的模式,并通过表对象访问,但可以以不同的方式进行索引和维护。分区基本上是表,由一些有用的键分割。在您的情况下,它可能是日期。它们可以像删除表一样(并且速度一样快),这意味着如果按日期对大数据表进行分区,则可以立即删除旧分区,而不会对任何其他分区上的索引产生不利影响。您可以将分区放在不同的文件组上,这意味着可以将旧分区滚出,或者滚到不常用的更便宜的商品存储上。最后但并非最不重要的是,在 SQL 2012 中,您在旧的只读分区上,同时在要插入所有传感器数据的活动分区上使用不同的、更面向插入的索引方案。
希望这可以帮助。您有大量关于分区和分区方案的研究要做,但希望现在您知道需要寻找的方向。
PS:哦,我忘了你的项目符号列表...答案 1、2 和 5。见上文。答案 3:在 SQL Server 中,您可以逐个分区进行压缩,因此请使用 PAGE 压缩积极地压缩旧分区。但我相信,如果您这样做,您的行外大数据类型将不会被压缩——同样,您可能希望通过规范化传感器值来缓解这个问题。答案 4:绝对不是,但如果您只想按天存储静态数据并且从不以任何其他方式对其进行搜索,压缩平面文件可能是一种更简单的方法。
PPS:哦,还有一件事。你不需要你的两桌解决方案来完成这一切。大型二进制传感器数据应该是 VARBINARY(MAX) 类型,因为它的值可以存储在“行外”但仍然是单个表中的列(请参阅sp_tableoption文档)。不过,您可能需要考虑从表中的二进制数据中规范化一些传感器数据,因为如果不这样做,除了按时间检索传感器数据块之外,您的数据库将无济于事。
归档时间: |
|
查看次数: |
7346 次 |
最近记录: |