溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ORACLE分區(qū)表日常維護(hù)方法是什么

發(fā)布時(shí)間:2021-12-22 09:52:11 來源:億速云 閱讀:109 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要講解了“ORACLE分區(qū)表日常維護(hù)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“ORACLE分區(qū)表日常維護(hù)方法是什么”吧!

1、測試表準(zhǔn)備
為了便于具體的操作演示,首先準(zhǔn)備一張RANGE型的測試分區(qū)表TEST_RANGE_PARTITION。
這里的測試數(shù)據(jù)來源于oracle測試用戶scott下的emp表。

--創(chuàng)建分區(qū)表TEST_RANGE_PARTITION
--這里通過dbms_metadata.get_ddl獲得emp表的建表結(jié)構(gòu)進(jìn)而修改
SQL> CREATE TABLE "SCOTT"."TEST_RANGE_PARTITION"
      (    "EMPNO" NUMBER(4,0),
           "ENAME" VARCHAR2(10),
           "JOB" VARCHAR2(9),
           "MGR" NUMBER(4,0),
           "HIREDATE" DATE,
           "SAL" NUMBER(7,2),
           "COMM" NUMBER(7,2),
           "DEPTNO" NUMBER(2,0)
      )
     PARTITION BY RANGE ("SAL")
      (PARTITION "TEST_RANGE_SAL_01" VALUES LESS THAN (1000),
       PARTITION "TEST_RANGE_SAL_02" VALUES LESS THAN (2000),
       PARTITION "TEST_RANGE_SAL_03" VALUES LESS THAN (3000),
       PARTITION "TEST_RANGE_SAL_MAX" VALUES LESS THAN (MAXVALUE)  
      );
Table created.


SQL> insert into TEST_RANGE_PARTITION select * from emp;

14 rows created.


SQL> commit;

Commit complete.

通過下面的方法,了解關(guān)于上面創(chuàng)建分區(qū)表的數(shù)據(jù)分布基本情況。
復(fù)制代碼

--查詢分表各分區(qū)的條件以及數(shù)據(jù)庫分布情況
--可以看到此時(shí)NUM_ROWS列為空,主要是因?yàn)楸淼牡慕y(tǒng)計(jì)信息未收集導(dǎo)致。
SQL> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS from user_part_tables a,user_tab_partitions b where a.TABLE_NAME=b.TABLE_NAME and a.table_name='TEST_RANGE_PARTITION';

TABLE_NAME                     PARTITION PARTITION_NAME       HIGH_VALUE    NUM_ROWS
------------------------------ --------- -------------------- ----------- ----------
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_01    1000
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_02    2000
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_03    3000
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_MAX   MAXVALUE

--收集分區(qū)表TEST_RANGE_PARTITION的統(tǒng)計(jì)信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.

--可以看到,此時(shí)各分區(qū)的數(shù)據(jù)情況已經(jīng)顯示出來
SQL> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS from user_part_tables a,user_tab_partitions b where a.TABLE_NAME=b.TABLE_NAME and a.table_name='TEST_RANGE_PARTITION';

TABLE_NAME                     PARTITION PARTITION_NAME       HIGH_VALUE    NUM_ROWS
------------------------------ --------- -------------------- ----------- ----------
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_01    1000                 2
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_02    2000                 6
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_03    3000                 3
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_MAX   MAXVALUE             3

通過上面的操作,已經(jīng)成功創(chuàng)建了一張RANGE型的分區(qū)表。

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


2、增加分區(qū)維護(hù)操作(add)
增加分區(qū)維護(hù)操作,顧名思義,主要針對當(dāng)前分區(qū)表進(jìn)行添加新分區(qū)的操作。

當(dāng)分區(qū)表存在默認(rèn)條件分區(qū),如:RANGE分區(qū)表的MAXVALUE分區(qū)、LIST分區(qū)表的DEFAULT分區(qū),此時(shí)增加分區(qū)操作會(huì)報(bào)錯(cuò)。

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

SQL> 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

可以看到,針對存在默認(rèn)條件的分區(qū)表,無法執(zhí)行增加分區(qū)操作。

