【发布时间】:2010-12-22 09:45:14
【问题描述】:
在我看来这个问题没有准确的答案,因为需要过于复杂的分析和深入研究我们系统的细节。
我们有分布式传感器网络。信息收集在一个数据库中并进一步处理。
当前的数据库设计是每月对一个巨大的表进行分区。我们尝试将其保持在 10 亿条记录(通常是 600-8 亿条记录),因此填充率是每天 20-5000 万条记录。
数据库服务器目前是 MS SQL 2008 R2,但我们从 2005 年开始并在项目开发期间升级。
表本身包含 SensorId、MessageTypeId、ReceiveDate 和 Data 字段。当前的解决方案是将传感器数据保留在 Data 字段(二进制,16 字节固定长度)中,并部分解码其类型并将其存储在 messageTypeId 中。
我们有不同类型的传感器发送的消息类型(当前大约 200 个),并且可以根据需要进一步增加。
主要处理在应用服务器上完成,它按需获取记录(按类型、sensorId 和日期范围),对其进行解码并执行所需的处理。目前的速度对于这样的数据量来说已经足够了。
我们要求将我们系统的容量增加 10-20 倍,我们担心我们目前的解决方案能够做到这一点。
我们还有两个“优化”结构的想法,我想讨论一下。
1 Sensor的数据可以分为几种类型,为简单起见,我将使用2种主要的:(值)级别数据(具有值范围的模拟数据),状态数据(固定数量的值)
所以我们可以使用以下规则将我们的桌子重新设计成一堆小桌子:
对于每个固定类型值(状态类型),使用 SensorId 和 ReceiveDate 创建它自己的表(因此我们避免存储类型和二进制 blob),所有依赖(扩展)状态都将存储在自己的表中,类似于外键,因此,如果我们有
State的值A和B,以及它的依赖(或附加)状态1和2,我们以表StateA_1、StateA_2、StateB_1、@ 结尾987654329@。所以表名由它所代表的固定状态组成。对于我们创建单独表的每个模拟数据,它与第一种类型相似,但包含带有传感器值的附加字段;
优点:
- 仅存储所需的数据量(目前我们的二进制 blob 数据包含最长值的空间)并减少了数据库大小;
- 为了获取特定类型的数据,我们获取访问权限表,而不是按类型过滤;
缺点:
- AFAIK,它违反了推荐的做法;
- 需要框架开发来自动化表管理,因为手动维护它是 DBA 的地狱;
- 表的数量可能相当大,因为需要完全覆盖可能的值;
- 在引入新传感器数据或什至已定义状态的新状态值时,数据库架构会发生更改,因此可能需要复杂的更改;
- 管理复杂容易出错;
- 在这种表组织中插入值可能是 DB 引擎地狱?
- 数据库结构不固定(不断更改);
可能所有缺点都超过了一些专业人士,但如果我们获得显着的性能提升和/或(不太受欢迎但也很有价值)存储空间,也许我们会遵循这种方式。
2 可能只是为每个传感器拆分表(大约 100 000 个表)或更好地根据传感器范围和/或移动到具有专用服务器的不同数据库,但我们希望尽可能避免硬件跨度。
3 保持原样。
4 切换到不同类型的 DBMS,例如面向列的 DBMS(HBase 和类似的)。
你怎么看?也许您可以推荐资源以供进一步阅读?
更新: 来自传感器的某些数据即使延迟一个月(通常延迟 1-2 周)也能到达的系统性质,有些始终在线,有些传感器具有板载内存并最终上线。每个传感器消息都有相关的事件引发日期和服务器接收日期,因此我们可以区分最近的数据和前一段时间收集的数据。处理包括一些统计计算,参数偏差检测等。我们构建了聚合报告以便快速查看,但是当我们从传感器更新旧数据(已经处理)中获取数据时,我们必须从头开始重建一些报告,因为它们取决于所有可用的不能使用数据和聚合值。所以我们通常会保留 3 个月的数据以便快速访问和其他存档。我们努力减少存储数据的需求,但决定我们需要这一切来保持结果的准确性。
更新2:
此处的表格包含主要数据。正如我在 cmets 中提到的,我们在“需要速度”期间删除了所有依赖项和约束,因此它仅用于存储。
CREATE TABLE [Messages](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[sourceId] [int] NOT NULL,
[messageDate] [datetime] NOT NULL,
[serverDate] [datetime] NOT NULL,
[messageTypeId] [smallint] NOT NULL,
[data] [binary](16) NOT NULL
)
来自其中一台服务器的样本数据:
id sourceId messageDate serverDate messageTypeId data
1591363304 54 2010-11-20 04:45:36.813 2010-11-20 04:45:39.813 257 0x00000000000000D2ED6F42DDA2F24100
1588602646 195 2010-11-19 10:07:21.247 2010-11-19 10:08:05.993 258 0x02C4ADFB080000CFD6AC00FBFBFBFB4D
1588607651 195 2010-11-19 10:09:43.150 2010-11-19 10:09:43.150 258 0x02E4AD1B280000CCD2A9001B1B1B1B77
【问题讨论】:
-
嗨尼克。你只讲输入数据和存储思路。理想情况下,形式遵循功能,因此 100 万美元的问题是:您对数据做了什么?您将获得更好的建议来实现您关心的目标,而不是与您的最终目标无关的存储想法。
-
感谢您的回复,沃宾爵士。如果用三个词来描述:我们会处理它:) 我更新我的问题
标签: sql-server performance database-design data-warehouse