iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >ORACLE分区表日常维护方法是什么
  • 411
分享到

ORACLE分区表日常维护方法是什么

2024-04-02 19:04:59 411人浏览 八月长安
摘要

这篇文章主要讲解了“oracle分区表日常维护方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ORACLE分区表日常维护方法是什么”吧!1、测试表准

这篇文章主要讲解了“oracle分区表日常维护方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ORACLE分区表日常维护方法是什么”吧!

1、测试表准备
为了便于具体的操作演示,首先准备一张RANGE型的测试分区表TEST_RANGE_PARTITION。
这里的测试数据来源于oracle测试用户scott下的emp表。

--创建分区表TEST_RANGE_PARTITION
--这里通过dbms_metadata.get_ddl获得emp表的建表结构进而修改
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.

通过下面的方法,了解关于上面创建分区表的数据分布基本情况。
复制代码

--查询分表各分区的条件以及数据库分布情况
--可以看到此时NUM_ROWS列为空,主要是因为表的的统计信息未收集导致。
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

--收集分区表TEST_RANGE_PARTITION的统计信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.

--可以看到,此时各分区的数据情况已经显示出来
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

通过上面的操作,已经成功创建了一张RANGE型的分区表。

下面将依托这张表,介绍分区表的日常维护操作。


2、增加分区维护操作(add)
增加分区维护操作,顾名思义,主要针对当前分区表进行添加新分区的操作。

当分区表存在默认条件分区,如:RANGE分区表的MAXVALUE分区、LIST分区表的DEFAULT分区,此时增加分区操作会报错。

下面尝试通过增加分区操作,直接为测试表增加分区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

可以看到,针对存在默认条件的分区表,无法执行增加分区操作。

解决办法:
1、删除原默认条件分区,待增加分区后,再重新添加默认条件分区。
2、使用拆分分区(split)的方式,后面介绍。

这里,我们尝试下解决办法1的方法进行操作。
--删除存在默认条件MAXVALUE的分区
SQL> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_MAX;

Table altered.

--重新收集分区表的统计信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;
Table analyzed.

--观察分区表的信息,可以看到此时默认条件MAXVALUE的分区已经不存在
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_SAL_04
SQL> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_04 values less than(4000);
Table altered.

--重新增加默认条件MAXVALUE分区
SQL> alter table TEST_RANGE_PARTITION add partition TEST_RANGE_SAL_MAX values less than(maxvalue);
Table altered.


通过上面的方法,已经完成了增加分区的操作。下面进一步验证增加分区的操作。

--重新收集测试分区表的统计信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;
Table analyzed.

--查看分区表信息,可以看到上面增加的新分区
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

需要注意的是:对于默认条件的分区进行删除,其数据不会重分布到其他分区,而是删除数据。因此在生产环境使用需慎重。
至此,增加分区维护操作的介绍结束。
 
3、移动分区维护操作(move)
移动分区维护操作,主要是将分区从一个表空间迁移至另一个表空间中。

--查看当前分区对应的表空间情况
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

--执行移动分区操作
SQL> alter table TEST_RANGE_PARTITION move partition TEST_RANGE_SAL_01 tablespace PARTITION_TS;
Table altered.

--验证移动后,分区所在的表空间
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


需要注意的是:
对于组合分区,无法直接移动分区,否则会抛出ORA-14257错误,示例如下:

--准备一张list-list的组合分区表
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.

--查看当前该组合分区所在表空间的信息
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


--移动组合分区表的区分
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

通过上面的演示,可以清楚的看到,对于组合分区,无法直接移动分区至新的表空间。

 
解决办法:
移动分区表的子分区,然后修改当前所在分区的属性即可。具体演示如下:

--移动子分区
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.

--修改分区的默认属性
SQL> ALTER TABLE EMPLOYEE_LIST_LIST_PART MODIFY DEFAULT ATTRIBUTES FOR PARTITION EMPLOYEE_DEPTNO_20 tablespace PARTITION_TS;

Table altered.

--验证移动分区后的结果
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

可以看到,通过移动子分区的方法,完成了对于组合分区的移动操作。

 
4、截断分区维护操作(truncate)
截断分区维护操作,相对于传统的delete操作,删除数据的效率会更高。而且会降低高水位线。

演示如下:

--查看当前测试表分区情况及分区中的记录数
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


--执行截断分区操作
SQL> alter table TEST_RANGE_PARTITION truncate partition TEST_RANGE_SAL_02;
Table truncated.

--重新收集最新的测试表的统计信息
SQL> analyze table TEST_RANGE_PARTITION compute statistics;

Table analyzed.


--验证截断操作后,分区的记录数变化
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分区数据被清空。至此,演示完毕。

 
5、删除分区维护操作(drop)
对于分区的删除操作,需要注意,在删除分区后,分区所记录的数据,不会重分布至其他分区中,而是被一并删除。

--检查当前分区表的分区情况,以及数据的分布情况
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


