如何在Oracle中使用exchange分区进行分区和子分区?

如何在Oracle中使用exchange分区进行分区和子分区?,oracle,Oracle,我在Oracle中面临exchange分区和子分区的问题。 请举例说明。请查找以下示例 CREATE TABLE DEPARTMENT ( DEPT_ID NUMBER(30,0) NOT NULL ENABLE, IS_ACTIVE VARCHAR2(1 BYTE) NOT NULL , BUSINESS_DATE DATE NOT NULL ENABLE, COMPANY_CODE VARCHA

我在Oracle中面临exchange分区和子分区的问题。
请举例说明。

请查找以下示例

CREATE TABLE DEPARTMENT 
   (    DEPT_ID NUMBER(30,0) NOT NULL ENABLE, 
        IS_ACTIVE VARCHAR2(1 BYTE) NOT NULL , 
        BUSINESS_DATE DATE NOT NULL ENABLE,
        COMPANY_CODE                 VARCHAR2(4) DEFAULT 'C1' NOT NULL ,        
        CONSTRAINT PK_DEPARTMENT PRIMARY KEY (BUSINESS_DATE, COMPANY_CODE, DEPT_ID) ENABLE
   )
   PARTITION BY RANGE 
  (
    BUSINESS_DATE
  ) 
  INTERVAL (
    NUMTODSINTERVAL(1,'DAY')
  )
    SUBPARTITION BY LIST(COMPANY_CODE) 
  SUBPARTITION TEMPLATE 
  ( 
  SUBPARTITION CMN_01 VALUES ('C1'), 
  SUBPARTITION CMN_02 VALUES ('C2'), 
  SUBPARTITION CMN_03 VALUES ('C3') 
  )
  (
    PARTITION DEFAULT_PART VALUES LESS THAN ('01-JAN-2012') 
  )
   ;

CREATE INDEX IDX1_DEPARTMENT ON DEPARTMENT (DEPT_ID, IS_ACTIVE);

CREATE TABLE TEMP_DEPARTMENT AS SELECT * FROM DEPARTMENT WHERE 1=2;

CREATE TABLE EMPLOYEE 
   (    ID NUMBER(30,0) NOT NULL ENABLE, 
        DEPT_ID NUMBER(30,0) NOT NULL ENABLE,
        BUSINESS_DATE DATE NOT NULL ENABLE,
        COMPANY_CODE                 VARCHAR2(4) DEFAULT 'C1' NOT NULL,
        CONSTRAINT PK_EMPLOYEE PRIMARY KEY (BUSINESS_DATE,COMPANY_CODE, ID) ENABLE,
        CONSTRAINT FK1_EMPLOYEE_DEPT FOREIGN KEY (BUSINESS_DATE, COMPANY_CODE, DEPT_ID)
        REFERENCES DEPARTMENT (BUSINESS_DATE, COMPANY_CODE, DEPT_ID)  ENABLE NOVALIDATE
   )
   PARTITION BY RANGE 
  (
    BUSINESS_DATE
  ) 
  INTERVAL (
    NUMTODSINTERVAL(1,'DAY')
  )
  SUBPARTITION BY LIST(COMPANY_CODE) 
  SUBPARTITION TEMPLATE 
  ( 
  SUBPARTITION CMN_01 VALUES ('C1'), 
  SUBPARTITION CMN_02 VALUES ('C2'), 
  SUBPARTITION CMN_03 VALUES ('C3') 
  )
  (
    PARTITION DEFAULT_PART VALUES LESS THAN ('01-JAN-2012') 
  );
为几个分区及其所有子分区向DEPARTMENT和EMPLOYEE表中插入数千条记录

交换和截断子分区

1) 交换子分区
更改表DEPARTMENT交换子分区SYS\u SUBP7356,表TEMP\u DEPARTMENT未经验证更新全局索引

2) 截断温度交换表<代码>截断表温度部门

3) 使用全局索引更新“ALTER table DEPARTMENT Truncate SUBSPARTITION SYS\U SUBSB7356 DROP STORAGE update global index”截断子分区(所有选项卡子分区表中的子分区名称)

这里对三个子分区执行上述1到3个步骤

4) 使用全局索引更新从所有分区表中获取此分区名称
ALTER table DEPARTMENT DROP partition SYS\u P7359 update global index

5) 使用全局索引更新
ALTER table EMPLOYEE Truncate SUBPARTITION SYS\u SUBP7360 DROP STORAGE update global index截断子分区(所有_TAB_SUBPARTITIONS表中的子分区名称)

这里对三个子分区执行上述5个步骤

6) 使用全局索引更新从所有分区表中获取此分区名称
ALTER table EMPLOYEE DROP partition SYS\u P7363 update global index

7)
alter index PK\u部门重建

8)
alterindex IDX1\u部门重建

9)
alter index PK_员工重建

只有在更改exchange表、截断和删除分区或子分区时未使用更新全局索引时,才需要执行步骤7到9

(十)

更新全局索引在更改表以进行交换、截断和删除分区或子分区时使用,如果全局索引应用于该表,那么我们可以在同一个表上并行执行DML操作。 更新全局索引用于使用alter操作同时重建索引

若不使用更新全局索引,则不允许对同一个表并行执行DML操作。它将抛出全局索引的ORA异常。 从表中删除/交换/截断分区/子分区后执行插入操作时出现错误消息:

SQL错误:ORA-01502:索引“TEST.PK_DEPARTMENT”或此类文件的分区 索引处于不可用状态 150200000-“索引“%s.%s”或该索引的分区处于不可用状态”

原因:试图访问被直接加载或DDL操作标记为不可用的索引或索引分区

