电竞比分网-中国电竞赛事及体育赛事平台

分享

oracle分區(qū)技術(shù)

 aaie_ 2018-02-14

分區(qū)寫法:


幾大點:
1.分區(qū)表
2.分區(qū)的區(qū)exp和imp
3.自動給分區(qū)表添加索引

自動分配表空間
http://space./17203031/viewspace-706173


alter table table_name drop partition partition_name;

interval分區(qū)

實驗環(huán)境:
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之前,分區(qū)必須是手工或者存儲過程預(yù)分配新分區(qū)。
interval 分區(qū)是oracle 11g引入的新技術(shù),無需DBA預(yù)分配新分區(qū),插入數(shù)據(jù)時系統(tǒng)會根據(jù)range列和已分配的分區(qū)自動判斷新數(shù)據(jù)是否可以插入到已存在的分區(qū)中,如果不能滿足插入已存在的分區(qū),系統(tǒng)自動分配一個新分區(qū)來存放新插入的數(shù)據(jù)。

interal 分區(qū)減少了dba對分區(qū)的操作,保證了分區(qū)的準(zhǔn)確安全性。

月自動創(chuàng)建分區(qū)
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.查看現(xiàn)在表的分區(qū)
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.插入數(shù)據(jù)測試
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.看看數(shù)據(jù)
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.看是否自己創(chuàng)建分區(qū)
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個分區(qū)=創(chuàng)建表時定義的2個分區(qū)+插入12條數(shù)據(jù)自動產(chǎn)生的分區(qū)。


查看單個分區(qū)中的數(shù)據(jù)
SQL> select * from MONTH_PART partition(SYS_P11606);

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





二、interval partition+store in
分區(qū)表的創(chuàng)建目的,除了進行分區(qū)內(nèi)局部掃描、便于管理外,還可以通過將分區(qū)存放在不同的表空間做到平衡分散IO的目的。所以,對分區(qū)的表空間規(guī)劃,通常是DBA日常決策的一個重要內(nèi)容。

interval partition中,分區(qū)的創(chuàng)建是由系統(tǒng)自動生成,這就存在一個問題:如何規(guī)劃分區(qū)的存儲,也就是系統(tǒng)自動分配的分區(qū)存放在哪些tablespace?

如果在store in后面標(biāo)注上tablespaces的列表,那么新創(chuàng)建出的分區(qū)就會依次循環(huán)的均勻存放在各個分區(qū)上。

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

實驗環(huán)境準(zhǔn)備:
添加表空間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.創(chuàng)建分區(qū)表
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.查看現(xiàn)在表的分區(qū)
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.插入數(shù)據(jù)測試
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.看看數(shù)據(jù)
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.看是否自己創(chuàng)建分區(qū)
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.

系統(tǒng)自動分配的分區(qū)循環(huán)交替地存放在P1和P2表空間上,各為5個,這樣就做到了I/O均衡。

當(dāng)如可以看的更清楚
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.查看數(shù)據(jù)分布
數(shù)據(jù)根據(jù)月份正確的插入到了各個分區(qū)中
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 分區(qū)添加一個表空間

實驗?zāi)康模好總€月第一天0時新增加一個表空間X,系統(tǒng)自動分配新分區(qū),然后將新分區(qū)存放到新增表空間X中,從而實現(xiàn)每個月的數(shù)據(jù)都存放到獨立的表空間中。

給分區(qū)表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;


為分區(qū)表 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


查看表的元數(shù)據(jù)
從元數(shù)據(jù)中看不到p3。


插入數(shù)據(jù)看看
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;
/

收集統(tǒng)計信息:
exec dbms_stats.gather_table_stats(user,'INTERVAL_PARTITION',cascade=>true);

查詢分區(qū)表具體信息
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              


上面綠色部分是插入數(shù)據(jù)產(chǎn)生的新分區(qū)。插入新時間段的數(shù)據(jù),系統(tǒng)自動產(chǎn)生分區(qū),用循環(huán)方式將新分區(qū)存放到P1 P2 P3分區(qū)中。

*做這個實驗的本意是:每個月第一天0時新增加一個表空間X,系統(tǒng)自動分配新分區(qū),然后將新分區(qū)存放到新增表空間X中,從而實現(xiàn)每個月的數(shù)據(jù)都存放到獨立的表空間中。
通過實驗,看來我的想法無法實現(xiàn),oracle并不是發(fā)現(xiàn)新增表空間后,就把新增的分區(qū)存放到新的表空間,而是依然采用循環(huán)方式將新分區(qū)放到表空間中。

