day11_分区表——11g新特性
11g在分区上有了很大的改进,其中有一个特性是Interval-Partition,他是range分区的派生,自动创建指定间隔的分区。
对时间类型和数字类型的支持:
1.对于采用date类型或TIMESTAMP类型的Interval Partitioning可以支持按year、month、day、hour、minute、second六种类型的定长宽度分区,分别通过如下函数转换
numtoyminterval ( n, { 'YEAR'|'MONTH'})
numtodsinterval ( n, { 'DAY'|'HOUR'|'MINUTE'|'SECOND'})
2. Interval (number) 即多少值一个分区
创建示例
1.时间类型
--创建表
SQL> CREATE TABLE intervalpart1 (c1 NUMBER, c2 DATE)
PARTITION BY RANGE (c2)
INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
(PARTITION part1
VALUES LESS THAN (TO_DATE ('02/01/2013', 'MM/DD/YYYY'))
);
Table created.
--查询只有一个分区
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART1';
--增加2行记录一行是2月份的,一行是1月份的
SQL> insert into intervalpart1 values (1,TO_DATE ('02/02/2013', 'MM/DD/YYYY'));
SQL> commit;
SQL> insert into intervalpart1 values (1,TO_DATE ('01/01/2013', 'MM/DD/YYYY'));
SQL> commit;
SQL> Select Count(1) From intervalpart1;
--增加了2月份的分区
SQL>
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART1';
--插入当前时间的分区
SQL> insert into intervalpart1 values (1,sysdate);
SQL> commit;
--又有一个分区新建了,如果插入的时间在两个月以后或者更久,则Oracle只生成必须的分区,并不会生成连续分区(先插入2015年的只产生2015年,再插入2014年的,也只产生2014年)。
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART1';
2.数字类型
----创建表
SQL> CREATE TABLE intervalpart2 (c1 NUMBER, c2 DATE)
PARTITION BY RANGE (c1)
INTERVAL (100)
(PARTITION part1
VALUES LESS THAN (100)
);
--查询只有一个分区
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART2';
--增加2行记录一行是1,一行是101
SQL> insert into intervalpart2 values (1,sysdate);
SQL> insert into intervalpart2 values (101,sysdate);
SQL> commit;
SQL> Select Count(1) From intervalpart2;
--增加了101的分区
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART2';
--插入1101数值的分区
SQL> insert into intervalpart2 values (1101,sysdate);
SQL> commit;
--插入901数值的分区
SQL> insert into intervalpart2 values (901,sysdate);
SQL> commit;
--又有一个分区新建了,如果插入的数值是差别很大或者更久,则Oracle只生成必须的分区,并不会生成连续分区(与时间的处理方式相同)。
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART2';
管理:
1.普通分区与自动分区的转换
--创建普通分区表
SQL> CREATE TABLE intervalpart3 (c1 NUMBER, c2 DATE)
PARTITION BY RANGE (c1)
(PARTITION part1 VALUES LESS THAN (100)
);
SQL> insert into intervalpart3 values (1,sysdate);
SQL> commit;
--当插入超出值时会报错
SQL> insert into intervalpart3 values (101,sysdate);
insert into intervalpart3 values (101,sysdate)
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition
--设置100数值为分区
SQL> alter table intervalpart3 set INTERVAL(100);
--插入成功
SQL> insert into intervalpart3 values (101,sysdate);
SQL> commit;
--新生成分区
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART3';
--也可以设置个更高的值
SQL> alter table intervalpart3 set INTERVAL(300);
--插入数据
SQL> insert into intervalpart3 values (201,sysdate);
SQL> insert into intervalpart3 values (401,sysdate);
SQL> insert into intervalpart3 values (501,sysdate);
SQL> insert into intervalpart3 values (601,sysdate);
SQL> commit;
--更改的值生效,之前的分区不影响。
SQL> select table_name, partition_name, HIGH_VALUE
from dba_tab_partitions t
where table_name = 'INTERVALPART3';
--关闭自动分区
SQL> alter table intervalpart3 set INTERVAL();
--插入数据不成功
SQL> insert into intervalpart3 values (801,sysdate);
insert into intervalpart3 values (801,sysdate)
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition
2.配置多个表空间的分区存储
alter table intervalpart3 set STORE IN (tablespace1, tablespace2, tablespace3);
这3个表空间,分区会循环分配到这3个表空间。
3. rename 分区名
分区:
alter table INTERVALPART3 rename partition PART1 to gannimei;
--------------------------------------------------------------
(1)
CREATE TABLE T_MOBBIZ_LOG_NEW
PARTITION BY RANGE(QUERY_TIME)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(PARTITION P_BASE_1 VALUES LESS THAN(TO_DATE('2014-10-01','YYYY-MM-DD')))
as select * from T_MOBBIZ_LOG where QUERY_TIME >=to_date('2014-09-01','yyyy-mm-dd');
rename T_MOBBIZ_LOG to nimei;
rename T_MOBBIZ_LOG_NEW to T_MOBBIZ_LOG;