Oracle中的几种分区表方法

在 Oracle 几年的学习中, 做了很多的实验,也遇到了很多的问题, 在这个过程中,积累了一些学习文档。 因为太多,不便于查阅。
根据自己对 Oracle 的理解以及日常工作中遇到的情况并进行了一些整理,方便自己的查看。 这些文档中有很多内引用借鉴了前辈们的资料和 google 上的

一些信息。  在这里引用的内容也是完全出于学习,没有其他用途,如有侵犯到版权的问题,请联系我。 我将删除这些信息。对数据库这块也是在不断的学习, 对 oracle 的理解也是在不断的变化。 在这个过程中,难免有理解错误的地方, 或者内容上遗漏的,如果发现了问题, 烦邮件给我,我会虚心的学习,并更新该文档。好了,闲话我也就不多说了,下面我就言归正传写下个人对分区表的理解。


    oracle提供了分区技术以支持VLDB(Very Large Database)。分区表通过对分区列的判断,把分区列分成不同的记录,
放到不同的分区中,分区完全对应用是透明的。
oracle的分区表可以包括多个分区,每个分区都是一个独立的段,可以放到不同的表空间中。查询时可以通过查询表来访问
各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

When to Partition a Table 什么时候需要分区表,官网的 2 个建议如下:
  (1) Tables greater than 2GB should always be considered for partitioning.
  (2) Tables containing historical data, in which new data is added into the newest
partition. A typical example is a historical table where only the current month's data isTianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware
updatable and the other 11 months are read only.

  分区提供以下优点:
(1) 由于将数据分散到各个分区中,减少了数据损坏的可能性
(2) 可以对单独的分区进行备份和恢复
(3) 将分区分散映射到不同的物理磁盘上,减少了IO热点问题
(4) 提高可管理性,可用性和性能。



  oracle 11g提供了以下几种分区类型
范围分区
哈希分区(散列分区)
列表分区
间隔分区
下面我就通过实验的方法详细介绍这几种分区方法,希望各位技术老爷们能够轻松理解。


Range分区:
  range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录放到列值
所对应的分区中。
比如按时间划分,2012年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。
实验一:
 create table dba (id number, time date) partition by range (time)
(
partition p1 values less than (to_date('2012-10-1', 'yyyy-mm-dd')),
partition p2 values less than (to_date('2012-11-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2012-12-1', 'yyyy-mm-dd')),
partition p4 values less than (maxvalue)
)
注:不必为最后一个分区指定最大值,maxvalue关键字会告诉oracle使用这个分区来存储在前面几个分区中不能存储的数据。


Hash分区:
   散列分区(hash分区)通过在分区键值上执行一个散列函数来决定数据的物理位置。在范围分区中,分区键的连续值通常存储在相同的分区中,
而在散列分区中,连续的分区键值一般不存储在相同的分区中。散列分区把记录分布在比范围分区更多的分区上,
这降低了I/O争用的可能性。
实验二:
create table test
(
transaction_id number primary key,
item_id number(8) not null
)
partition by hash(transaction_id)
(
partition part_01 tablespace tablespace01,
partition part_02 tablespace tablespace02,
partition part_03 tablespace tablespace03
);
这里,我们指定了每个分区所对应的表空间。


List 分区:
  List 分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,
不能像 range 或者 hash 分区那样同时指定多个列做为分区依赖列,但它的单个分
区对应值可以是多个。
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,
则插入/更新就会失败, 因此通常建议使用 list 分区时,要创建一个 default 分区
存储那些不在指定范围内的记录,类似 range 分区中的 maxvalue 分区。

实验三:
create table custaddr
(
id varchar2(15 byte) not null,
areacode varchar2(4 byte)
)
partition by list (areacode)
( partition t_list025 values ('025'),
partition t_list372 values ('372') ,
partition t_list510 values ('510'),
partition p_other values (default)
);



