分享

oracle分区技术

 aaie_ 2018-02-14

分区写法:


几大点:
1.分区表
2.分区的区exp和imp
3.自动给分区表添加索引

自动分配表空间
http://space./17203031/viewspace-706173


alter table table_name drop partition partition_name;

interval分区

实验环境:
SQL> create tablespace part datafile '/u01/app/oradata/hou/part01.dbf' size 10M autoextend on next 10M maxsize 31G;

SQL> create user part identified by "part" default tablespace part;

SQL> grant connect,resource to part;


INTERVAL PARTITION


一、interval partition
11g之前,分区必须是手工或者存储过程预分配新分区。
interval 分区是oracle 11g引入的新技术,无需DBA预分配新分区,插入数据时系统会根据range列和已分配的分区自动判断新数据是否可以插入到已存在的分区中,如果不能满足插入已存在的分区,系统自动分配一个新分区来存放新插入的数据。

interal 分区减少了dba对分区的操作,保证了分区的准确安全性。

月自动创建分区
1.建表
create table month_part (c1 number,c3 date)
partition by range(c3)
interval(numtoyminterval (1,'month'))
(partition part1 values less than (to_date('2010-01-01','YYYY-MM-DD')),
 partition part2 values less than (to_date('2010-02-01','YYYY-MM-DD'))
);

2.查看现在表的分区
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='MONTH_PART';

TABLE_NAME               PARTITION_NAME              TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
MONTH_PART               PART1                  PART
MONTH_PART               PART2                  PART

3.插入数据测试
begin
for i in 0..11 loop
insert into MONTH_PART values(i,add_months(to_date('2012-01-01','yyyy-mm-dd'),i));
end loop;
commit;
end;
/

4.看看数据
SQL> alter session set nls_date_format='yyyy-mm-dd';

Session altered.

SQL>  select * from MONTH_PART;

    C1 C3
---------- ----------
     0 2012-01-01
     1 2012-02-01
     2 2012-03-01
     3 2012-04-01
     4 2012-05-01
     5 2012-06-01
     6 2012-07-01
     7 2012-08-01
     8 2012-09-01
     9 2012-10-01
    10 2012-11-01
    11 2012-12-01

12 rows selected.

5.看是否自己创建分区
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='MONTH_PART';

TABLE_NAME               PARTITION_NAME              TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
MONTH_PART               PART1                  PART
MONTH_PART               PART2                  PART
MONTH_PART               SYS_P11599              PART
MONTH_PART               SYS_P11600              PART
MONTH_PART               SYS_P11601              PART
MONTH_PART               SYS_P11602              PART
MONTH_PART               SYS_P11603              PART
MONTH_PART               SYS_P11604              PART
MONTH_PART               SYS_P11605              PART
MONTH_PART               SYS_P11606              PART
MONTH_PART               SYS_P11607              PART
MONTH_PART               SYS_P11608              PART
MONTH_PART               SYS_P11609              PART
MONTH_PART               SYS_P11610              PART

14 rows selected.

14个分区=创建表时定义的2个分区+插入12条数据自动产生的分区。


查看单个分区中的数据
SQL> select * from MONTH_PART partition(SYS_P11606);

    C1 C3
---------- ----------
     7 2012-08-01





二、interval partition+store in
分区表的创建目的,除了进行分区内局部扫描、便于管理外,还可以通过将分区存放在不同的表空间做到平衡分散IO的目的。所以,对分区的表空间规划,通常是DBA日常决策的一个重要内容。

interval partition中,分区的创建是由系统自动生成,这就存在一个问题:如何规划分区的存储,也就是系统自动分配的分区存放在哪些tablespace?

如果在store in后面标注上tablespaces的列表,那么新创建出的分区就会依次循环的均匀存放在各个分区上。

格式如下:
create table xx(c1,c2)
partition by range(c2)
interval(numtoyminterval (1,'month')) store in(tablespace1,tablespace2,....,tablespacen)
(partition xx......,
 partition xx......
)

