我正在努力设计一个快速查询数据库。 我有几个工厂每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(布尔值),因此该部分也可能会改变。
它在某种程度上适用于桌面应用程序,必须在过去三个月的最坏情况下生成报告。 (大约需要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进行。每个工厂都有不同类型的查询,因为几乎所有传感器都不同。
答案 0 :(得分:0)
我现在正在使用Azure SQL和DocumentDB(noSQL)同时工作。 我在谈论DocumentDB,但我认为它与其他.Net NoSQL提供商不同。
有我的见解:
根据您的需要,我将使用Azure SQL的高层(p1-p2)。如果它是在内部,绝对是SQL。只需调整索引并确保使用SSD,数据就会流动。 (经验法则:如果可能,你需要尽可能多的RAM作为最大的数据库)
编辑:对于报表部分:存储过程和缓存是一种方法。从EntityFramework存储过程将我们的应用程序的加载时间从40秒减少到2秒