--执行分区的删除操作
SQL> alter table TEST_RANGE_PARTITION drop partition TEST_RANGE_SAL_04;

Table altered.

--再次检查分区表的分区情况,以及数据的分布情况
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

可以看到,分区的删除操作不会影响数据的分布情况。


6、拆分分区维护操作(split)
在“增加分区维护操作”部分,提到了对于存在默认条件的分区表增加分区的的两种办法,这里将介绍通过拆分分区的办法来增加分区。

需要注意:在目标分区拆分后,被拆分的分区会按照拆分规则,将数据进行重分布。

演示实例:
首先,将测试表的数据分布还原至初建时的数据分布态。

--清空测试分区表中的所有数据
SQL> truncate table TEST_RANGE_PARTITION;

Table truncated.

--重新加载测试分区表的数据
SQL> insert into TEST_RANGE_PARTITION select * from emp;

14 rows created.

SQL> commit;

Commit complete.

--重新收集测试表的统计信息
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_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

查看此时,存在默认条件MAXVALUE的分区TEST_RANGE_SAL_MAX的具体数据信息:
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
 

下面针对上面的分区TEST_RANGE_SAL_MAX进行拆分处理,其中:
将SAL>=3000且SAL<4000的数据放入新的分区TEST_RANGE_SAL_04。
将SAL>=4000的数据保留在分区TEST_RANGE_SAL_MAX中。


--针对目标分区,执行拆分分区维护操作
--依据上面的需求,将数据拆分至分区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.


--查看此时测试分区表的分区情况,以及数据分布情况
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
 

验证分区中实际的数据内容:

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

可以看到,经过拆分,数据已按之前的需求,分别存储在两个分区中。


7、合并分区维护操作(merge)
合并分区操作,主要是将不同的分区,通过分区的合并,进行整合。

需要注意:
    对于list分区,合并的分区无限制要求。
    对于range分区,合并的分区必须相邻,否则无法进行合并操作。
    对于hash分区,无法进行合并分区操作。

此外,对于range分区,下限值由边界值较低的分区决定,上限值由边界值较高的分区决定。

演示示例:
通过合并分区技术,将测试表的分区TEST_RANGE_SAL_01以及分区TEST_RANGE_SAL_02进行合并,具体如下:

--查看当前分区表的分区情况
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

--查询分区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.


--进行合并分区操作
SQL> alter table TEST_RANGE_PARTITION merge partitions TEST_RANGE_SAL_01,TEST_RANGE_SAL_02 into partition TEST_RANGE_SAL_00;

Table altered.


--验证合并分区后的结果
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、交换分区维护操作(exchange)
交换分区技术,主要是将一个非分区表的数据同“一个分区表的一个分区”进行数据交换。支持双向交换,既可以从分区表的分区中迁移到非分区表,也可以从非分区表迁移至分区表的分区中。

原则上,非分区表的结构、数据分布等,要符合分区表的目标分区的定义规则。

演示如下:
首先,清空测试分区表的数据
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
 

---创建一张基于emp表,sal<2000的测试非分区表emp_test。

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

Table created.

SQL> select count(*) from emp_test;

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

注意,此时非分区表的数据量为8条记录。


---执行交换分区操作,观察分区表的记录变化,以及非分区表的记录变化
---执行分区交换操作
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

可以看到,通过分区交换,非分区表的数据转移至分区表中,同时非分区表的记录被清除。
 

---再次执行交换分区操作,观察分区表的记录变化,以及非分区表的记录变化
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

可以看到,此时分区表的数据又再次转移回至非分区表,证明了前面所述,分区交换技术,既可以从分区表的分区中迁移到非分区表,也可以从非分区表迁移至分区表的分区中。

注意:若非分区表的数据,不符合分区表的分区规则,此时交换会抛出ORA-14099错误。

--清空上面测试非分区表的数据
SQL> truncate table emp_test;

Table truncated.

--加载emp的所有数据至该测试非分区表
--之所以使用测试非分区表,是考虑emp表以后做其他实验时可能还需要其中的数据
--通过这样操作,测试非分区表的数据,既存在sal<2000的数据,也存在sal>2000的数据
SQL> insert into emp_test select * from emp;

14 rows created.

SQL> commit;

Commit complete.

--尝试交换分区,观察结果
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分区的限制条件为sal<2000,而测试非分区表的数据包含了sal>2000的数据,因此交换失败。


解决办法:
通过without validation子句,可以避免数据校验,而交换成功。但会存在与分区规则相悖的数据,因此该方法要慎重。

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

技术方案扩展思路:
若打算采用交换分区的方法,以实现非分区表到分区表的转换,可以采用先创建一个只有默认条件的单一分区的分区表,在分区交换数据后,根据实际需要,通过前面提到的“拆分分区”的方法进行分区操作。即大表改分区表(交换分区+分区分裂)

 
9、收缩分区维护操作(coalesce)
收缩分区维护操作,仅仅可以在hash分区以及组合分区的hash子分区上进行使用。
通过使用收缩分区技术,可以收缩当前hash分区的分区数量。
对于hash分区的数据,在收缩过程中,oracle会自动完成数据在分区间的重分布。