实验环境准备:
添加表空间p1,p2
SQL> create tablespace p1 datafile '/u01/app/oradata/hou/p1.dbf' size 10M autoextend on next 10M maxsize 31G;
SQL> create tablespace p2 datafile '/u01/app/oradata/hou/p2.dbf' size 10M autoextend on next 10M maxsize 31G;

赋予part用户在p1和p2表空间的磁盘配额
alter user part quota unlimited on p1;
alter user part quota unlimited on p2;


1.创建分区表
create table interval_partition(c1 number,c3 date)
partition by range(c3)
interval(numtoyminterval (1,'month')) store in(p1,p2)
(partition part2010_01
  values less than (to_date('2010-02-01','yyyy-mm-dd')),
 partition part2010_02
  values less than (to_date('2010-03-01','yyyy-mm-dd'))
);


2.查看现在表的分区
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='INTERVAL_PARTITION';

TABLE_NAME               PARTITION_NAME              TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
INTERVAL_PARTITION           PART2010_01              PART
INTERVAL_PARTITION           PART2010_02              PART


3.插入数据测试
begin
for i in 0..11 loop
insert into INTERVAL_PARTITION values(i,add_months(to_date('2010-01-01','yyyy-mm-dd'),i));
end loop;
commit;
end;
/


4.看看数据
SQL> alter session set nls_date_format='yyyy-mm-dd';

Session altered.

SQL> select * from INTERVAL_PARTITION;

    C1 C3
---------- ----------
     0 2010-01-01
     1 2010-02-01
     2 2010-03-01
     3 2010-04-01
     4 2010-05-01
     5 2010-06-01
     6 2010-07-01
     7 2010-08-01
     8 2010-09-01
     9 2010-10-01
    10 2010-11-01
    11 2010-12-01

12 rows selected.



5.看是否自己创建分区
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='INTERVAL_PARTITION';

SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions where table_name='INTERVAL_PARTITION' order by PARTITION_NAME;

TABLE_NAME               PARTITION_NAME              TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
INTERVAL_PARTITION           PART2010_01              PART
INTERVAL_PARTITION           PART2010_02              PART
INTERVAL_PARTITION           SYS_P11642              P1
INTERVAL_PARTITION           SYS_P11643              P2
INTERVAL_PARTITION           SYS_P11644              P1
INTERVAL_PARTITION           SYS_P11645              P2
INTERVAL_PARTITION           SYS_P11646              P1
INTERVAL_PARTITION           SYS_P11647              P2
INTERVAL_PARTITION           SYS_P11648              P1
INTERVAL_PARTITION           SYS_P11649              P2
INTERVAL_PARTITION           SYS_P11650              P1
INTERVAL_PARTITION           SYS_P11651              P2


12 rows selected.

系统自动分配的分区循环交替地存放在P1和P2表空间上,各为5个,这样就做到了I/O均衡。

