私は、Oracleで交換パーティショニングとサブパーティショニングに関する問題に直面しています。 例を挙げて説明してください。Oracleでのパーティション分割とパーティション分割の方法
答えて
数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;
---交換のためDEPARTMENTとEMPLOYEE表に次の例を数thousadsレコード--insert
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')
);
を見つけて、サブパーティションを切り捨ててください。
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)グローバルインデックス更新
5) ALTER TABLE EMPLOYEE TRUNCATE SUBPARTITION SYS_SUBP7360 DROP STORAGE UPDATE GLOBAL INDEXES;
とALL_TAB_PARTITIONSテーブルからこのパーティション名--get
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;
。グローバルインデックス更新を伴うサブパーティション化(ALL_TAB_SUBPARTITIONSテーブルからのサブパーティション名) - 上記の5つのステップが3つのサブパーティション化のために実行されます。 6) ALTER TABLE EMPLOYEE DROP PARTITION SYS_P7363 UPDATE GLOBAL INDEXES;
- グローバルインデックス更新を伴うall_tab_partitionsテーブルからこのパーティション名を削除してください 7) - アルファインデックスPK_DEPARTMENT rebuild; 8) - アルファインデックスIDX1_DEPARTMENT rebuild; 9) - アルターインデックスPK_EMPLOYEE rebuild; --step 7~9パーティションまたはサブパーティション 10を切り捨てるドロップ、UPDATE GLOBALインデックスは交換のために変更する表の時に使用しない場合にのみ必要である)
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インデックスがで使用され始めます交換テーブルの変更、切り捨て、削除パーティションまたはサブパーティションのグローバルインデックスがそのテーブルに適用されている場合、ここでは同じテーブルに対してDML操作を並列に実行できます。 UPDATE GLOBAL INDEXESは、alter操作で同時に索引を再構築するために使用されます。 UPDATE GLOBAL INDEXESが使用されていない場合、DML操作は同じ表に対して並行して許可されません。グローバル索引の場合、ORA例外の下にスローされます。 ERROR表からdrop/exchange/truncate partition/subpart後に挿入操作を実行するとメッセージが表示されます。 SQLエラー:ORA-01502:索引 'TEST.PK_DEPARTMENT'またはその索引のパーティションが使用不可能な状態です。 01502 - "index '%s。索引または索引パーティション へのアクセスが試行されました。 操作: 操作:DROPまたはDDL 操作:DROP指定された索引または指定された索引のREBUILDまたは 使用不可能な索引パーティションの再構築
UPDATE GLOBAL INDEXESを使用せずにパージ付きの並列DML操作を実行する場合は、索引をローカルにしますユニーク制約はデフォルトで作成されたグローバル一意インデックスです)。パーティションとサブパーティションにあり、デフォルトのテーブルスペースを参照します。 ローカルインデックスを使用すると、そのテーブルの挿入が遅くなります。