解決辦法:
1、刪除原默認(rèn)條件分區(qū),待增加分區(qū)后,再重新添加默認(rèn)條件分區(qū)。
2、使用拆分分區(qū)(split)的方式,后面介紹。

這里,我們嘗試下解決辦法1的方法進(jìn)行操作。
--刪除存在默認(rèn)條件MAXVALUE的分區(qū)
SQL> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_MAX;

Table altered.

--重新收集分區(qū)表的統(tǒng)計(jì)信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;
Table analyzed.

--觀察分區(qū)表的信息,可以看到此時(shí)默認(rèn)條件MAXVALUE的分區(qū)已經(jīng)不存在
SQL> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS from user_part_tables a,user_tab_partitions b where a.TABLE_NAME=b.TABLE_NAME and a.table_name='TEST_RANGE_PARTITION';

TABLE_NAME                     PARTITION PARTITION_NAME       HIGH_VALUE    NUM_ROWS
------------------------------ --------- -------------------- ----------- ----------
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_01    1000                 2
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_02    2000                 6
TEST_RANGE_PARTITION           RANGE     TEST_RANGE_SAL_03    3000                 3

--增加新分區(qū)TEST_RANGE_SAL_04
SQL> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_04 values less than(4000);
Table altered.

--重新增加默認(rèn)條件MAXVALUE分區(qū)
SQL> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_MAX values less than(maxvalue);
Table altered.


通過上面的方法,已經(jīng)完成了增加分區(qū)的操作。下面進(jìn)一步驗(yàn)證增加分區(qū)的操作。

--重新收集測試分區(qū)表的統(tǒng)計(jì)信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;
Table analyzed.

--查看分區(qū)表信息,可以看到上面增加的新分區(qū)
SQL> select a.TABLE_NAME,PARTITIONING_TYPE,PARTITION_NAME,HIGH_VALUE,NUM_ROWS from user_part_tables a,user_tab_partitions b where a.TABLE_NAME=b.TABLE_NAME and a.table_name='TEST_RANGE_PARTITION';

TABLE_NAME            PARTITION PARTITION_NAME     HIGH_VALUE   NUM_ROWS
--------------------- --------- ------------------ ----------- ---------
TEST_RANGE_PARTITION  RANGE     TEST_RANGE_SAL_01  1000                2
TEST_RANGE_PARTITION  RANGE     TEST_RANGE_SAL_02  2000                6
TEST_RANGE_PARTITION  RANGE     TEST_RANGE_SAL_03  3000                3
TEST_RANGE_PARTITION  RANGE     TEST_RANGE_SAL_MAX MAXVALUE            0
TEST_RANGE_PARTITION  RANGE     TEST_RANGE_SAL_04  4000                0

需要注意的是:對于默認(rèn)條件的分區(qū)進(jìn)行刪除,其數(shù)據(jù)不會(huì)重分布到其他分區(qū),而是刪除數(shù)據(jù)。因此在生產(chǎn)環(huán)境使用需慎重。
至此,增加分區(qū)維護(hù)操作的介紹結(jié)束。
 
3、移動(dòng)分區(qū)維護(hù)操作(move)
移動(dòng)分區(qū)維護(hù)操作,主要是將分區(qū)從一個(gè)表空間遷移至另一個(gè)表空間中。

--查看當(dāng)前分區(qū)對應(yīng)的表空間情況
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME       TABLESPACE_NAME
------------------------------ -------------------- ------------------------------
TEST_RANGE_PARTITION           TEST_RANGE_SAL_02    USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03    USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01    USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX   USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04    USERS

--執(zhí)行移動(dòng)分區(qū)操作
SQL> alter table TEST_RANGE_PARTITION move partition TEST_RANGE_SAL_01 tablespace PARTITION_TS;
Table altered.

--驗(yàn)證移動(dòng)后,分區(qū)所在的表空間
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME from user_tab_partitions;

TABLE_NAME                     PARTITION_NAME       TABLESPACE_NAME
------------------------------ -------------------- ------------------------------
TEST_RANGE_PARTITION           TEST_RANGE_SAL_02    USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03    USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01    PARTITION_TS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX   USERS
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04    USERS


