IT技ji)躉?dong)交流平台

美狮彩票网官网

作者(zhe)︰Yumiko_Sunny  來源︰IT165收集  發布日期︰2020-02-22 06:08:41

版權聲明(ming)︰本文發布于(yu)http://www.cnblogs.com/yumiko/,版權由Yumiko_sunny所有,歡迎轉載(zai)。轉載(zai)時,請在文章明(ming)顯(xian)位置(zhi)注(zhu)明(ming)原文鏈接。若在未經(jing)作者(zhe)同意的情(qing)況下,將本文內容用于(yu)商業用途,將保留追(zhui)究其法律(lv)責(ze)任的權利。如果有問(wen)題,請以郵箱方式聯系作者(zhe)(793113046@qq.com)。


 前言

本文著重總結分區表的日常維護操作以及相應的注(zhu)意事項。 本文涉及的日常維護內容包括(kuo)︰
  • 增加分區(add)
    • 移動(dong)分區(move) 截斷分區(truncate) 刪除分區(drop) 拆分分區(split) 合並(bing)分區(merge)      --hash分區不適shi)/strong> 交換分區(exchange)
      • 收縮(suo)分區(coalesce)   --僅適shi)糜yu)hash分區 本文涉及一(yi)些非分區表至分區表的遷移方法的思(si)路,以及一(yi)些日常維護操作在特(te)殊情(qing)況下的處(chu)理方法。 本文演示涉及的測試分區表,若無(wu)特(te)殊創建或者(zhe)說明(ming),默認使用“測試表準備”部分提及的測試表。 本文演示使用的數據庫版本為oracle 11.2.0.4。

        需(xu)要(yao)注(zhu)意︰關于(yu)分區表日常維護操作,對于(yu)分區表索引(yin)的影響未提及,會在後面(mian)總結分區表索引(yin)時進行闡述說明(ming)。

        1、測試表準備

        為了便于(yu)具(ju)體的操作演示,首先準備一(yi)張RANGE型的測試分區表TEST_RANGE_PARTITION。

        這里的測試數據來源于(yu)oracle測試用戶scott下的emp表。

        --創建分區表TEST_RANGE_PARTITION--這里通過dbms_metadata.get_ddl獲得emp表的建表結構進而修(xiu)改Yumiko_sunny@OA01> CREATE TABLE 'SCOTT'.'TEST_RANGE_PARTITION' 2 ( 'EMPNO' NUMBER(4,0), 3  'ENAME' VARCHAR2(10), 4  'JOB' VARCHAR2(9), 5  'MGR' NUMBER(4,0), 6  'HIREDATE' DATE, 7  'SAL' NUMBER(7,2), 8  'COMM' NUMBER(7,2), 9  'DEPTNO' NUMBER(2,0) 10 ) 11 PARTITION BY RANGE ('SAL') 12 (PARTITION 'TEST_RANGE_SAL_01' VALUES LESS THAN (1000) 13 PARTITION 'TEST_RANGE_SAL_02' VALUES LESS THAN (2000) 14 PARTITION 'TEST_RANGE_SAL_03' VALUES LESS THAN (3000) 15 PARTITION 'TEST_RANGE_SAL_MAX' VALUES LESS THAN (MAXVALUE) 16 );Table created.Yumiko_sunny@OA01> insert into TEST_RANGE_PARTITION select * from emp;14 rows created.Yumiko_sunny@OA01> commit;Commit complete.

        通過下面(mian)的方法,了解關于(yu)上面(mian)創建分區表的數據分布基本情(qing)況。

        --查詢(xun)分表各分區的條件以及數據庫分布情(qing)況--可以看到(dao)此時NUM_ROWS列為空,主要(yao)是(shi)因為表的的統計信息未收集導致。Yumiko_sunny@OA01> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS 2 from user_part_tables a,user_tab_partitions b 3 where a.TABLE_NAME=b.TABLE_NAME; TABLE_NAME   PARTITION PARTITION_NAME HIGH_VALUE NUM_ROWS------------------------------ --------- -------------------- ----------- ----------TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_01 1000TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_02 2000TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_03 3000TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_MAX MAXVALUE--收集分區表TEST_RANGE_PARTITION的統計信息Yumiko_sunny@OA01> analyze table TEST_RANGE_PARTITION compute statistics;Table analyzed.--可以看到(dao),此時各分區的數據情(qing)況已經(jing)顯(xian)示出來Yumiko_sunny@OA01> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS 2 from user_part_tables a,user_tab_partitions b 3 where a.TABLE_NAME=b.TABLE_NAME; TABLE_NAME   PARTITION PARTITION_NAME HIGH_VALUE NUM_ROWS------------------------------ --------- -------------------- ----------- ----------TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_01 1000   2TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_02 2000   6TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_03 3000   3TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_MAX MAXVALUE  3

        通過上面(mian)的操作,已經(jing)成(cheng)功創建了一(yi)張RANGE型的分區表。

        下面(mian)將依托這張表,介紹分區表的日常維護操作。

        2、增加分區維護操作(add)

        增加分區維護操作,顧名(ming)思(si)jia)澹 饕yao)針對當前分區表進行添(tian)加新(xin)分區的操作。

        當分區表存在默認條件分區,如︰RANGE分區表的MAXVALUE分區、LIST分區表的DEFAULT分區,此時增加分區操作會報錯。

        下面(mian)嘗(chang)試通過增加分區操作,直接為測試表增加分區TEST_RANGE_SAL_04

        Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_04 values less than(4000);alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_04 values less than(4000)      *ERROR at line 1:ORA-14074: partition bound must collate higher than that of the last partition

        可以看到(dao),針對存在默認條件的分區表,無(wu)法執行增加分區操作。

        解決辦法︰

        1、刪除原默認條件分區,待增加分區後,再(zai)重新(xin)添(tian)加默認條件分區。
        2、使用拆分分區(split)的方式,後面(mian)介紹

        這里,我們嘗(chang)試下解決辦法1的方法進行操作。

        --刪除存在默認條件MAXVALUE的分區Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_MAX;Table altered.--重新(xin)收集分區表的統計信息Yumiko_sunny@OA01> analyze table TEST_RANGE_PARTITION compute statistics;Table analyzed.--觀察(cha)分區表的信息,可以看到(dao)此時默認條件MAXVALUE的分區已經(jing)不存在Yumiko_sunny@OA01> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS 2 from user_part_tables a,user_tab_partitions b 3 where a.TABLE_NAME=b.TABLE_NAME; TABLE_NAME   PARTITION PARTITION_NAME HIGH_VALUE NUM_ROWS------------------------------ --------- -------------------- ----------- ----------TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_01 1000   2TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_02 2000   6TEST_RANGE_PARTITION  RANGE TEST_RANGE_SAL_03 3000   3--增加新(xin)分區TEST_RANGE_SAL_04Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_04 values less than(4000);Table altered.--重新(xin)增加默認條件MAXVALUE分區Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_MAX values less than(maxvalue);Table altered.

        通過上面(mian)的方法,已經(jing)完(wan)成(cheng)了增加分區的操作。下面(mian)進一(yi)步驗證(zheng)增加分區的操作。

        --重新(xin)收集測試分區表的統計信息Yumiko_sunny@OA01> analyze table TEST_RANGE_PARTITION compute statistics;Table analyzed.--查看分區表信息,可以看到(dao)上面(mian)增加的新(xin)分區Yumiko_sunny@OA01> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS 2 from user_part_tables a,user_tab_partitions b 3 where a.TABLE_NAME=b.TABLE_NAME; TABLE_NAME  PARTITION PARTITION_NAME HIGH_VALUE NUM_ROWS--------------------- --------- ------------------ ----------- ---------TEST_RANGE_PARTITION RANGE TEST_RANGE_SAL_01 1000  2TEST_RANGE_PARTITION RANGE TEST_RANGE_SAL_02 2000  6TEST_RANGE_PARTITION RANGE TEST_RANGE_SAL_03 3000  3TEST_RANGE_PARTITION RANGE TEST_RANGE_SAL_MAX MAXVALUE  0TEST_RANGE_PARTITION RANGE TEST_RANGE_SAL_04 4000  0

        需(xu)要(yao)注(zhu)意的是(shi)︰對于(yu)默認條件的分區進行刪除,其數據不會重分布到(dao)其他分區,而是(shi)刪除數據。因此在生產環境使用需(xu)慎重

        至此,增加分區維護操作的介紹結束。

        3、移動(dong)分區維護操作(move)

        移動(dong)分區維護操作,主要(yao)是(shi)將分區從一(yi)個表空間(jian)遷移至另一(yi)個表空間(jian)中。

        --查看當前分區對應的表空間(jian)情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;TABLE_NAME   PARTITION_NAME TABLESPACE_NAME------------------------------ -------------------- ------------------------------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02 USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_03 USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_01 USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_04 USERS--執行移動(dong)分區操作Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION move partition TEST_RANGE_SAL_01 tablespace PARTITION_TS;Table altered.--驗證(zheng)移動(dong)後,分區所在的表空間(jian)Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;TABLE_NAME   PARTITION_NAME TABLESPACE_NAME------------------------------ -------------------- ------------------------------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02 USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_03 USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_01 PARTITION_TSTEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERSTEST_RANGE_PARTITION  TEST_RANGE_SAL_04 USERS

        需(xu)要(yao)注(zhu)意的是(shi)︰

        對于(yu)組合分區,無(wu)法直接移動(dong)分區,否則(ze)會拋(pao)出ORA-14257錯誤(wu),示例如下︰

        --準備一(yi)張list-list的組合分區表Yumiko_sunny@OA01> CREATE TABLE 'EMPLOYEE_LIST_LIST_PART' 2 ( 'EMPNO' NUMBER(4,0), 3 'ENAME' VARCHAR2(10), 4 'JOB' VARCHAR2(9), 5 'MGR' NUMBER(4,0), 6 'HIREDATE' DATE, 7 'SAL' NUMBER(7,2), 8 'COMM' NUMBER(7,2), 9 'DEPTNO' NUMBER(2,0) 10 ) 11 PARTITION BY LIST (DEPTNO) 12 SUBPARTITION BY LIST (JOB) 13 ( 14 PARTITION EMPLOYEE_DEPTNO_10 VALUES (10) 15 ( SUBPARTITION EMPLOYEE_10_JOB_MAGAGER VALUES ('MANAGER'), 16  SUBPARTITION EMPLOYEE_10_JOB_DEFAULT VALUES (DEFAULT) 17 ), 18 PARTITION EMPLOYEE_DEPTNO_20 VALUES (20) 19 ( SUBPARTITION EMPLOYEE_20_JOB_MAGAGER VALUES ('MANAGER'), 20  SUBPARTITION EMPLOYEE_20_JOB_DEFAULT VALUES (DEFAULT) 21 ), 22 PARTITION EMPLOYEE_DEPTNO_OTHERS VALUES (DEFAULT) 23 ( SUBPARTITION EMPLOYEE_30_JOB_MAGAGER VALUES ('MANAGER'), 24  SUBPARTITION EMPLOYEE_30_JOB_DEFAULT VALUES (DEFAULT) 25 ) 26 );Table created.--查看當前an)gai)組合分區所在表空間(jian)的信息Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME,TABLESPACE_NAME from user_tab_subpartitions;TABLE_NAME  PARTITION_NAME  SUBPARTITION_NAME TABLESPACE_NAME----------------------- ---------------------- ------------------------ ---------------EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10 EMPLOYEE_10_JOB_MAGAGER USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10 EMPLOYEE_10_JOB_DEFAULT USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20 EMPLOYEE_20_JOB_MAGAGER USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20 EMPLOYEE_20_JOB_DEFAULT USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_MAGAGER USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_DEFAULT USERS--移動(dong)組合分區表的區分Yumiko_sunny@OA01> alter table EMPLOYEE_LIST_LIST_PART move partition EMPLOYEE_DEPTNO_20 tablespace PARTITION_TS;alter table EMPLOYEE_LIST_LIST_PART move partition EMPLOYEE_DEPTNO_20 tablespace PARTITION_TS       *ERROR at line 1:ORA-14257: cannot move partition other than a Range, List, System, or Hash partition

        通過上面(mian)的演示,可以清楚(chu)的看到(dao),對于(yu)組合分區,無(wu)法直接移動(dong)分區至新(xin)的表空間(jian)。

        解決辦法︰

        移動(dong)分區表的子分區,然後修(xiu)改當前所在分區的屬性即可。具(ju)體演示如下︰

        --移動(dong)子分區Yumiko_sunny@OA01> alter table EMPLOYEE_LIST_LIST_PART move subpartition EMPLOYEE_20_JOB_MAGAGER tablespace PARTITION_TS;Table altered.Yumiko_sunny@OA01> alter table EMPLOYEE_LIST_LIST_PART move subpartition EMPLOYEE_20_JOB_DEFAULT tablespace PARTITION_TS;Table altered.--修(xiu)改分區的默認屬性Yumiko_sunny@OA01> ALTER TABLE EMPLOYEE_LIST_LIST_PART MODIFY DEFAULT ATTRIBUTES FOR PARTITION EMPLOYEE_DEPTNO_20 2 tablespace PARTITION_TS;Table altered.--驗證(zheng)移動(dong)分區後的結果Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME,TABLESPACE_NAME from user_tab_subpartitions;TABLE_NAME  PARTITION_NAME  SUBPARTITION_NAME TABLESPACE_NAME----------------------- --------------------- ----------------------- ---------------EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10 EMPLOYEE_10_JOB_MAGAGER USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10 EMPLOYEE_10_JOB_DEFAULT USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20 EMPLOYEE_20_JOB_MAGAGER PARTITION_TSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20 EMPLOYEE_20_JOB_DEFAULT PARTITION_TSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_MAGAGER USERSEMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_DEFAULT USERS

        可以看到(dao),通過移動(dong)子分區的方法,完(wan)成(cheng)了對于(yu)組合分區的移動(dong)操作。

        4、截斷分區維護操作(truncate)

        截斷分區維護操作,相對于(yu)傳統的delete操作,刪除數據的效率會更(geng)高。而且yi)嶠jiang)低高水(shui)位線。

        演示如下︰

        --查看當前測試表分區情(qing)況及分區中的記錄ji)umiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions 2 where PARTITION_NAME='TEST_RANGE_SAL_02' or PARTITION_NAME='TEST_RANGE_SAL_03';TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   6TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3--執行截斷分區操作Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION truncate partition TEST_RANGE_SAL_02;Table truncated.--重新(xin)收集最新(xin)的測試表的統計信息Yumiko_sunny@OA01> analyze table TEST_RANGE_PARTITION compute statistics;Table analyzed.--驗證(zheng)截斷操作後,分區的記錄ji)浠umiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions 2 where PARTITION_NAME='TEST_RANGE_SAL_02' or PARTITION_NAME='TEST_RANGE_SAL_03';TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS    0TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3

        從上面(mian)的演示中可以看到(dao),通過truncate操作,測試表的TEST_RANGE_SAL_02分區數據被清空。

        至此,演示完(wan)畢。

        5、刪除分區維護操作(drop)

        對于(yu)分區的刪除操作,需(xu)要(yao)注(zhu)意,在刪除分區後,分區所記錄的數據,不會重分布至其他分區中,而是(shi)被一(yi)並(bing)刪除。

        --檢查當前分區表的分區情(qing)況,以及數據的分布情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_01  PARTITION_TS  2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   0--執行分區的刪除操作Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_04;Table altered.--再(zai)次檢查分區表的分區情(qing)況,以及數據的分布情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_01  PARTITION_TS  2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0

        可以看到(dao),分區的刪除操作不會影響數據的分布情(qing)況。

        6、拆分分區維護操作(split)

        在“增加分區維護操作”部分,提到(dao)了對于(yu)存在默認條件的分區表增加分區的的兩種(zhong)辦法,這里將介紹通過拆分分區的辦法來增加分區。

        需(xu)要(yao)注(zhu)意︰在目標分區拆分後,被拆分的分區會按照拆分規則(ze),將數據進行重分布

        演示實例︰

        首先,將測試表的數據分布還原至初(chu)建時的數據分布態。

        --清空測試分區表中的所有數據Yumiko_sunny@OA01> truncate table TEST_RANGE_PARTITION;Table truncated.--重新(xin)加載(zai)測試分區表的數據Yumiko_sunny@OA01> insert into TEST_RANGE_PARTITION select * from emp;14 rows created.Yumiko_sunny@OA01> commit;Commit complete.--重新(xin)收集測試表的統計信息Yumiko_sunny@OA01> analyze table TEST_RANGE_PARTITION compute statistics;Table analyzed.--查看此時,數據在分區間(jian)的分布情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   6TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_01  PARTITION_TS  2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   3

        查看此時,存在默認條件MAXVALUE的分區TEST_RANGE_SAL_MAX的具(ju)體數據信息。

        Yumiko_sunny@OA01> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_MAX); EMPNO ENAME JOB  MGR HIREDATE  SAL COMM DEPTNO---------- ---------- --------- ---------- ------------ -------- -------- --------- 7788 SCOTT ANALYST  7566 19-APR-87 3000   20 7839 KING PRESIDENT  17-NOV-81 5000   10 7902 FORD ANALYST  7566 03-DEC-81 3000   20

          

        下面(mian)針對上面(mian)的分區TEST_RANGE_SAL_MAX進行拆分處(chu)理,其中︰

        將SAL>=3000且SAL<4000的數據放入(ru)新(xin)的分區TEST_RANGE_SAL_04。
        將SAL>=4000的數據保留在分區TEST_RANGE_SAL_MAX中。

        --針對yue)勘?智 蔥脅鴟址智 ?僮-依據上面(mian)的需(xu)求,將數據拆分zhong)練智EST_RANGE_SAL_04以及TEST_RANGE_SAL_MAX中Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION split partition TEST_RANGE_SAL_MAX at (4000) into 2 (partition TEST_RANGE_SAL_04,partition TEST_RANGE_SAL_MAX);Table altered.--查看此時測試分區表的分區情(qing)況,以及數據分布情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   6TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_01  PARTITION_TS  2TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   1

        驗證(zheng)分區中實際(ji)的數據內容

        Yumiko_sunny@OA01> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_04); EMPNO ENAME JOB  MGR HIREDATE  SAL COMM DEPTNO---------- ---------- --------- ---------- ------------ ---------- ---------- ---------- 7788 SCOTT ANALYST  7566 19-APR-87  3000   20 7902 FORD ANALYST  7566 03-DEC-81  3000   20Yumiko_sunny@OA01> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_MAX); EMPNO ENAME JOB  MGR HIREDATE  SAL COMM DEPTNO---------- ---------- --------- ---------- ------------ ---------- ---------- ---------- 7839 KING PRESIDENT  17-NOV-81  5000   10

        可以看到(dao),經(jing)過拆分,數據已按之前的需(xu)求,分別存儲在兩個分區中。


        7、合並(bing)分區維護操作(merge)

        合並(bing)分區操作,主要(yao)是(shi)將不同的分區,通過分區的合並(bing),進行整合。

        需(xu)要(yao)注(zhu)意︰

        對于(yu)list分區,合並(bing)的分區無(wu)限制(zhi)要(yao)求。 對于(yu)range分區,合並(bing)的分區必(bi)須相鄰,否則(ze)無(wu)法進行合並(bing)操作。 對于(yu)hash分區,無(wu)法進行合並(bing)分區操作

        此外,對于(yu)range分區,下限值由邊界(jie)值dao)jiao)低的分區決定,上限值由邊界(jie)值dao)jiao)高的分區決定。

        演示示例︰

        通過合並(bing)分區技ji)   饈員淼姆智EST_RANGE_SAL_01以及分區TEST_RANGE_SAL_02進行合並(bing),具(ju)體如下︰ 

        --查看當前分區表的分區情(qing)況Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_02  USERS   6TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_01  PARTITION_TS  2TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   1--進行合並(bing)分區操作Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION merge partitions 2 TEST_RANGE_SAL_01,TEST_RANGE_SAL_02 3 into partition TEST_RANGE_SAL_00;Table altered.--驗證(zheng)合並(bing)分區後的結果Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   3TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   2TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   1TEST_RANGE_PARTITION  TEST_RANGE_SAL_00  USERS   8

        8、交換分區維護操作(exchange) 

        交換分區技ji)  饕yao)是(shi)將一(yi)個非分區表的數據同“一(yi)個分區表的一(yi)個分區”進行數據交換。支(zhi)持(chi)雙向交換,既可以從分區表的分區中遷移到(dao)非分區表,也可以從非分區表遷移至分區表的分區中
        原則(ze)上,非分區表的結構、數據分布等,要(yao)符合分區表的目標分區的定義規則(ze)

        演示如下︰

        首先,清空測試分區表的數據

        Yumiko_sunny@OA01> truncate table TEST_RANGE_PARTITION;Table truncated.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_00  USERS   0

        創建一(yi)張基于(yu)emp表,sal<2000的測試非分區表emp_test。

        Yumiko_sunny@OA01> create table emp_test as select * from emp where sal < 2000;Table created.Yumiko_sunny@OA01> select count(*) from emp_test; COUNT(*)----------  8

        注(zhu)意,此時非分區表的數據量為8條記錄。

        執行交換分區操作,觀察(cha)分區表的記錄變化,以及非分區表的記錄變化

        --執行分區交換操作Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test;Table altered.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_00  USERS   8TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0Yumiko_sunny@OA01> select count(*) from emp_test; COUNT(*)----------  0

        可以看到(dao),通過分去交換,非分區表的數據轉移至分區表中,同時非分區表的記錄被清除。

        再(zai)次執行交換分區操作,觀察(cha)分區表的記錄變化,以及非分區表的記錄變化

        Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test;Table altered.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_00  USERS   0Yumiko_sunny@OA01> select count(*) from emp_test; COUNT(*)----------  8

        可以看到(dao),此時分區表的數據又再(zai)次轉移回至非分區表,證(zheng)明(ming)了前面(mian)所述,分區交換技ji)  瓤梢源臃智淼姆智星ㄒ頻dao)非分區表,也可以從非分區表遷移至分區表的分區中。

        若非分區表的數據,不符合分區表的分區規則(ze),此時交換會拋(pao)出ORA-14099錯誤(wu)。

        --清空上面(mian)測試非分區表的數據Yumiko_sunny@OA01> truncate table emp_test;Table truncated.--加載(zai)emp的所有數據至該(gai)測試非分區表--之所以使用測試非分區表,是(shi)考慮emp表以後做(zuo)其他實驗時可能還需(xu)要(yao)其中的數據--通過這樣操作,測試非分區表的數據,既存在sal<2000的數據,也存在sal>2000的數據Yumiko_sunny@OA01> insert into emp_test select * from emp;14 rows created.Yumiko_sunny@OA01> commit;Commit complete.--嘗(chang)試交換分區,觀察(cha)結果Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test;alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test           *ERROR at line 1:ORA-14099: all rows in table do not qualify for specified partition

        可以看到(dao),由于(yu)TEST_RANGE_SAL_00分區的限制(zhi)條件為sal<2000,而測試非分區表的數據包含了sal>2000的數據,因此交換失敗(bai)。

        解決辦法︰

        通過without validation子句,可以避免數據校驗,而交換成(cheng)功。但會存在與分區規則(ze)相悖的數據,因此該(gai)方法要(yao)慎重。

        Yumiko_sunny@OA01> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test without validation;Table altered.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------TEST_RANGE_PARTITION  TEST_RANGE_SAL_03  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_00  USERS   14TEST_RANGE_PARTITION  TEST_RANGE_SAL_04  USERS   0TEST_RANGE_PARTITION  TEST_RANGE_SAL_MAX USERS   0

          

        技ji)醴槳an)擴展思(si)路︰

        若打算采用交換分區的方法,以實現非分區表到(dao)分區表的轉換,可以采用先創建一(yi)個只有默認條件的單一(yi)分區的分區表,在分區交換數據後,根據實際(ji)需(xu)要(yao),通過前面(mian)提到(dao)jiang)ldquo;拆分分區”的方法進行分區操作。

        9、收縮(suo)分區維護操作(coalesce)

        收縮(suo)分區維護操作,僅僅可以在hash分區以及組合分區的hash子分區上進行使用

        通過使用收縮(suo)分區技ji)  梢允賬suo)當前hash分區的分區數量。

        對于(yu)hash分區的數據,在收縮(suo)過程中,oracle會自動(dong)完(wan)成(cheng)數據在分區間(jian)的重分布。

        演示如下︰

        首先基于(yu)emp表的數據,創建一(yi)張hash分區表

        Yumiko_sunny@OA01> CREATE TABLE 'EMPLOYEE_HASH_PART' 2 ( 'EMPNO' NUMBER(4,0), 3 'ENAME' VARCHAR2(10), 4 'JOB' VARCHAR2(9), 5 'MGR' NUMBER(4,0), 6 'HIREDATE' DATE, 7 'SAL' NUMBER(7,2), 8 'COMM' NUMBER(7,2), 9 'DEPTNO' NUMBER(2,0) 10 ) 11 PARTITION BY HASH (ENAME) 12 ( 13 PARTITION EMPLOYEE_PART01, 14 PARTITION EMPLOYEE_PART02 15 ); Table created.Yumiko_sunny@OA01> insert into EMPLOYEE_HASH_PART select * from emp;14 rows created.Yumiko_sunny@OA01> commit;Commit complete.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------EMPLOYEE_HASH_PART  EMPLOYEE_PART02  USERS   6EMPLOYEE_HASH_PART  EMPLOYEE_PART01  USERS   8

        執行收縮(suo)分區操作

        Yumiko_sunny@OA01> alter table EMPLOYEE_HASH_PART coalesce partition;Table altered.Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------EMPLOYEE_HASH_PART  EMPLOYEE_PART01  USERS   14

        可以看到(dao),通過收縮(suo)分區,原本兩個分區整合到(dao)一(yi)個,而且數據也同時被整合。

        需(xu)要(yao)注(zhu)意︰

        當hash分區中只有一(yi)個分區時,此時無(wu)法進行收縮(suo)操作。

        Yumiko_sunny@OA01> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions;TABLE_NAME   PARTITION_NAME  TABLESPACE_NAME NUM_ROWS------------------------------ ------------------------- --------------- ----------EMPLOYEE_HASH_PART  EMPLOYEE_PART01  USERS   14Yumiko_sunny@OA01> alter table EMPLOYEE_HASH_PART coalesce partition;alter table EMPLOYEE_HASH_PART coalesce partition  *ERROR at line 1:ORA-14285: cannot COALESCE the only partition of this hash partitioned table or index

        至此,關于(yu)分區表的日常維護操作及注(zhu)意事項總結結束,後續會抽時間(jian)總結分區表索引(yin)的維護。

Tag標簽(qian)︰分區表  紅(hong)字(zi)  注(zhu)意事項  
  • 美狮彩票网官网

About IT165 - 廣告服(fu)務 - 隱私聲明(ming) - 版權申明(ming) - 免責(ze)條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于(yu)互聯網,僅供用于(yu)網絡(luo)技ji)躚 xi),學習(xi)中請遵循相關法律(lv)法規
美狮彩票网官网 | 下一页