有個擔(dān)憂:假如分區(qū)表INTERVAL_PARTITION可以將分區(qū)存放到P1 P2兩個表空間,且這個分區(qū)表已經(jīng)使用很久,P1 P2中存放著大量分區(qū)(也就是大量數(shù)據(jù)),這個時候P1 P2的分區(qū)數(shù)應(yīng)該是均衡的,如果加入P3表空間,oracle采用什么方法實現(xiàn)P1 P2 P3的數(shù)據(jù)均衡呢?

開始實驗:
1.摘除P3表空
SQL> alter table INTERVAL_PARTITION set store in(p1,p2);

Table altered.

但是查看INTERVAL_PARTITION的分區(qū)情況,發(fā)現(xiàn)存放到P3表空間的分區(qū)依然存在??!
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的分區(qū)是否有數(shù)據(jù),里面還有數(shù)據(jù),我剛才摘除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.插入新數(shù)據(jù),看看新分區(qū)是否還存放在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


上面綠色部分是新產(chǎn)生的分區(qū),果然新分區(qū)不存放到P3表空間中,那么P3表空間中的數(shù)據(jù)為何依然存在呢?

試著刪除P3表空間,看看數(shù)據(jù)是否被刪除。
P3中含有的數(shù)據(jù)
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表空間還有分區(qū)表的分區(qū),看看能不能把P3表空間中的分區(qū)移到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表空間的分區(qū),現(xiàn)在都移到了P1表空間。


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

Tablespace dropped.
OK,成功!

*************************
刪除分區(qū)表中表空間的順序:
1.摘除某個表空間,store in 中寫要保留的表空間即可
alter table partition_table set store in(tablespace1,tabelspace2);

2.將要刪除的表空間中的分區(qū)移到保留的表空間中
alter table partition_table move partition xx tablespace xx;

3.刪除表空間
drop tablespace xx including contents and datafiles;
***********************


3.向P1表空間中的SYS_P11642 分區(qū)大量插入數(shù)據(jù)
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表空間已經(jīng)達(dá)到500多兆,而P2只有10兆。
再次插入新時間段數(shù)據(jù),看看新分區(qū)分配到什么表空間。

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;
/

下面是新分配的分區(qū),發(fā)現(xiàn)依然存在循環(huán)交替使用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



初步結(jié)論:interval并不能根據(jù)表空間使用率決定新分區(qū)分配到低使用率的表空間上,它只是遵循循環(huán)交替使用p1 p2表空間來分配新增的分區(qū)。


現(xiàn)在p1表空間只有一個數(shù)據(jù)文件p1.dbf,把尺寸固定到530M并且無法自動擴展,大量往P1中插數(shù)據(jù),看看會怎么樣
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分區(qū)不能再向p2中插入數(shù)據(jù),從而可以看出,oracle并不能根據(jù)表空間的利用率自動均衡分配分區(qū),


繼續(xù)插入數(shù)據(jù)
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;
/


下面就是插入新數(shù)據(jù)后產(chǎn)生的新分區(qū),發(fā)現(xiàn)oracle依然固執(zhí)地循環(huán)分配新分區(qū)到P1 P2表空間,P2表空間已經(jīng)滿了,你還分配什么!
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


總終結(jié)論:11g之前,分區(qū)表都要預(yù)分配分區(qū)。而11g 的interval partition 技術(shù),在插入數(shù)據(jù)時會根據(jù)range列自動分配新分區(qū),更加自動、簡單化。
              同時,interval partition可以指定將分區(qū)創(chuàng)建在指定的表空間中(store in字子句指定),oracle采用循環(huán)交替分配新分區(qū)到各個表空間,這個動作極其機械化,只是循環(huán)!不會根據(jù)表空間的利用率,智能均衡表空間的里  用率!(如存在A B兩個表空間,A表空間已經(jīng)滿了,B表空間數(shù)據(jù)量很少,oracle不會把新分區(qū)全部分配到B表空間,而是依然循環(huán)分配新分區(qū)到A B兩個表空間!)從而可見,interval partition實現(xiàn)I/O均衡的能力也不過如此,沒有想象的那么智能。


想要實現(xiàn)想法,看來還是要采用傳統(tǒng)的利用存儲過程定時預(yù)分配表空間和分區(qū)的方法。


三、普通range分區(qū)表可以轉(zhuǎn)換為interval分區(qū)表
http:///2009/09/11g-interval-partitioning/

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多