您好,欢迎访问一九零五行业门户网

Oracle 常见初始化参数

间隔分区是范围分区的一个拓展,当插入的数据超过了现有的所有分区时,数据库会按照指定的间隔自动创建分区。oracle支持创建单一
间隔分区是范围分区的一个拓展,当插入的数据超过了现有的所有分区时,数据库会按照指定的间隔自动创建分区。oracle支持创建单一的间隔分区表也可以创建interval-range、interval-hash和interval-list三种组合分区表。
使用间隔分区的场景:
1.使用间隔分区最大的好处就是不用再提前手工的创建分区,只要后续创建的分区的分区间隔是统一的,就可以考虑使用间隔分区。并且,在后续创建的分区中还能通过store in 选项以循环复用的方式来将分区存放到不同的表空间里。
2.如果某张表是范围分区,则很容易的将该表转换成间隔分区表,例如sh用户下的sales表,可通过如下语句来修改:
sh@ora11gr2 > alter table sales set interval (numtoyminterval(1,'month'));
table altered.
注意,如果范围分区存在最大分区maxvalue时,无法通过命令直接改为间隔分区。
例如,先创建表interval_test
create table interval_test (id number, name varchar2(20))
partition by range(id)
(partition p1 values less than (100),
partition p2 values less than (200),
partition p3 values less than(maxvalue));
接着尝试将该表修改为间隔分区表
sh@ora11gr2 >  alter table interval_test set interval (200);
 alter table interval_test set interval (200)
*
error at line 1:
ora-14759: set interval is not legal on this table.
使用oerr查看报错信息
[oracle@oracle11g ~]$ oerr  ora 14759
14759,  00000, set interval is not legal on this table.
// *cause: set interval clause was specified. alter table set interval is
//        only legal on a range partitioned table with a single partitioning
//        column. additionally, this table cannot have a maxvalue partition
//        and cannot be the parent table for any reference partitioned tables.
// *action: use set interval only on a valid table.
3.如果某张表为间隔分区表,则无法手工的对该表手动新增分区。所以如果决定将某张表修改为间隔分区,要考虑修改相关的应用程序或者存储过程。
sh@ora11gr2 > alter table interval_sales add partition p4 values less than (to_date('20150101','yyyymmdd'));
alter table interval_sales add partition p4 values less than (to_date('20150101','yyyymmdd'))
            *
error at line 1:
ora-14760: add partition is not permitted on interval partitioned objects
使用间隔分区的限制:
1.只能指定一个分区键,,并且键值类型只能为number或date。
2.间隔分区不支持索引组织表。
3.不能在间隔分区上创建域索引(domain index)
管理间隔分区:
1.创建间隔分区:
create table interval_sales
    ( prod_id        number(6)
    , cust_id        number
    , time_id        date
    , channel_id    char(1)
    , promo_id      number(6)
    , quantity_sold  number(3)
    , amount_sold    number(10,2)
    )
  partition by range (time_id)
  interval(numtoyminterval(1, 'month'))
  store in (interv1, interv2)
    ( partition p0 values less than (to_date('1-1-2008', 'dd-mm-yyyy')),
      partition p1 values less than (to_date('1-1-2009', 'dd-mm-yyyy')),
      partition p2 values less than (to_date('1-7-2009', 'dd-mm-yyyy')),
      partition p3 values less than (to_date('1-1-2010', 'dd-mm-yyyy')) );
2.禁用间隔分区
sh@ora11gr2 > alter table interval_sales set interval ();
table altered.
3.修改间隔分区interval值
sh@ora11gr2 > alter table interval_sales set interval (numtoyminterval(1,'year'));
table altered.
4.删除间隔分区
sh@ora11gr2 >  alter table interval_sales  drop partition for(to_date(' 2008-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'));
table altered.
5.merge间隔分区
首先插入两条数据,让系统自动生成两个间隔分区
sh@ora11gr2 > insert into interval_sales values (1,2,to_date('20150101','yyyymmdd'),3,3,3,3);
1 row created.
sh@ora11gr2 > commit;
commit complete.
sh@ora11gr2 >  insert into interval_sales values (1,2,to_date('20150201','yyyymmdd'),3,3,3,3);
1 row created.
sh@ora11gr2 > commit;
接着,执行命令,合并两个分区
sh@ora11gr2 >  alter table interval_sales merge partitions for ( to_date('20150101','yyyymmdd')) , for(to_date('20150201','yyyymmdd'));
  table altered.
注意,合并的两个分区需要前后相连,否则报错,无法合并!
本文永久更新链接地址:
其它类似信息

推荐信息