需要注意的是:
對于組合分區(qū),無法直接移動(dòng)分區(qū),否則會(huì)拋出ORA-14257錯(cuò)誤,示例如下:

--準(zhǔn)備一張list-list的組合分區(qū)表
SQL> CREATE TABLE "EMPLOYEE_LIST_LIST_PART"
      ( "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0)
     )
     PARTITION BY LIST (DEPTNO)
     SUBPARTITION BY LIST (JOB)
     (
     PARTITION EMPLOYEE_DEPTNO_10 VALUES (10)
       ( SUBPARTITION EMPLOYEE_10_JOB_MAGAGER VALUES ('MANAGER'),
         SUBPARTITION EMPLOYEE_10_JOB_DEFAULT VALUES (DEFAULT)
       ),
     PARTITION EMPLOYEE_DEPTNO_20 VALUES (20)
       ( SUBPARTITION EMPLOYEE_20_JOB_MAGAGER VALUES ('MANAGER'),
         SUBPARTITION EMPLOYEE_20_JOB_DEFAULT VALUES (DEFAULT)
       ),
     PARTITION EMPLOYEE_DEPTNO_OTHERS VALUES (DEFAULT)
       ( SUBPARTITION EMPLOYEE_30_JOB_MAGAGER VALUES ('MANAGER'),
         SUBPARTITION EMPLOYEE_30_JOB_DEFAULT VALUES (DEFAULT)
       )
     );

Table created.

--查看當(dāng)前該組合分區(qū)所在表空間的信息
SQL> 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  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10     EMPLOYEE_10_JOB_DEFAULT  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20     EMPLOYEE_20_JOB_MAGAGER  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20     EMPLOYEE_20_JOB_DEFAULT  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_MAGAGER  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_DEFAULT  USERS


--移動(dòng)組合分區(qū)表的區(qū)分
SQL> 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

通過上面的演示,可以清楚的看到,對于組合分區(qū),無法直接移動(dòng)分區(qū)至新的表空間。

 
解決辦法:
移動(dòng)分區(qū)表的子分區(qū),然后修改當(dāng)前所在分區(qū)的屬性即可。具體演示如下:

--移動(dòng)子分區(qū)
SQL> alter table EMPLOYEE_LIST_LIST_PART  move subpartition EMPLOYEE_20_JOB_MAGAGER tablespace PARTITION_TS;
Table altered.

SQL> alter table EMPLOYEE_LIST_LIST_PART  move subpartition EMPLOYEE_20_JOB_DEFAULT tablespace PARTITION_TS;
Table altered.

--修改分區(qū)的默認(rèn)屬性
SQL> ALTER TABLE EMPLOYEE_LIST_LIST_PART MODIFY DEFAULT ATTRIBUTES FOR PARTITION EMPLOYEE_DEPTNO_20 tablespace PARTITION_TS;

Table altered.

--驗(yàn)證移動(dòng)分區(qū)后的結(jié)果
SQL> 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  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_10     EMPLOYEE_10_JOB_DEFAULT  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20     EMPLOYEE_20_JOB_MAGAGER  PARTITION_TS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_20     EMPLOYEE_20_JOB_DEFAULT  PARTITION_TS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_MAGAGER  USERS
EMPLOYEE_LIST_LIST_PART EMPLOYEE_DEPTNO_OTHERS EMPLOYEE_30_JOB_DEFAULT  USERS

可以看到,通過移動(dòng)子分區(qū)的方法,完成了對于組合分區(qū)的移動(dòng)操作。

 
4、截?cái)喾謪^(qū)維護(hù)操作(truncate)
截?cái)喾謪^(qū)維護(hù)操作,相對于傳統(tǒng)的delete操作,刪除數(shù)據(jù)的效率會(huì)更高。而且會(huì)降低高水位線。

演示如下:

--查看當(dāng)前測試表分區(qū)情況及分區(qū)中的記錄數(shù)
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions 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                    6
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3


--執(zhí)行截?cái)喾謪^(qū)操作
SQL> alter table TEST_RANGE_PARTITION truncate partition TEST_RANGE_SAL_02;
Table truncated.