注:
组合分区:
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通
过分区内再建子分区的方式将分区再分区,即组合分区的方式。
组合分区在10g中有两种:range-hash,range-list。注意顺序,根分区只
能是 range 分区,子分区可以是 hash 分区或 list 分区。在11g中这部分功能有所增强,这里我就不介绍了。
实验四:
create table test
(
transaction_id number primary key,
transaction_date date
)
partition by range(transaction_date) subpartition by hash(transaction_id)
subpartitions 3 store in (tablespace01,tablespace02,tablespace03)
(
partition part_01 values less than(to_date(‘2009-01-01‘,‘yyyy-mm-dd‘)),
partition part_02 values less than(to_date(‘2010-01-01‘,‘yyyy-mm-dd‘)),
partition part_03 values less than(maxvalue)
);
create table emp_sub_template (deptno number, empname varchar(32), grade
number)
partition by range(deptno) subpartition by hash(empname)
subpartition template
(subpartition a tablespace ts1,
subpartition b tablespace ts2,
subpartition c tablespace ts3,
subpartition d tablespace ts4
)
(partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than (maxvalue)
);



create table quarterly_regional_sales
(deptno number, item_no varchar2(20),
txn_date date, txn_amount number, state varchar2(2))
tablespace ts4
partition by range (txn_date)
subpartition by list (state)
(partition q1_1999 values less than (to_date('1-apr-1999','dd-mon-yyyy'))
(subpartition q1_1999_northwest values ('or', 'wa'),
subpartition q1_1999_southwest values ('az', 'ut', 'nm'),
subpartition q1_1999_northeast values ('ny', 'vm', 'nj'),
subpartition q1_1999_southeast values ('fl', 'ga'),
subpartition q1_1999_northcentral values ('sd', 'wi'),
subpartition q1_1999_southcentral values ('ok', 'tx')
),
partition q2_1999 values less than ( to_date('1-jul-1999','dd-mon-yyyy'))
(subpartition q2_1999_northwest values ('or', 'wa'),
subpartition q2_1999_southwest values ('az', 'ut', 'nm'),
subpartition q2_1999_northeast values ('ny', 'vm', 'nj'),
subpartition q2_1999_southeast values ('fl', 'ga'),
subpartition q2_1999_northcentral values ('sd', 'wi'),
subpartition q2_1999_southcentral values ('ok', 'tx')
),
partition q3_1999 values less than (to_date('1-oct-1999','dd-mon-yyyy'))
(subpartition q3_1999_northwest values ('or', 'wa'),
subpartition q3_1999_southwest values ('az', 'ut', 'nm'),
subpartition q3_1999_northeast values ('ny', 'vm', 'nj'),
subpartition q3_1999_southeast values ('fl', 'ga'),
subpartition q3_1999_northcentral values ('sd', 'wi'),
subpartition q3_1999_southcentral values ('ok', 'tx')
),
partition q4_1999 values less than ( to_date('1-jan-2000','dd-mon-yyyy'))
(subpartition q4_1999_northwest values ('or', 'wa'),
subpartition q4_1999_southwest values ('az', 'ut', 'nm'),
subpartition q4_1999_northeast values ('ny', 'vm', 'nj'),
subpartition q4_1999_southeast values ('fl', 'ga'),
subpartition q4_1999_northcentral values ('sd', 'wi'),
subpartition q4_1999_southcentral values ('ok', 'tx')
)
)


间隔分区:
  在oracle11g中可用的另一种新的分区类型是间隔分区。在间隔分区中,不必为每个分区
指定特定的范围值,而是指定间隔持续的时间。也就是说,不是指定分区1在
1月31日结束,分区2在2月29日结束,而是指定每个分区为1个月长的时间。
  当插入新行时,oracle将根据间隔定义确定将此行插入到哪个分区。如果没有为那个月创建分区,
数据库将自动创建一个分区。
 create table invoice_headers
     ( 
       invoice_num number,
       customer_num number,
       invoice_date date
      )
      partition by range (invoice_date)
      interval (numtoyminterval (1,'month'))
      (
         partition p1101 values
           less than (to_date('2011-02-01','yyyy-mm-dd'))
       );
需要注意的是,如果依靠间隔分区自动创建分区,应用程序开发人员将得不到一致的分区
名称,因为oracle为它自动创建的每个分区创建系统生成的名称。

接下来的几篇文章小白还是会继续讲下关于分区表的问题,望各位看客老爷能够喜欢!

    

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值