分类: 数据库开发技术
2011-03-28 18:07:44
虽然对数据库进行分区本身就能提高查询的性能,结合压缩,也能减少每次查询的IO。但如果数据持续增长,过于久远的历史数据就成了一个包袱,它们从来不在查询结果中出现,却或多或少的影响着每次查询的时间,成了一个挥之不去的阴影。此外,由于一个分区表的分区是有上限的(在2005中这一上限是1000),我们也并不能在一张表上一直分区下去。所以在这种情况下,我们一般需要同时拥有两张表,一张保存了最近的数据,用来应付所有的查询,这张表要足够精简,在其上的查询要足够敏捷;同时有另一张表,保存所有过时的数据——我们并不能把过时的数据一删了事。
这里面的关键问题是,既然数据是随着时间持续增长的,那么当下有用的数据可能在几天后就过时了,那么怎样将这一部分过时的数据从活动表迁移到存档表,而且要保证迁移过程的快速、平稳呢?如果采用常规的Select、Insert、Delete来进行数据迁移,会有如下问题:
那么很容易想到,利用之前提到的分区的Switch操作来解决迁移的问题,将整个分区而不是数据在活动表和存档表中迁移。由于Switch的元数据操作属性,这一几乎没有什么IO的操作效率极高,而且也不会锁表。基于以上方法进行的周期性自动化的数据迁移,就是Slide Window的基础。
假设我们已经有一张活动表,分了四个区,分别对应去年,今年一月、二月以及三月以后的数据:
同时我们有另外一个存档表,分成了两个区, 第一个区对应今年以前的数据,另外一个分区的范围是今年之后:
注意,活动表的第一个分区、存档表中的第二个分区是没有数据的,这是进行Slide Window的前提条件。
现在,我们考虑将活动表中的一月份的数据放入存档表中,而且我们还要保证在迁移之后,两张表保持和迁移前相似的状态。
那么我们可以采用如下的步骤:
1.在存档表中建立新分区:
2.将活动表的第二个分区挪到存档表的第二个分区中:
至此,我们已经完成了数据的迁移,但为了恢复两张表到之前的状态,我们还需要以下两个步骤:
3.合并存档表的第一和第二个分区。
4.拆分活动表的第三个分区。
最后的结果,活动表:
我们可以看到迁移过后,两张表的分区数量没有变,而且存档表的第二个分区依然是空的。当需要迁移二月份的数据时,我们可以采用和上面完全一样的步骤进行迁移。而这一过程,类似在时间轴上开了一个窗口,将当前数据在活动表上展示,随着时间推移,窗口不断向前滑动(活动表的边界前移),而且窗口大小(活动表的分区数)始终保持不变,这就是Slide Window(滑动窗口)这一名称的来源。
建立存档表最简单的方法是选中分好区的活动表,在Storage菜单中选择“Manage Partition”,然后