Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427390
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: Oracle

2008-06-17 23:56:04

表和索引的分区

表和索引的分区,就是将表和索引中的记录数据分成多个部分,分开存放在多个表空间中,也就是将表、索引分成多个段,每一个段就是一个分区。

有多种实现方式,可以对表、索引进行分区。我们经常使用的方式有以下两种:

1)按某字段的取值。在向表中插入记录时,系统根据字段的取值,决定将记录存入表、索引的那一个分区。每一个分区对应字段的不同取值区间。对现有记录的更改,也将引起记录在不同分区之间的移动。

2)随机存放。在向表中插入记录时,系统随机地将记录存入到不同的分区中,使各个分区有大体上相同的记录数量。

表和索引是否分区、使用什么样的分区方式,在创建表、索引时指定。如果要将现有的表、索引分区,可以首先导出表中的数据,重新创建表、索引后再导入数据。一般来说,要分区的表、索引应具备以下的条件:

1)包含大量的记录。没有必要对数据量小的表、索引进行分区。

2)经常被访问,要求比较高的访问速度。

分区对用户是透明的,用户不用关心表、索引是否被分区。用户向表中插入记录时,由系统根据表、索引的定义,存放记录到对应的分区中;在查询表中记录时,由系统根据查询条件,决定要访问那一个分区,抑或是所有分区。

对大数据量的表和索引分区,所带来的好处是显而易见的,这主要体现在数据处理性能的提高上:

1)实现并行的查询处理。在查询处理时,数据库系统可以将单个查询分成多个子查询,每一个子查询处理一个或者几个分区。所有的子查询并行执行,最后合并各个子查询的处理结果。

2)实现并行的数据装入。类似于并行的查询处理,在进行大批量的数据装入时,数据库系统可以并行地对每一个分区进行数据装入。

3)分散表的I/O操作。对频繁使用的表、索引分区,使数据分布到多个磁盘上,从而将表、索引的I/O操作分散到多个磁盘上,降低了I/O操作的竞争。

4)增加记录插入点。对存在大量记录插入操作的表、索引分区,将插入处理分散到多个分区中,这样表、索引中就存在多个插入点,可以避免由插入操作而引起的“热点”问题。

尽管表和索引的分区提高了数据处理的性能,但相应地带来了管理上的不便、维护上的困难。然而这种不便、困难不是绝对的,有时合理地使用表、索引的分区,将给数据库的管理和维护带来极大的便利。例如:定期地移走数据库中的历史数据。对管理员来说,这种数据维护工作是不可避免的。这主要是基于释放磁盘空间、提高查询处理速度的考虑,尤其是对那些包含大批量数据而数据量又随着时间快速增长的表,这种数据维护工作更是经常需要进行。这些被移走的历史数据仍旧有可能再次被使用,在需要时必须重新装入数据库。

对这种历史数据的维护,我们一般直接使用SQL语句,在进行备份后从表中删除。对包含大数据量的表,这种处理方式不但要耗费大量的时间,而且还可能造成数据库的损坏。再次需要时对这些数据的重新装入,又是费时、费力的工作。

一种更好的处理方式就是对大数据量表分区,使用分区实现历史数据的维护。在分区时,我们可以按照日期字段,将不同年份、甚至不同月份的数据存放在不同的分区中。要移走历史数据,就是移走表的分区,将分区存放到另外的表结构中。在需要访问这些数据时,将原有的分区再加入到表中就可以了。整个处理过程简单、方便、快捷,又不会对系统产生大的影响。

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