--重新收集最新的測試表的統(tǒng)計(jì)信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.


--驗(yàn)證截?cái)嗖僮骱螅謪^(qū)的記錄數(shù)變化
SQL> select TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,num_rows from user_tab_partitions 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3


從上面的演示中可以看到,通過truncate操作,測試表的TEST_RANGE_SAL_02分區(qū)數(shù)據(jù)被清空。至此,演示完畢。

 
5、刪除分區(qū)維護(hù)操作(drop)
對于分區(qū)的刪除操作,需要注意,在刪除分區(qū)后,分區(qū)所記錄的數(shù)據(jù),不會(huì)重分布至其他分區(qū)中,而是被一并刪除。

--檢查當(dāng)前分區(qū)表的分區(qū)情況,以及數(shù)據(jù)的分布情況
SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01         PARTITION_TS             2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    0


--執(zhí)行分區(qū)的刪除操作
SQL> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_04;

Table altered.

--再次檢查分區(qū)表的分區(qū)情況,以及數(shù)據(jù)的分布情況
SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01         PARTITION_TS             2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0

可以看到,分區(qū)的刪除操作不會(huì)影響數(shù)據(jù)的分布情況。


6、拆分分區(qū)維護(hù)操作(split)
在“增加分區(qū)維護(hù)操作”部分,提到了對于存在默認(rèn)條件的分區(qū)表增加分區(qū)的的兩種辦法,這里將介紹通過拆分分區(qū)的辦法來增加分區(qū)。

需要注意:在目標(biāo)分區(qū)拆分后,被拆分的分區(qū)會(huì)按照拆分規(guī)則,將數(shù)據(jù)進(jìn)行重分布。

演示實(shí)例:
首先,將測試表的數(shù)據(jù)分布還原至初建時(shí)的數(shù)據(jù)分布態(tài)。

--清空測試分區(qū)表中的所有數(shù)據(jù)
SQL> truncate table TEST_RANGE_PARTITION;

Table truncated.

--重新加載測試分區(qū)表的數(shù)據(jù)
SQL> insert into TEST_RANGE_PARTITION select * from emp;

14 rows created.

SQL> commit;

Commit complete.

--重新收集測試表的統(tǒng)計(jì)信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.

--查看此時(shí),數(shù)據(jù)在分區(qū)間的分布情況
SQL> 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                    6
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01         PARTITION_TS             2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    3

查看此時(shí),存在默認(rèn)條件MAXVALUE的分區(qū)TEST_RANGE_SAL_MAX的具體數(shù)據(jù)信息:
SQL> 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
 

下面針對上面的分區(qū)TEST_RANGE_SAL_MAX進(jìn)行拆分處理,其中:
將SAL>=3000且SAL<4000的數(shù)據(jù)放入新的分區(qū)TEST_RANGE_SAL_04。
將SAL>=4000的數(shù)據(jù)保留在分區(qū)TEST_RANGE_SAL_MAX中。


--針對目標(biāo)分區(qū),執(zhí)行拆分分區(qū)維護(hù)操作
--依據(jù)上面的需求,將數(shù)據(jù)拆分至分區(qū)TEST_RANGE_SAL_04以及TEST_RANGE_SAL_MAX中
SQL> alter table TEST_RANGE_PARTITION split partition TEST_RANGE_SAL_MAX at (4000) into (partition TEST_RANGE_SAL_04,partition TEST_RANGE_SAL_MAX);

Table altered.


--查看此時(shí)測試分區(qū)表的分區(qū)情況,以及數(shù)據(jù)分布情況
SQL> 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                    6
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01         PARTITION_TS             2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    1
 

驗(yàn)證分區(qū)中實(shí)際的數(shù)據(jù)內(nèi)容:

SQL> 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                    20



SQL> 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

可以看到,經(jīng)過拆分,數(shù)據(jù)已按之前的需求,分別存儲在兩個(gè)分區(qū)中。


7、合并分區(qū)維護(hù)操作(merge)
合并分區(qū)操作,主要是將不同的分區(qū),通過分區(qū)的合并,進(jìn)行整合。