演示如下:
首先基于emp表的数据,创建一张hash分区表

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

执行收缩分区操作
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

可以看到,通过收缩分区,原本两个分区整合到一个,而且数据也同时被整合。

需要注意:
当hash分区中只有一个分区时,此时无法进行收缩操作。

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分区表日常维护方法是什么”的内容了,经过本文的学习后,相信大家对ORACLE分区表日常维护方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: ORACLE分区表日常维护方法是什么

本文链接: https://www.lsjlt.com/news/70214.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ORACLE分区表日常维护方法是什么
    这篇文章主要讲解了“ORACLE分区表日常维护方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ORACLE分区表日常维护方法是什么”吧!1、测试表准...
    99+
    2024-04-02
  • Oracle数据库日常维护是怎么样的
    这篇文章给大家介绍Oracle数据库日常维护是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Oracle数据库运行期间,DBA应该对数据库的运行日志及表空间的使用情况进行监控...
    99+
    2024-04-02
  • oracle重建表分区的方法是什么
    Oracle重建表分区的方法有以下几种: 使用ALTER TABLE语句:可以使用ALTER TABLE语句对表进行重建分区。具...
    99+
    2024-04-09
    oracle
  • oracle表分区查看的方法是什么
    要查看Oracle表的分区信息,可以使用以下方法之一: 使用SQL查询分区信息: SELECT table_name, ...
    99+
    2024-03-11
    oracle
  • DG日常维护是怎么样的
    本篇文章给大家分享的是有关DG日常维护是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。DG日常维护第一部分 日常维护 一 正确打...
    99+
    2024-04-02
  • 代理IP日常是怎么维护的
    本篇内容介绍了“代理IP日常是怎么维护的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、代理IP获取接口。爬虫免费代理IP可以使用Prox...
    99+
    2023-06-20
  • oracle中什么是分区表
    在Oracle数据库中,分区表是指将表中的数据按照一定的规则分成多个分区存储的表。每个分区可以独立管理和维护,可以根据需要进行单独的...
    99+
    2023-08-30
    oracle
  • 数据库日常维护常用的脚本语句是什么
    小编给大家分享一下数据库日常维护常用的脚本语句是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  1、数据库备份操作:  d...
    99+
    2024-04-02
  • web数据安全的维护日常工作是什么
    web数据安全的维护日常工作是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。web数据安全的维护日常是什么现在所有的企业和个人都是在使用web登录进行日常工作的操作,web...
    99+
    2023-06-07
  • ORACLE删除表分区和数据的方法是什么
    这篇文章主要讲解了“ORACLE删除表分区和数据的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ORACLE删除表分区和数据的方法是什么”吧!1....
    99+
    2024-04-02
  • Oracle 12c新特性维护表分区Global Index不失效
    1.新特性官方文档说明 ...
    99+
    2024-04-02
  • Lepus慢日志平台搭建与维护的方法是什么
    本篇内容介绍了“Lepus慢日志平台搭建与维护的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一...
    99+
    2024-04-02
  • Oracle中的分区表是什么
    在Oracle数据库中,分区表是指根据指定的规则将表数据分割存储在不同的分区中的表。通过对表进行分区,可以提高查询性能、管理数据、维...
    99+
    2024-04-09
    Oracle
  • oracle分区管理的方法是什么
    Oracle分区管理的方法有以下几种: 范围分区:按照某个列的范围进行分区,例如按照日期范围分区。 列分区:按照某个列的值进行分区...
    99+
    2024-04-09
    oracle
  • oracle分区表的作用是什么
    oracle分区表的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  1.表空间及分区表的概念  表空间:是一个或多个数据文件的集合...
    99+
    2024-04-02
  • oracle表分区的定义是什么
    Oracle表分区是将表数据按一定的规则分割存储在不同的分区中,以提高查询性能和管理数据的效率。通过表分区,可以将表数据存储在不同的...
    99+
    2024-04-09
    oracle
  • mybatis创建表分区的方法是什么
    在MyBatis中创建表分区可以通过在SQL语句中使用分区关键字来实现。具体方法如下: 在创建表时指定分区关键字,例如: CRE...
    99+
    2024-04-02
  • pgsql删除表分区的方法是什么
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 云服务器维护的方法是什么
    云服务器维护的方法可以包括以下几点:1. 系统更新和补丁管理:定期检查和应用操作系统、软件和安全补丁,以确保服务器的稳定性和安全性。2. 数据备份和恢复:定期备份服务器中的重要数据,并测试数据恢复过程,以便在出现故障或数据丢失时能够快速...
    99+
    2023-08-09
    云服务器
  • redis搭建及维护的方法是什么
    要搭建和维护Redis,可以按照以下步骤进行:1. 下载和安装Redis:可以从Redis官方网站上下载适合自己操作系统的Redis...
    99+
    2023-08-30
    redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作