2010-07-20 156 views
6

我有一个系统,每秒记录一些测量值。存储与特定秒对应的值的趋势数据的最佳方式是什么?趋势亿+行

1 day = 86.400 seconds 
1 month = 2.592.000 seconds 

大约1000个值用于跟踪每秒。

目前有50个表格将趋势数据分成20列。这些表格包含超过1亿行。

TREND_TIME datetime (clustered_index) 
    TREND_DATA1 real 
    TREND_DATA2 real 
    ... 
    TREND_DATA20 real 
+1

是趋势数据会被读取还是更新很多? – 2010-07-20 08:14:46

+0

您应该指定RDBMS--这是物理数据库实现的问题,而不是逻辑设计,RDBMS在这里确实很重要。 – Unreason 2010-07-20 09:29:08

+0

它将被阅读很多显示多种图形。 – kerem 2010-08-21 06:55:20

回答

2

我会改变数据保存方法,而不是将'原始'数据保存为值,我会在数组中保存5-20分钟的数据(内存,BL端),使用基于LZ的算法压缩该数组,然后存储数据库中的数据为二进制数据。另外,最好保存该二进制块的最大/最小/平均/等等..信息。

当您想要处理数据时,您可以在数据块之后处理数据块,并且为应用程序保留较低的内存配置文件。这种方法稍微复杂一些,但在内存/处理方面可以扩展。

希望这有助于。

+0

这种方法不具可扩展性我认为,因为当我想看到一个月的数据时,我必须解压缩很多。 – kerem 2010-08-21 06:57:30

+0

我知道你的意思。为了解决这个问题,如果可能的话,对每月/每年的压缩数据进行摘要并将该摘要存储在数据库中。您可能需要存储代表在基础数据上完成的不同操作的各种摘要,但您将获得令人眼花缭乱的速度。 – Gilad 2010-08-22 08:08:34

0

问题是数据库模式?

1秒钟到很多趋势显然首先显示一个单独的表与秒表外键。或者,如果“许多趋势值”由列而不是行表示,则可以将列附加到秒表并产生空值。

你试过吗?性能差吗?

3

您是否考虑过RRDTool - 它为时间序列数据提供循环数据库或循环缓冲区。您可以以任意间隔存储数据,然后定义合并点和合并函数,例如(给定期间,1秒,5秒,2天等)(总和,最小值,最大值,平均值)。因为它知道什么您想要的合并点,它们在聚合后不需要存储所有数据点。

GangliaCacti在封面下使用它,它很容易从多种语言中使用。

如果您确实需要所有数据点,请考虑仅将它用于聚合。

+0

我绝对赞成这种方法,我使用Ganglia来跟踪多年来的许多数据系列,它的效果非常好! – 2010-07-29 20:14:07

+0

谢谢,神经节和仙人掌似乎非常有用。但是我找不到RRDTool的C#库。 – kerem 2010-08-23 14:12:52