Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1887892
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类: 数据库开发技术

2011-03-28 18:07:44

   虽然对数据库进行分区本身就能提高查询的性能,结合压缩,也能减少每次查询的IO。但如果数据持续增长,过于久远的历史数据就成了一个包袱,它们从来不在查询结果中出现,却或多或少的影响着每次查询的时间,成了一个挥之不去的阴影。此外,由于一个分区表的分区是有上限的(在2005中这一上限是1000),我们也并不能在一张表上一直分区下去。所以在这种情况下,我们一般需要同时拥有两张表,一张保存了最近的数据,用来应付所有的查询,这张表要足够精简,在其上的查询要足够敏捷;同时有另一张表,保存所有过时的数据——我们并不能把过时的数据一删了事。

这里面的关键问题是,既然数据是随着时间持续增长的,那么当下有用的数据可能在几天后就过时了,那么怎样将这一部分过时的数据从活动表迁移到存档表,而且要保证迁移过程的快速、平稳呢?如果采用常规的Select、Insert、Delete来进行数据迁移,会有如下问题:

  1. IO过大,效率必然较低。
  2. 迁移过程表被锁住,所有查询都会被搁置。
  3. 恢复困难,如果想将移出的数据再移回来,需要进行同样的操作,IO和锁表的问题同样存在。

那么很容易想到,利用之前提到的分区的Switch操作来解决迁移的问题,将整个分区而不是数据在活动表和存档表中迁移。由于Switch的元数据操作属性,这一几乎没有什么IO的操作效率极高,而且也不会锁表。基于以上方法进行的周期性自动化的数据迁移,就是Slide Window的基础

原理图

假设我们已经有一张活动表,分了四个区,分别对应去年,今年一月、二月以及三月以后的数据:

image

同时我们有另外一个存档表,分成了两个区, 第一个区对应今年以前的数据,另外一个分区的范围是今年之后:

image

注意,活动表的第一个分区存档表中的第二个分区是没有数据的,这是进行Slide Window的前提条件

现在,我们考虑将活动表中的一月份的数据放入存档表中,而且我们还要保证在迁移之后,两张表保持和迁移前相似的状态。

那么我们可以采用如下的步骤:

1.在存档表中建立新分区:

image

2.将活动表的第二个分区挪到存档表的第二个分区中:

image

迁移的结果如下:image

至此,我们已经完成了数据的迁移,但为了恢复两张表到之前的状态,我们还需要以下两个步骤:

3.合并存档表的第一和第二个分区。

4.拆分活动表的第三个分区。

最后的结果,活动表:

image 存档表:

 image我们可以看到迁移过后,两张表的分区数量没有变,而且存档表的第二个分区依然是空的。当需要迁移二月份的数据时,我们可以采用和上面完全一样的步骤进行迁移。而这一过程,类似在时间轴上开了一个窗口,将当前数据在活动表上展示,随着时间推移,窗口不断向前滑动(活动表的边界前移),而且窗口大小(活动表的分区数)始终保持不变,这就是Slide Window(滑动窗口)这一名称的来源。

建立存档表

建立存档表最简单的方法是选中分好区的活动表,在Storage菜单中选择“Manage Partition”,然后

阅读(1177) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~