海量数据库的设计

     最近一周接手一道路车辆监控系统的数据库设计,本系统的业务逻辑非常简单,主要的挑战在于海量数据库的设计,也就是如何组织数据来让查询和统计

更加的快速。下面介绍几种我查资料时遇到的方法,还有我实际中运用的方法。

     1、利用分区视图

         可以把一个数据库中的一个大表按照一定的条件分布到不同的多个数据库中这样可以减少单台服务器的压力。并且,如果所要查询的数据只在一台服

     务器上,则只会查询所需要的服务器但,分布式分区视图的最大缺点是受网络状况的影响比较大。这个概念主要应用于SQLServer。

      http://boyi55.blog.51cto.com/4345/26947/

      这个链接中存了如何建立sqlserver分布式分区视图的方法。

          在oracle中也有分区这一概念。也可以提高查询效率,但是具体有什么好处,还需要进一步研究。

     2、分门别类

           这个方法也比较简单,在数据量巨大的情况下,联合查询的代价比较大,所以在可能的情况下(分类明确且不可配置)把一张巨大的数据表(有一

     列存类型Id),按照分类分成几个数据表(去掉类型从表),可以更好的组织数据,免去联合查询,提高效率。

           在目前我手头的项目中,由于分类要求可配置,并且需要分类的信息规模不大(违章报警信息),所以不采用这种方法。

     3、定期清除数据到历史表、分级存储

           这个方法也是常用的方法,最常见的就是数据随着时间的增长,持续增长,然后只有近期的数据时最常用的。这时候,维持一个比较小规模的近期

     表和一个大规模的维护表是一个可行的方法。另外在统计大量数据的时候,这也是一种很好的提高效率的方法。

           在目前的项目中,统计模块我使用的是这种方法,主要是车流量的统计,分别维护日统计表,月统计表,年统计表。避免重复统计,每一级利用上

     一层统计的数据结果。

     4、实时表的建立

           有些表,要进行数据匹配,也就是每隔一个较短时间,就要对表内的数据进行一次遍历,这时候,我们要尽量减小这个表的规模。采取的维护方法

     是,定时清除未匹配信息到历史表,并标记为未匹配。匹配信息立刻清除到历史表。

           在目前的项目中,解决隧道的行驶匹配以及滞留车辆报警,采用的就是这种策略。具体做法是,在车辆驶入隧道时,在匹配表中插入数据,当捕捉

     到此车离开隧道时,将数据清除入车辆行驶表。每隔2h(隧道停留时间上限),清除表内数据。

     5、分离大字段

           这个方法源于同事的一个提议。oracle在进行表查询运算之前,要载入所有的表数据,例如图像路径,这种只有在提取图像时才用到的数据,从要运

     算的表中分离出来,是个不错的选择。

     6、Oracle、DB2自身技术特点的利用

posted @ 2012-02-21 11:36  明之道  阅读(1233)  评论(0编辑  收藏  举报