2016-04-13 2 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 записей в DEPARTMENT и EMPLOYEE таблиц для нескольких 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 это имя раздела из таблицы all_tab_partitions с глобальным индексом обновления

5) ALTER TABLE EMPLOYEE TRUNCATE SUBPARTITION SYS_SUBP7360 DROP STORAGE UPDATE GLOBAL INDEXES;; --truncate суб перегородка (суб название раздела из таблицы ALL_TAB_SUBPARTITIONS) с обновлением глобального индекса --Here выше 5 шагов выполнить за три субом разбиения 6) ALTER TABLE EMPLOYEE DROP PARTITION SYS_P7363 UPDATE GLOBAL INDEXES; --get этого имени раздела из таблицы all_tab_partitions с глобальным обновлением индекса 7) --alter index PK_DEPARTMENT rebuild; 8) --alter index IDX1_DEPARTMENT rebuild; 9) --отверстий индекса PK_EMPLOYEE rebuild; --Step 7 до 9, которое требуется только тогда, когда UPDATE GLOBAL INDEXES не используется во время изменяющих таблиц для обмена, усечения и уронить раздел или подраздел раздела 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 GLOBAL INDEXES используются в время Altering Table для обмена, обрезания и разбиения раздела или подразделения, где глобальные индексы применяются к этой таблице, тогда мы можем выполнять операцию DML на одной и той же таблице параллельно здесь. UPDATE GLOBAL INDEXES используется для восстановления индексов одновременно с изменением операции. Если UPDATE GLOBAL INDEXES не используется, операция DML не разрешается на одной и той же таблице параллельно. Он будет выходить за пределы ORA Exception для глобальных индексов. Сообщение ERROR при выполнении операции вставки после удаления/замены/обрезания раздела/подраздела из таблицы: Ошибка SQL: ORA-01502: индекс TEST.PK_DEPARTMENT или раздел такого индекса находится в состоянии непригодного использования 01502. 00000 - "index «% s.% s 'или раздел такого индекса находится в непригодном состоянии " * Причина: Была сделана попытка получить доступ к индексному или индексному разделу , который был помечен как непригодный для прямой нагрузки или DDL * Действие: DROP указанный индекс или REBUILD указанного индекса или перестраивать непригодный индекс раздела

Если вы не хотите использовать UPDATE GLOBAL INDEXES и хотите параллельную работу DML с продувкой затем сделать индексы Local (не должен содержать первичный ключ или уникальное ограничение, потому что оно по умолчанию создано глобальным уникальным индексом). Оно находится на разделе и подразделе и ссылается на табличное пространство по умолчанию. С локальными индексами вы наблюдали медленную вставку в эту таблицу.

Смежные вопросы