操作:删除指定的索引,或重建指定的索引,或重建不可用的索引分区

如果不希望使用更新全局索引,并且希望并行DML操作进行清除,则将索引设置为本地索引(不得包含主键或唯一约束,因为它是默认创建的全局唯一索引)。它位于分区和子分区上,并引用默认表空间。
对于本地索引,您观察到该表的插入速度很慢。

请查找以下示例

CREATE TABLE DEPARTMENT 
   (    DEPT_ID NUMBER(30,0) NOT NULL ENABLE, 
        IS_ACTIVE VARCHAR2(1 BYTE) NOT NULL , 
        BUSINESS_DATE DATE NOT NULL ENABLE,
        COMPANY_CODE                 VARCHAR2(4) DEFAULT 'C1' NOT NULL ,        
        CONSTRAINT PK_DEPARTMENT PRIMARY KEY (BUSINESS_DATE, COMPANY_CODE, DEPT_ID) ENABLE
   )
   PARTITION BY RANGE 
  (
    BUSINESS_DATE
  ) 
  INTERVAL (
    NUMTODSINTERVAL(1,'DAY')
  )
    SUBPARTITION BY LIST(COMPANY_CODE) 
  SUBPARTITION TEMPLATE 
  ( 
  SUBPARTITION CMN_01 VALUES ('C1'), 
  SUBPARTITION CMN_02 VALUES ('C2'), 
  SUBPARTITION CMN_03 VALUES ('C3') 
  )
  (
    PARTITION DEFAULT_PART VALUES LESS THAN ('01-JAN-2012') 
  )
   ;

CREATE INDEX IDX1_DEPARTMENT ON DEPARTMENT (DEPT_ID, IS_ACTIVE);

CREATE TABLE TEMP_DEPARTMENT AS SELECT * FROM DEPARTMENT WHERE 1=2;

CREATE TABLE EMPLOYEE 
   (    ID NUMBER(30,0) NOT NULL ENABLE, 
        DEPT_ID NUMBER(30,0) NOT NULL ENABLE,
        BUSINESS_DATE DATE NOT NULL ENABLE,
        COMPANY_CODE                 VARCHAR2(4) DEFAULT 'C1' NOT NULL,
        CONSTRAINT PK_EMPLOYEE PRIMARY KEY (BUSINESS_DATE,COMPANY_CODE, ID) ENABLE,
        CONSTRAINT FK1_EMPLOYEE_DEPT FOREIGN KEY (BUSINESS_DATE, COMPANY_CODE, DEPT_ID)
        REFERENCES DEPARTMENT (BUSINESS_DATE, COMPANY_CODE, DEPT_ID)  ENABLE NOVALIDATE
   )
   PARTITION BY RANGE 
  (
    BUSINESS_DATE
  ) 
  INTERVAL (
    NUMTODSINTERVAL(1,'DAY')
  )
  SUBPARTITION BY LIST(COMPANY_CODE) 
  SUBPARTITION TEMPLATE 
  ( 
  SUBPARTITION CMN_01 VALUES ('C1'), 
  SUBPARTITION CMN_02 VALUES ('C2'), 
  SUBPARTITION CMN_03 VALUES ('C3') 
  )
  (
    PARTITION DEFAULT_PART VALUES LESS THAN ('01-JAN-2012') 
  );
为几个分区及其所有子分区向DEPARTMENT和EMPLOYEE表中插入数千条记录

交换和截断子分区

1) 交换子分区
更改表DEPARTMENT交换子分区SYS\u SUBP7356,表TEMP\u DEPARTMENT未经验证更新全局索引

2) 截断温度交换表<代码>截断表温度部门

3) 使用全局索引更新“ALTER table DEPARTMENT Truncate SUBSPARTITION SYS\U SUBSB7356 DROP STORAGE update global index”截断子分区(所有选项卡子分区表中的子分区名称)

这里对三个子分区执行上述1到3个步骤

4) 使用全局索引更新从所有分区表中获取此分区名称
ALTER table DEPARTMENT DROP partition SYS\u P7359 update global index

5) 使用全局索引更新
ALTER table EMPLOYEE Truncate SUBPARTITION SYS\u SUBP7360 DROP STORAGE update global index截断子分区(所有_TAB_SUBPARTITIONS表中的子分区名称)

这里对三个子分区执行上述5个步骤

6) 使用全局索引更新从所有分区表中获取此分区名称
ALTER table EMPLOYEE DROP partition SYS\u P7363 update global index

7)
alter index PK\u部门重建

8)
alterindex IDX1\u部门重建

9)
alter index PK_员工重建

只有在更改exchange表、截断和删除分区或子分区时未使用更新全局索引时,才需要执行步骤7到9

(十)

更新全局索引在更改表以进行交换、截断和删除分区或子分区时使用,如果全局索引应用于该表,那么我们可以在同一个表上并行执行DML操作。 更新全局索引用于使用alter操作同时重建索引

若不使用更新全局索引,则不允许对同一个表并行执行DML操作。它将抛出全局索引的ORA异常。 从表中删除/交换/截断分区/子分区后执行插入操作时出现错误消息:

SQL错误:ORA-01502:索引“TEST.PK_DEPARTMENT”或此类文件的分区 索引处于不可用状态 150200000-“索引“%s.%s”或该索引的分区处于不可用状态”

原因:试图访问已标记的索引或索引分区
begin
    dbms_stats.gather_table_stats(ownname=>'TEST', tabname=>'DEPARTMENT', granularity=>'ALL' ,no_invalidate=>FALSE);
    dbms_stats.gather_table_stats(ownname=>'TEST', tabname=>'EMPLOYEE', granularity=>'ALL' ,no_invalidate=>FALSE);
end;