需要注意:
    對于list分區(qū),合并的分區(qū)無限制要求。
    對于range分區(qū),合并的分區(qū)必須相鄰,否則無法進(jìn)行合并操作。
    對于hash分區(qū),無法進(jìn)行合并分區(qū)操作。

此外,對于range分區(qū),下限值由邊界值較低的分區(qū)決定,上限值由邊界值較高的分區(qū)決定。

演示示例:
通過合并分區(qū)技術(shù),將測試表的分區(qū)TEST_RANGE_SAL_01以及分區(qū)TEST_RANGE_SAL_02進(jìn)行合并,具體如下:

--查看當(dāng)前分區(qū)表的分區(qū)情況
SQL> 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                    6
TEST_RANGE_PARTITION           TEST_RANGE_SAL_03         USERS                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_01         PARTITION_TS             2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    1

--查詢分區(qū)TEST_RANGE_SAL_01、TEST_RANGE_SAL_02值分布情況:
SQL> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_01);

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30

SQL> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_02);

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
      7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
      7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

6 rows selected.


--進(jìn)行合并分區(qū)操作
SQL> alter table TEST_RANGE_PARTITION merge partitions TEST_RANGE_SAL_01,TEST_RANGE_SAL_02 into partition TEST_RANGE_SAL_00;

Table altered.


--驗(yàn)證合并分區(qū)后的結(jié)果
SQL> 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                    3
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    2
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    1
TEST_RANGE_PARTITION           TEST_RANGE_SAL_00         USERS                    8

SQL> select * from TEST_RANGE_PARTITION partition(TEST_RANGE_SAL_00);

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
      7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
      7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
      7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

8 rows selected.


 
8、交換分區(qū)維護(hù)操作(exchange)
交換分區(qū)技術(shù),主要是將一個(gè)非分區(qū)表的數(shù)據(jù)同“一個(gè)分區(qū)表的一個(gè)分區(qū)”進(jìn)行數(shù)據(jù)交換。支持雙向交換,既可以從分區(qū)表的分區(qū)中遷移到非分區(qū)表,也可以從非分區(qū)表遷移至分區(qū)表的分區(qū)中。

原則上,非分區(qū)表的結(jié)構(gòu)、數(shù)據(jù)分布等,要符合分區(qū)表的目標(biāo)分區(qū)的定義規(guī)則。

演示如下:
首先,清空測試分區(qū)表的數(shù)據(jù)
SQL> truncate table TEST_RANGE_PARTITION;

Table truncated.

---查詢:
SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_00         USERS                    0
 

---創(chuàng)建一張基于emp表,sal<2000的測試非分區(qū)表emp_test。

SQL> create table emp_test as select * from emp where sal < 2000;

Table created.

SQL> select count(*) from emp_test;

  COUNT(*)
----------
         8

注意,此時(shí)非分區(qū)表的數(shù)據(jù)量為8條記錄。


---執(zhí)行交換分區(qū)操作,觀察分區(qū)表的記錄變化,以及非分區(qū)表的記錄變化
---執(zhí)行分區(qū)交換操作
SQL> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test;

Table altered.

SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.


SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_00         USERS                    8
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0

SQL> select count(*) from emp_test;

  COUNT(*)
----------
         0

可以看到,通過分區(qū)交換,非分區(qū)表的數(shù)據(jù)轉(zhuǎn)移至分區(qū)表中,同時(shí)非分區(qū)表的記錄被清除。
 

---再次執(zhí)行交換分區(qū)操作,觀察分區(qū)表的記錄變化,以及非分區(qū)表的記錄變化
SQL> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test;

Table altered.

SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.


SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_00         USERS                    0

SQL> select count(*) from emp_test;

  COUNT(*)
----------
         8

可以看到,此時(shí)分區(qū)表的數(shù)據(jù)又再次轉(zhuǎn)移回至非分區(qū)表,證明了前面所述,分區(qū)交換技術(shù),既可以從分區(qū)表的分區(qū)中遷移到非分區(qū)表,也可以從非分區(qū)表遷移至分區(qū)表的分區(qū)中。