当如可以看的更清楚
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ ---------------
INTERVAL_PARTITION   PART2010_01     TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               1 PART
INTERVAL_PARTITION   PART2010_02     TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               2 PART
INTERVAL_PARTITION   SYS_P11642      TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               3 P1
INTERVAL_PARTITION   SYS_P11643      TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               4 P2
INTERVAL_PARTITION   SYS_P11644      TO_DATE(' 2010-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               5 P1
INTERVAL_PARTITION   SYS_P11645      TO_DATE(' 2010-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               6 P2
INTERVAL_PARTITION   SYS_P11646      TO_DATE(' 2010-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               7 P1
INTERVAL_PARTITION   SYS_P11647      TO_DATE(' 2010-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               8 P2
INTERVAL_PARTITION   SYS_P11648      TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               9 P1
INTERVAL_PARTITION   SYS_P11649      TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              10 P2
INTERVAL_PARTITION   SYS_P11650      TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              11 P1
INTERVAL_PARTITION   SYS_P11651      TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              12 P2




6.查看数据分布
数据根据月份正确的插入到了各个分区中
SQL> select * from INTERVAL_PARTITION partition(PART2010_01);

    C1 C3
---------- ----------
     0 2010-01-01

SQL> select * from INTERVAL_PARTITION partition(PART2010_02);

    C1 C3
---------- ----------
     1 2010-02-01

SQL> select * from INTERVAL_PARTITION partition(SYS_P11642);

    C1 C3
---------- ----------
     2 2010-03-01

SQL> select * from INTERVAL_PARTITION partition(SYS_P11643);

    C1 C3
---------- ----------
     3 2010-04-01

SQL> select * from INTERVAL_PARTITION partition(SYS_P11644);

    C1 C3
---------- ----------
     4 2010-05-01

.
.
.
SQL> select * from INTERVAL_PARTITION partition(SYS_P11651);

    C1 C3
---------- ----------
    11 2010-12-01



------------------------------------------------------------
测试每月给interval 分区添加一个表空间

实验目的:每个月第一天0时新增加一个表空间X,系统自动分配新分区,然后将新分区存放到新增表空间X中,从而实现每个月的数据都存放到独立的表空间中。

给分区表INTERVAL_PARTITION添加一个新表空间P3
SQL> create tablespace p3 datafile '/u01/app/oradata/hou/p3.dbf' size 10M autoextend on next 10M maxsize 31G;
SQL> alter user part quota unlimited on p3;


为分区表 INTERVAL_PARTITION添加新的表空间
SQL> conn part/part
SQL> alter table INTERVAL_PARTITION  set store in (p1,p2,p3);

参考:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_3001.htm#i2087440
http://www./t_interval_partitioning.htm


查看表的元数据
从元数据中看不到p3。


插入数据看看
begin
for i in 0..11 loop
insert into INTERVAL_PARTITION values(i,add_months(to_date('2011-02-01','yyyy-mm-dd'),i));
end loop;
commit;
end;
/

收集统计信息:
exec dbms_stats.gather_table_stats(user,'INTERVAL_PARTITION',cascade=>true);

查询分区表具体信息
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME              PARTITION_NAME  HIGH_VALUE                                                                                                            PARTITION_POSITION TABLESPACE_NAME   NUM_ROWS
---------------------------- ---------------------- ---------------------------------------------------------------------------------------------------------------------------- ------------------ --------------- ----------
INTERVAL_PARTITION   PART2010_01     TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               1   PART              1
INTERVAL_PARTITION   PART2010_02     TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               2   PART              1
INTERVAL_PARTITION   SYS_P11642      TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               3    P1              1
INTERVAL_PARTITION   SYS_P11643      TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               4    P2              1
INTERVAL_PARTITION   SYS_P11644      TO_DATE(' 2010-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               5    P1              1
INTERVAL_PARTITION   SYS_P11645      TO_DATE(' 2010-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               6    P2              1
INTERVAL_PARTITION   SYS_P11646      TO_DATE(' 2010-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               7    P1              1
INTERVAL_PARTITION   SYS_P11647      TO_DATE(' 2010-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               8    P2              1
INTERVAL_PARTITION   SYS_P11648      TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               9    P1              1
INTERVAL_PARTITION   SYS_P11649      TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              10   P2              1
INTERVAL_PARTITION   SYS_P11650      TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              11   P1              1
INTERVAL_PARTITION   SYS_P11651      TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              12   P2              1
INTERVAL_PARTITION   SYS_P11652      TO_DATE(' 2011-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              13   P1              1
INTERVAL_PARTITION   SYS_P11653      TO_DATE(' 2011-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              14   P2              1
INTERVAL_PARTITION   SYS_P11654      TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              15   P3              1
INTERVAL_PARTITION   SYS_P11655      TO_DATE(' 2011-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              16   P1              1
INTERVAL_PARTITION   SYS_P11656      TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              17   P2              1
INTERVAL_PARTITION   SYS_P11657      TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              18   P3              1
INTERVAL_PARTITION   SYS_P11658      TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              19   P1              1
INTERVAL_PARTITION   SYS_P11659      TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              20   P2              1
INTERVAL_PARTITION   SYS_P11660      TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              21   P3              1
INTERVAL_PARTITION   SYS_P11661      TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              22   P1              1
INTERVAL_PARTITION   SYS_P11662      TO_DATE(' 2011-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              23   P2              1
INTERVAL_PARTITION   SYS_P11663      TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              24   P3              1
INTERVAL_PARTITION   SYS_P11664      TO_DATE(' 2012-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              25   P1              


上面绿色部分是插入数据产生的新分区。插入新时间段的数据,系统自动产生分区,用循环方式将新分区存放到P1 P2 P3分区中。

*做这个实验的本意是:每个月第一天0时新增加一个表空间X,系统自动分配新分区,然后将新分区存放到新增表空间X中,从而实现每个月的数据都存放到独立的表空间中。
通过实验,看来我的想法无法实现,oracle并不是发现新增表空间后,就把新增的分区存放到新的表空间,而是依然采用循环方式将新分区放到表空间中。

有个担忧:假如分区表INTERVAL_PARTITION可以将分区存放到P1 P2两个表空间,且这个分区表已经使用很久,P1 P2中存放着大量分区(也就是大量数据),这个时候P1 P2的分区数应该是均衡的,如果加入P3表空间,oracle采用什么方法实现P1 P2 P3的数据均衡呢?

开始实验:
1.摘除P3表空
SQL> alter table INTERVAL_PARTITION set store in(p1,p2);

Table altered.

但是查看INTERVAL_PARTITION的分区情况,发现存放到P3表空间的分区依然存在!!
SQL> 
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME   NUM_ROWS
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ --------------- ----------
INTERVAL_PARTITION   PART2010_01     TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               1 PART              1
INTERVAL_PARTITION   PART2010_02     TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               2 PART              1
INTERVAL_PARTITION   SYS_P11642      TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               3 P1              1
INTERVAL_PARTITION   SYS_P11643      TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               4 P2              1
INTERVAL_PARTITION   SYS_P11644      TO_DATE(' 2010-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               5 P1              1
INTERVAL_PARTITION   SYS_P11645      TO_DATE(' 2010-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               6 P2              1
INTERVAL_PARTITION   SYS_P11646      TO_DATE(' 2010-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               7 P1              1
INTERVAL_PARTITION   SYS_P11647      TO_DATE(' 2010-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               8 P2              1
INTERVAL_PARTITION   SYS_P11648      TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               9 P1              1
INTERVAL_PARTITION   SYS_P11649      TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              10 P2              1
INTERVAL_PARTITION   SYS_P11650      TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              11 P1              1
INTERVAL_PARTITION   SYS_P11651      TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              12 P2              1
INTERVAL_PARTITION   SYS_P11652      TO_DATE(' 2011-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              13 P1              1
INTERVAL_PARTITION   SYS_P11653      TO_DATE(' 2011-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              14 P2              1
INTERVAL_PARTITION   SYS_P11654      TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              15 P3              1
INTERVAL_PARTITION   SYS_P11655      TO_DATE(' 2011-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              16 P1              1
INTERVAL_PARTITION   SYS_P11656      TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              17 P2              1
INTERVAL_PARTITION   SYS_P11657      TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              18 P3              1
INTERVAL_PARTITION   SYS_P11658      TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              19 P1              1
INTERVAL_PARTITION   SYS_P11659      TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              20 P2              1
INTERVAL_PARTITION   SYS_P11660      TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              21 P3              1
INTERVAL_PARTITION   SYS_P11661      TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              22 P1              1
INTERVAL_PARTITION   SYS_P11662      TO_DATE(' 2011-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              23 P2              1
INTERVAL_PARTITION   SYS_P11663      TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              24 P3              1
INTERVAL_PARTITION   SYS_P11664      TO_DATE(' 2012-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              25 P1              1

看存放在P3的分区是否有数据,里面还有数据,我刚才摘除P3空间的操作没有生效吗?
SQL> select * from INTERVAL_PARTITION partition(SYS_P11663);

    C1 C3
---------- ------------
    10 01-DEC-11

SQL> select * from INTERVAL_PARTITION partition(SYS_P11660);

    C1 C3
---------- ------------
     7 01-SEP-11

SQL> select * from INTERVAL_PARTITION partition(SYS_P11657);

    C1 C3
---------- ------------
     4 01-JUN-11

SQL> select * from INTERVAL_PARTITION partition(SYS_P11654);

    C1 C3
---------- ------------
     1 01-MAR-11


2.插入新数据,看看新分区是否还存放在P3表空间
begin
for i in 0..11 loop
insert into INTERVAL_PARTITION values(i,add_months(to_date('2012-02-02','yyyy-mm-dd'),i));
end loop;
commit;
end;
/


SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME   NUM_ROWS
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ --------------- ----------
INTERVAL_PARTITION   PART2010_01     TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               1 PART              1
INTERVAL_PARTITION   PART2010_02     TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               2 PART              1
INTERVAL_PARTITION   SYS_P11642      TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               3 P1              1
INTERVAL_PARTITION   SYS_P11643      TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               4 P2              1
INTERVAL_PARTITION   SYS_P11644      TO_DATE(' 2010-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               5 P1              1
INTERVAL_PARTITION   SYS_P11645      TO_DATE(' 2010-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               6 P2              1
INTERVAL_PARTITION   SYS_P11646      TO_DATE(' 2010-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               7 P1              1
INTERVAL_PARTITION   SYS_P11647      TO_DATE(' 2010-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               8 P2              1
INTERVAL_PARTITION   SYS_P11648      TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               9 P1              1
INTERVAL_PARTITION   SYS_P11649      TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              10 P2              1
INTERVAL_PARTITION   SYS_P11650      TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              11 P1              1
INTERVAL_PARTITION   SYS_P11651      TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              12 P2              1
INTERVAL_PARTITION   SYS_P11652      TO_DATE(' 2011-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              13 P1              1
INTERVAL_PARTITION   SYS_P11653      TO_DATE(' 2011-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              14 P2              1
INTERVAL_PARTITION   SYS_P11654      TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              15 P3              1
INTERVAL_PARTITION   SYS_P11655      TO_DATE(' 2011-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              16 P1              1
INTERVAL_PARTITION   SYS_P11656      TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              17 P2              1
INTERVAL_PARTITION   SYS_P11657      TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              18 P3              1
INTERVAL_PARTITION   SYS_P11658      TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              19 P1              1
INTERVAL_PARTITION   SYS_P11659      TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              20 P2              1
INTERVAL_PARTITION   SYS_P11660      TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              21 P3              1
INTERVAL_PARTITION   SYS_P11661      TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              22 P1              1
INTERVAL_PARTITION   SYS_P11662      TO_DATE(' 2011-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              23 P2              1
INTERVAL_PARTITION   SYS_P11663      TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              24 P3              1
INTERVAL_PARTITION   SYS_P11664      TO_DATE(' 2012-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              25 P1              1
INTERVAL_PARTITION   SYS_P11665      TO_DATE(' 2012-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              26 P2
INTERVAL_PARTITION   SYS_P11666      TO_DATE(' 2012-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              27 P1
INTERVAL_PARTITION   SYS_P11667      TO_DATE(' 2012-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              28 P2
INTERVAL_PARTITION   SYS_P11668      TO_DATE(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              29 P1
INTERVAL_PARTITION   SYS_P11669      TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              30 P2
INTERVAL_PARTITION   SYS_P11670      TO_DATE(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              31 P1
INTERVAL_PARTITION   SYS_P11671      TO_DATE(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              32 P2
INTERVAL_PARTITION   SYS_P11672      TO_DATE(' 2012-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              33 P1
INTERVAL_PARTITION   SYS_P11673      TO_DATE(' 2012-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              34 P2
INTERVAL_PARTITION   SYS_P11674      TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              35 P1
INTERVAL_PARTITION   SYS_P11675      TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              36 P2
INTERVAL_PARTITION   SYS_P11676      TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              37 P1


上面绿色部分是新产生的分区,果然新分区不存放到P3表空间中,那么P3表空间中的数据为何依然存在呢?

试着删除P3表空间,看看数据是否被删除。
P3中含有的数据
10 01-DEC-11
7 01-SEP-11
4 01-JUN-11
1 01-MAR-11

SQL> conn / as sysdba
Connected.
SQL> drop tablespace p3 including contents and datafiles;
drop tablespace p3 including contents and datafiles
*
ERROR at line 1:
ORA-14404: partitioned table contains partitions in a different tablespace

P3表空间还有分区表的分区,看看能不能把P3表空间中的分区移到P1 P2中
conn part/part
alter table INTERVAL_PARTITION move partition SYS_P11654 tablespace p1;
alter table INTERVAL_PARTITION move partition SYS_P11657 tablespace p1;
alter table INTERVAL_PARTITION move partition SYS_P11660 tablespace p1;
alter table INTERVAL_PARTITION move partition SYS_P11663 tablespace p1;


SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME   NUM_ROWS
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ --------------- ----------
INTERVAL_PARTITION   PART2010_01     TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               1 PART              1
INTERVAL_PARTITION   PART2010_02     TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               2 PART              1
INTERVAL_PARTITION   SYS_P11642      TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               3 P1              1
INTERVAL_PARTITION   SYS_P11643      TO_DATE(' 2010-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               4 P2              1
INTERVAL_PARTITION   SYS_P11644      TO_DATE(' 2010-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               5 P1              1
INTERVAL_PARTITION   SYS_P11645      TO_DATE(' 2010-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               6 P2              1
INTERVAL_PARTITION   SYS_P11646      TO_DATE(' 2010-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               7 P1              1
INTERVAL_PARTITION   SYS_P11647      TO_DATE(' 2010-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               8 P2              1
INTERVAL_PARTITION   SYS_P11648      TO_DATE(' 2010-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA               9 P1              1
INTERVAL_PARTITION   SYS_P11649      TO_DATE(' 2010-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              10 P2              1
INTERVAL_PARTITION   SYS_P11650      TO_DATE(' 2010-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              11 P1              1
INTERVAL_PARTITION   SYS_P11651      TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              12 P2              1
INTERVAL_PARTITION   SYS_P11652      TO_DATE(' 2011-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              13 P1              1
INTERVAL_PARTITION   SYS_P11653      TO_DATE(' 2011-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              14 P2              1
INTERVAL_PARTITION   SYS_P11654      TO_DATE(' 2011-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              15 P1              1
INTERVAL_PARTITION   SYS_P11655      TO_DATE(' 2011-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              16 P1              1
INTERVAL_PARTITION   SYS_P11656      TO_DATE(' 2011-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              17 P2              1
INTERVAL_PARTITION   SYS_P11657      TO_DATE(' 2011-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              18 P1              1
INTERVAL_PARTITION   SYS_P11658      TO_DATE(' 2011-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              19 P1              1
INTERVAL_PARTITION   SYS_P11659      TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              20 P2              1
INTERVAL_PARTITION   SYS_P11660      TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              21 P1              1
INTERVAL_PARTITION   SYS_P11661      TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              22 P1              1
INTERVAL_PARTITION   SYS_P11662      TO_DATE(' 2011-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              23 P2              1
INTERVAL_PARTITION   SYS_P11663      TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              24 P1              1
INTERVAL_PARTITION   SYS_P11664      TO_DATE(' 2012-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              25 P1              1
INTERVAL_PARTITION   SYS_P11665      TO_DATE(' 2012-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              26 P2
INTERVAL_PARTITION   SYS_P11666      TO_DATE(' 2012-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              27 P1
INTERVAL_PARTITION   SYS_P11667      TO_DATE(' 2012-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              28 P2
INTERVAL_PARTITION   SYS_P11668      TO_DATE(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              29 P1
INTERVAL_PARTITION   SYS_P11669      TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              30 P2
INTERVAL_PARTITION   SYS_P11670      TO_DATE(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              31 P1
INTERVAL_PARTITION   SYS_P11671      TO_DATE(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              32 P2
INTERVAL_PARTITION   SYS_P11672      TO_DATE(' 2012-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              33 P1
INTERVAL_PARTITION   SYS_P11673      TO_DATE(' 2012-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              34 P2
INTERVAL_PARTITION   SYS_P11674      TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              35 P1
INTERVAL_PARTITION   SYS_P11675      TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              36 P2
INTERVAL_PARTITION   SYS_P11676      TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              37 P1

37 rows selected.

上面红色部分就是以前在P3表空间的分区,现在都移到了P1表空间。


再次删除P3表空间
SQL> conn / as sysdba
Connected.
SQL> drop tablespace p3 including contents and datafiles;

Tablespace dropped.
OK,成功!

*************************
删除分区表中表空间的顺序:
1.摘除某个表空间,store in 中写要保留的表空间即可
alter table partition_table set store in(tablespace1,tabelspace2);

2.将要删除的表空间中的分区移到保留的表空间中
alter table partition_table move partition xx tablespace xx;

3.删除表空间
drop tablespace xx including contents and datafiles;
***********************


3.向P1表空间中的SYS_P11642 分区大量插入数据
SQL> select * from INTERVAL_PARTITION partition(SYS_P11642);
   
  C1  C3
---------- ------------
     2 01-MAR-10

SQL> ALTER TABLE INTERVAL_PARTITION NOLOGGING;

Table altered.

begin
for i in 0..27900040 loop
insert into INTERVAL_PARTITION values(i,to_date('2010-03-01','yyyy-mm-dd'));
end loop;
commit;
end;
  /

SQL> select FILE_NAME,BYTES/1024/1024 as M from dba_data_files;

FILE_NAME                            M
-------------------------------------------------- ----------
/u01/app/oradata/hou/users01.dbf            699.5
/u01/app/oradata/hou/undotbs01.dbf             1405
/u01/app/oradata/hou/sysaux01.dbf             613.0625
/u01/app/oradata/hou/system01.dbf             1170
/u01/app/oradata/hou/example01.dbf              100
/u01/app/oradata/hou/p1.dbf                531.5
/u01/app/oradata/hou/p2.dbf                   10
/u01/app/oradata/hou/part01.dbf                70


P1表空间已经达到500多兆,而P2只有10兆。
再次插入新时间段数据,看看新分区分配到什么表空间。

begin
for i in 0..11 loop
insert into INTERVAL_PARTITION values(i,add_months(to_date('2013-02-02','yyyy-mm-dd'),i));
end loop;
commit;
end;
/

下面是新分配的分区,发现依然存在循环交替使用p1 p2表空间的情况。
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME          NUM_ROWS
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ ------------------------------ ----------
INTERVAL_PARTITION   SYS_P11677      TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              38 P2                     1
INTERVAL_PARTITION   SYS_P11678      TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              39 P1                     1
INTERVAL_PARTITION   SYS_P11679      TO_DATE(' 2013-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              40 P2                     1
INTERVAL_PARTITION   SYS_P11680      TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              41 P1                     1
INTERVAL_PARTITION   SYS_P11681      TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              42 P2                     1
INTERVAL_PARTITION   SYS_P11682      TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              43 P1                     1
INTERVAL_PARTITION   SYS_P11683      TO_DATE(' 2013-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              44 P2                     1
INTERVAL_PARTITION   SYS_P11684      TO_DATE(' 2013-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              45 P1                     1
INTERVAL_PARTITION   SYS_P11685      TO_DATE(' 2013-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              46 P2                     1
INTERVAL_PARTITION   SYS_P11686      TO_DATE(' 2013-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              47 P1                     1
INTERVAL_PARTITION   SYS_P11687      TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              48 P2                     1
INTERVAL_PARTITION   SYS_P11688      TO_DATE(' 2014-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              49 P1                     1



初步结论:interval并不能根据表空间使用率决定新分区分配到低使用率的表空间上,它只是遵循循环交替使用p1 p2表空间来分配新增的分区。


现在p1表空间只有一个数据文件p1.dbf,把尺寸固定到530M并且无法自动扩展,大量往P1中插数据,看看会怎么样
begin
for i in 0..50000 loop
insert into INTERVAL_PARTITION values(i,to_date('2010-03-01','yyyy-mm-dd'));
end loop;
commit;
end;
/

*
ERROR at line 1:
ORA-01688: unable to extend table PART.INTERVAL_PARTITION partition SYS_P11642 by 1024 in tablespace P1
ORA-06512: at line 3

p2表空间满, SYS_P11642分区不能再向p2中插入数据,从而可以看出,oracle并不能根据表空间的利用率自动均衡分配分区,


继续插入数据
begin
for i in 0..11 loop
insert into INTERVAL_PARTITION values(i,add_months(to_date('2014-02-02','yyyy-mm-dd'),i));
end loop;
commit;
end;
/


下面就是插入新数据后产生的新分区,发现oracle依然固执地循环分配新分区到P1 P2表空间,P2表空间已经满了,你还分配什么!
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,TABLESPACE_NAME,NUM_ROWS from user_tab_partitions where TABLE_NAME='INTERVAL_PARTITION';

TABLE_NAME         PARTITION_NAME  HIGH_VALUE                                       PARTITION_POSITION TABLESPACE_NAME          NUM_ROWS
-------------------- --------------- -------------------------------------------------------------------------------- ------------------ ------------------------------ ----------
INTERVAL_PARTITION   SYS_P11689      TO_DATE(' 2014-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              50 P2
INTERVAL_PARTITION   SYS_P11690      TO_DATE(' 2014-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              51 P1
INTERVAL_PARTITION   SYS_P11691      TO_DATE(' 2014-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              52 P2
INTERVAL_PARTITION   SYS_P11692      TO_DATE(' 2014-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              53 P1
INTERVAL_PARTITION   SYS_P11693      TO_DATE(' 2014-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              54 P2
INTERVAL_PARTITION   SYS_P11694      TO_DATE(' 2014-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              55 P1
INTERVAL_PARTITION   SYS_P11695      TO_DATE(' 2014-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              56 P2
INTERVAL_PARTITION   SYS_P11696      TO_DATE(' 2014-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              57 P1
INTERVAL_PARTITION   SYS_P11697      TO_DATE(' 2014-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              58 P2
INTERVAL_PARTITION   SYS_P11698      TO_DATE(' 2014-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              59 P1
INTERVAL_PARTITION   SYS_P11699      TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              60 P2
INTERVAL_PARTITION   SYS_P11700      TO_DATE(' 2015-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA              61 P1


总终结论:11g之前,分区表都要预分配分区。而11g 的interval partition 技术,在插入数据时会根据range列自动分配新分区,更加自动、简单化。
              同时,interval partition可以指定将分区创建在指定的表空间中(store in字子句指定),oracle采用循环交替分配新分区到各个表空间,这个动作极其机械化,只是循环!不会根据表空间的利用率,智能均衡表空间的里  用率!(如存在A B两个表空间,A表空间已经满了,B表空间数据量很少,oracle不会把新分区全部分配到B表空间,而是依然循环分配新分区到A B两个表空间!)从而可见,interval partition实现I/O均衡的能力也不过如此,没有想象的那么智能。


想要实现想法,看来还是要采用传统的利用存储过程定时预分配表空间和分区的方法。


三、普通range分区表可以转换为interval分区表
http:///2009/09/11g-interval-partitioning/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多