什么是Oracle的分区表?

    假设我们现在正在酝酿经营一家图书馆,最初,我们只有十本书提供给大家来阅读和购买。对于十本书而言,我们可能只需要一个书架格子将其作为保存这十本书的容器就足够了,因为任何一个人都可以很轻松的扫一眼就可以将这十本书的书名大概记住,并且挑选出合适自己的书籍来看。
    但是随着我们书籍越来越多,我们需要更大的容器来保存我们的科教类、IT类、历史类、人文类等等书籍,大家都知道的一个生活常识就是,我们肯定不能够将所有类型的书籍都扔到一个书架容器上摆着,最科学的,就是分区,将不同的书籍放到不同的地方去,这样,假如我们在西安五路口的新华书店,那么就只需要跑到四楼的IT分区,去找相关的IT书籍。
    在生活中是这个样子,在数据库中呢?
    现在的数据库业务数据和日志数据,以几何级数的速度在增长着。以我之前从事社保行业为例,社保的日志动辄几十G,其实,其中几乎涵盖了从系统试运行到运行一两年之后的数据,这样一个巨大的表,让数据的逻辑备份、查询、甚至基于日志表的回退都产生了巨大的效率问题。
    如何能够快速有效的删除三个月之前的日志信息,如何能够快速的检索当前月份的信息,如何充分利用多块磁盘空间(裸设备)的物理环境,增加并行度平衡I/O从而改善性能增强数据库的可用性?Oracle在8.0版本之后提出的表的分区功能就是一个非常关键的实用技术。
    早在8.0.5版本中,Oracle就将范围分区技术引入,现在分区功能已经越来越强大,包括支持扩展分区功能、Interval分区、外键分区、模拟列分区、以及分区建议器等。那么,分区到底有什么好处呢?我们为什么要使用分区呢?在什么环境下使用分区比较合适呢?在金牌管理群中,有一个哥们请教一个多用户下一张10W频繁表的增加、删除、修改表的问题,很多朋友给出了修改其成为分区表的建议。其实,这张表能否将其设置为分区表,是需要看具体的业务使用环境的,多用户下频繁的增删改查,我认为应当使用全局临时表而非使用分区表,这个并不是分区表的典型应用环境,相反,应当是全局临时表的应用环境,并且在一本参考书中,找到了一位大牛的建议作为佐证:“分区表应用在大表更合适,至少要大于100万条的记录才可以考虑使用分区表”,例如社保系统中,使用分区表解决日志问题冗余问题就是一个最佳使用场景。
    这个结论是非常容易理解的,就类似于我们最前面引入的一个例子,我们开书店,只有十本书,假设未来也只会有那么几本,那么我们为什么要费尽心思的分成不同的区域呢?那岂不是画蛇添足了么?既不经济也不和谐,只有当我们采购的书籍的量非常大的时候,我们才会去考虑使用分区技术来解决查找效率问题。
    假设现在用户希望找到一本《数据结构》的教科书,我们在100W本书籍里面大海捞针的去找快呢?还是在10W本IT类书籍中去查找快呢?答案是显而易见的。当我们只有10本书呢?我们还会建立分区吗?我们直接肉眼全部扫描一下,直接得到这本书就好了。因此我们需要在特定的环境下选择特定的技术解决方案,目的是追求更高的效能,更高的性能带来的必然是用户更高的满意度,更高的满意度带来的必然是更好的经济效益,更好的经济效益带来的必然是图书管理员们更美好的生活。

那么就让我们看一下Oracle提供的分区功能到底有什么样子的好处呢?

1)由于Oracle数据库可以将分区指定为不同的表空间,而不同的表空间是可以指向不同的磁盘设备的,在很多时候,磁盘设备的I/O速度是系统进行数据操作的瓶颈,而分区并行,则起到了优化物理硬件资源,从而缩短了执行的时间的作用。
2)分区,就类似于我们将图书分类放到了不同的区间中,这个时候,我们就可以只针对其中的某一类图书进行操作,比如进行该类书籍的查询、上架、下架、甚至将该类图书付之一炬,这带来了两个特别大的优势,第一,我们无视其他分区的数据;第二,我们可以很方便的对本区的数据进行删除操作。
3)提高了特定的查询速度,比如我们现在只需要查找IT类图书的数量,因为我们能够在第一意识中,排除其他非IT类书籍,必然会提高查询的性能。
4)节约维护的成本,传统的维护操作,例如重建索引等,因为有锁机制的存在,是会影响到其他人的读取和更新删除操作的,但是由于有了分区,我们在维护IT类书籍的时候,就不会对其他分类的数据造成影响,这个时候,可以降低因为维护数据而对其他系统数据产生的各种影响。
5)从安全的角度上而言,我们将不同的分区放在不同的表空间当中,就类似于我们没有将所有的鸡蛋放到一个篮子里面,必然会带来安全方面的提升。

Oracle提供了下面几种比较常见的分区方式:

1)范围分区(partition by range)

    我们可以想象范围分区的前提,假如我们现在有100W本书,如果分成10个分区,能够比较平均的将每一类维持在10W本左右,是最理想不过了,这样看起来即工整又漂亮。因此,我们在建立范围分区的时候,如何选择范围分区的依据从而能够让数据均匀分布,是一个需要重点关注的问题。
    在很多情况下,例如上述提到的社保系统中的日志表,使用日期进行分类就是一个比较好的分区方案,因为每个月产生的数据量都是大致相同的。下面,我们通过脚本来创建一个基于月份的范围分区表(假设插入的数据全部都是2013年的数据):
DROP TABLE PART_LOG_CHENZW PURGE;

CREATE TABLE PART_LOG_CHENZW(
       LOG_ID NUMBER(20) PRIMARY KEY,
       LOG_DATE DATE,
       LOG_DESC VARCHAR2(20)
)
PARTITION BY RANGE(LOG_DATE)
(
 PARTITION PART_LOG_01 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_02 VALUES LESS THAN (TO_DATE('2013-03-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_03 VALUES LESS THAN (TO_DATE('2013-05-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_04 VALUES LESS THAN (TO_DATE('2013-07-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_05 VALUES LESS THAN (TO_DATE('2013-09-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_06 VALUES LESS THAN (TO_DATE('2013-10-01','YYYY-MM-DD')) TABLESPACE DATA,
 PARTITION PART_LOG_07 VALUES LESS THAN (MAXVALUE) TABLESPACE DATA
);

    上面的例子就是一个使用范围分区的典型例子,在创建表的时候使用PARTITION BY RANGE关键字来指出进行分区的策略,其中PARTITION BY LOG(LOG_DATE)指的是使用LOG_DATE来作为分区的字段,里面根据取值的大小,命名了7个分区来存放数据,每个分区还可以指定不同的表空间,第七个分区使用MAXVALUE来避免有数值没有被上面的范围圈定,这个就类似于SWITCH语法中的DEFAULT,不同的,这个并不是fall through的。

    下面,我们来生成10万条数据来插入到表中,查看一下表中发生了什么样子的变化?
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值