如何在Oracle中使用exchange分区进行分区和子分区?
我在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
请举例说明。请查找以下示例
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;