2016-04-13 78 views

回答

3

請找到下面的例子

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') 
); 

--insert幾個thousads記錄到部門和員工表的一些partiton及其所有子分區

select * from DEPARTMENT where BUSINESS_DATE='19-JAN-15' and COMPANY_CODE='C1'; 
select* from EMPLOYEE; 
select * from all_tab_partitions where TABLE_OWNER='TEST' and 
table_name='DEPARTMENT'; 
select * from ALL_TAB_SUBPARTITIONS where TABLE_OWNER='TEST' and 
table_name='DEPARTMENT'; 
select * from all_tab_partitions where TABLE_OWNER='TEST' and 
table_name='EMPLOYEE'; 
select * from ALL_TAB_SUBPARTITIONS where TABLE_OWNER='TEST' and 
table_name='EMPLOYEE'; 
select * from TEMP_DEPARTMENT; 

---交流和截斷子分區

1)

ALTER TABLE DEPARTMENT EXCHANGE SUBPARTITION SYS_SUBP7356 WITH TABLE TEMP_DEPARTMENT WITHOUT VALIDATION UPDATE GLOBAL INDEXES; --Exchange sub partitioning 

2)

truncate table TEMP_DEPARTMENT; --truncate temp exchange table 

3)

ALTER TABLE DEPARTMENT TRUNCATE SUBPARTITION SYS_SUBP7356 DROP STORAGE UPDATE GLOBAL INDEXES; --truncate sub partitioning (sub partition name from ALL_TAB_SUBPARTITIONS table) with global index update 
--Here above 1 to 3 steps execute for three sub partitioning 

4) ALTER TABLE DEPARTMENT DROP PARTITION SYS_P7359 UPDATE GLOBAL INDEXES; --get從與全局索引更新

5) ALTER TABLE EMPLOYEE TRUNCATE SUBPARTITION SYS_SUBP7360 DROP STORAGE UPDATE GLOBAL INDEXES; all_tab_partitions表此分區名; --truncate子分區(從ALL_TAB_SUBPARTITIONS表子分區的名稱)與全局索引更新 --Here上述5個步驟從all_tab_partitions表全局索引更新 7執行用於三個子分區 6) ALTER TABLE EMPLOYEE DROP PARTITION SYS_P7363 UPDATE GLOBAL INDEXES; --get此分區名)--alter index PK_DEPARTMENT重建; 8) --alter index IDX1_DEPARTMENT重建; 9) --alter index PK_EMPLOYEE重建; --step 7〜9只需要當在塗改表的用於交換的時間不使用UPDATE全局索引,截斷和丟棄的分區或子分區 10) 開始

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; 

UPDATE全局索引在使用更改表的時間交換,截斷和丟棄分區或子分區,其中全局索引應用於該表上,那麼我們可以在同一個表上並行執行DML操作。 UPDATE GLOBAL INDEXES用於在alter操作的同時重建索引。 如果不使用UPDATE GLOBAL INDEXES,則不允許在同一個表上並行執行DML操作。它會拋出全局索引的ORA異常。 錯誤當從表中刪除/交換/截斷分區/子分區後執行插入操作時的消息: SQL錯誤:ORA-01502:索引'TEST.PK_DEPARTMENT'或此索引的分區處於不可用狀態 01502. 00000 - 「index 「%s的。%s'或此索引的分區處於不可用狀態「 *原因:嘗試訪問已被標記爲不可用直接加載或DDL的索引或索引分區 操作 *操作:DROP指定索引,或重建指定索引,或者 重建不可用索引分區

如果你不想使用UPDATE全局索引,並希望與清洗,然後製作索引本地並行DML操作(不能包含主鍵或唯一的約束,因爲它是默認創建的全局唯一索引)它在分區和子分區上並引用默認表空間 使用本地索引,您在該表上觀察到插入緩慢