注意:若非分區(qū)表的數(shù)據(jù),不符合分區(qū)表的分區(qū)規(guī)則,此時(shí)交換會(huì)拋出ORA-14099錯(cuò)誤。

--清空上面測試非分區(qū)表的數(shù)據(jù)
SQL> truncate table emp_test;

Table truncated.

--加載emp的所有數(shù)據(jù)至該測試非分區(qū)表
--之所以使用測試非分區(qū)表,是考慮emp表以后做其他實(shí)驗(yàn)時(shí)可能還需要其中的數(shù)據(jù)
--通過這樣操作,測試非分區(qū)表的數(shù)據(jù),既存在sal<2000的數(shù)據(jù),也存在sal>2000的數(shù)據(jù)
SQL> insert into emp_test select * from emp;

14 rows created.

SQL> commit;

Commit complete.

--嘗試交換分區(qū),觀察結(jié)果
SQL> 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

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


解決辦法:
通過without validation子句,可以避免數(shù)據(jù)校驗(yàn),而交換成功。但會(huì)存在與分區(qū)規(guī)則相悖的數(shù)據(jù),因此該方法要慎重。

SQL> alter table TEST_RANGE_PARTITION exchange PARTITION TEST_RANGE_SAL_00 with table emp_test without validation;

Table altered.

SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.


SQL> 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                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_00         USERS                   14
TEST_RANGE_PARTITION           TEST_RANGE_SAL_04         USERS                    0
TEST_RANGE_PARTITION           TEST_RANGE_SAL_MAX        USERS                    0

技術(shù)方案擴(kuò)展思路:
若打算采用交換分區(qū)的方法,以實(shí)現(xiàn)非分區(qū)表到分區(qū)表的轉(zhuǎn)換,可以采用先創(chuàng)建一個(gè)只有默認(rèn)條件的單一分區(qū)的分區(qū)表,在分區(qū)交換數(shù)據(jù)后,根據(jù)實(shí)際需要,通過前面提到的“拆分分區(qū)”的方法進(jìn)行分區(qū)操作。即大表改分區(qū)表(交換分區(qū)+分區(qū)分裂)

 
9、收縮分區(qū)維護(hù)操作(coalesce)
收縮分區(qū)維護(hù)操作,僅僅可以在hash分區(qū)以及組合分區(qū)的hash子分區(qū)上進(jìn)行使用。
通過使用收縮分區(qū)技術(shù),可以收縮當(dāng)前hash分區(qū)的分區(qū)數(shù)量。
對于hash分區(qū)的數(shù)據(jù),在收縮過程中,oracle會(huì)自動(dòng)完成數(shù)據(jù)在分區(qū)間的重分布。

演示如下:
首先基于emp表的數(shù)據(jù),創(chuàng)建一張hash分區(qū)表

SQL> CREATE TABLE "EMPLOYEE_HASH_PART"
      ( "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0)
      )
      PARTITION BY HASH (ENAME)
      (
      PARTITION EMPLOYEE_PART01,
      PARTITION EMPLOYEE_PART02
     );  

Table created.

SQL> insert into EMPLOYEE_HASH_PART select * from emp;

14 rows created.

SQL> commit;

Commit complete.

SQL> analyze table EMPLOYEE_HASH_PART compute statistics;

Table analyzed.


SQL> 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                    6
EMPLOYEE_HASH_PART             EMPLOYEE_PART01           USERS                    8

執(zhí)行收縮分區(qū)操作
SQL> alter table EMPLOYEE_HASH_PART coalesce partition;

Table altered.

SQL> analyze table EMPLOYEE_HASH_PART compute statistics;

Table analyzed.


SQL> 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

可以看到,通過收縮分區(qū),原本兩個(gè)分區(qū)整合到一個(gè),而且數(shù)據(jù)也同時(shí)被整合。

需要注意:
當(dāng)hash分區(qū)中只有一個(gè)分區(qū)時(shí),此時(shí)無法進(jìn)行收縮操作。

SQL> 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

SQL> 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

感謝各位的閱讀,以上就是“ORACLE分區(qū)表日常維護(hù)方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對ORACLE分區(qū)表日常維護(hù)方法是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI