【发布时间】:2016-05-27 09:55:54
【问题描述】:
我正在努力设计一个快速查询数据库。 我有几家工厂每 2 秒从 50 到 500 个传感器捕获数据,并将每个传感器的数据存储在 ROWS 中。 您可以想象每天和工厂的数据量从 2,16M 到 21,6M 行。 我必须使用 .NET,这部分我无法更改。
到目前为止,数据存储在每个工厂的 SQL Server Express 08R2 中,然后每小时发送到主服务器 SQL Server 08R2,并存储在每个工厂的单独数据库中。现在使用的设计是:
CREATE TABLE [dbo].[CalculatedValues](
[ID] [int] IDENTITY(1,1) NOT NULL, -- not useful at all.
[Date] [datetime] NOT NULL,
[Var] [varchar](20) NOT NULL,
[Value] [varchar](15) NOT NULL,
CONSTRAINT [PK_CalculatedValues] PRIMARY KEY NONCLUSTERED
( [ID] ASC )WITH (...) ON [PRIMARY]
) ON [PRIMARY]
CREATE UNIQUE CLUSTERED INDEX [IX_CalculatedValues_Date_Var] ON [dbo].[CalculatedValues]
( [Date] DESC, [Var] ASC )WITH (...) ON [PRIMARY]
值可以是 DECIMAL 或 BIT(boolean),因此该部分也可能发生变化。
桌面应用程序在某种程度上运行良好,必须在过去三个月的最坏情况下生成报告。 (大约需要 3 分钟)
现在需要一个 Web 应用程序,您可以想象必须以毫秒而不是秒为单位生成报告。由于用户可以选择从 X 到 Y 的日期,因此无法预先生成报告。
我正在考虑跟上 SQL Server 或更改为单节点 Cassandra(即使知道 3 个节点是发挥 Cassandra 优势的最低要求)。
我的问题是:我该如何重新设计它? 无法对值进行分组,因此无法应用规范化。 我正在考虑这样的事情:
TABLE CalculatedValues(
Date datetime PK,
ValueSensor01 DECIMAL,
ValueSensor02 BIT,
ValueSensor03 DECIMAL,
....
)
但是从近 4M 行中提取 300/500 列的速度有多快?在 NoSQL(Cassandra 或任何其他兼容 .NET)或 SQL Server 中会更快吗?
我接受各种建议。
非常感谢。
EDIT01:查询仅按 DATE 和 Var 进行,如您在声明的索引中所见。每个工厂都有不同类型的查询,因为几乎所有传感器都不同。
【问题讨论】:
-
对于问答格式来说太宽泛了。
-
我认为“现在需要一个 Web 应用程序,您可以想象必须以毫秒而不是秒为单位生成报告”的说法是错误的。有许多 Web 应用程序需要一些时间才能返回响应,如果您使用“正在计算...”、“可用结果”模式,这很好。我有一个应用程序,它通过网络表单接受报告请求并将结果通过电子邮件发送,因为这对请求报告的人最有用。
-
您需要指定您的查询。 如何你想获取数据?通过 sensor_id 和日期范围?仅按范围,无论传感器 ID 是什么?等等...
-
Google 的一些条款:流式数据库;过程历史学家;时间序列数据。有许多软件工具和技术可以精确地支持您的场景。
-
感谢您的回复。我会进一步研究并提出和反馈最新的解决方案。
标签: asp.net sql-server database-design cassandra nosql