我在Oracle中遇到了交換分區和子分區的問題。 請用實例說明。如何在Oracle中使用交換分區進行分區和子分區?
回答
請找到下面的例子
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操作(不能包含主鍵或唯一的約束,因爲它是默認創建的全局唯一索引)它在分區和子分區上並引用默認表空間 使用本地索引,您在該表上觀察到插入緩慢
- 1. 分區和子分區
- 2. 如何在oracle中創建子分區?
- 3. 如何區分子進程?
- 4. Oracle多列分區與使用子分區
- 5. 在R中使用交換分區
- 6. 針對特定子分區的分區交換加載
- 7. 在Clojure中分區分區?
- 8. Oracle分區
- 9. Oracle表分區
- 10. 在Hive中對錶進行分區和分區有什麼區別?
- 11. Oracle中的子分區會妨礙分區性能
- 12. 在運行總計查詢中對分區進行分區
- 13. Oracle按分區劃分ID和按DATE分區間隔
- 14. 如何在Mysql中刪除特定分區中的子分區?
- 15. 我應該對錶格進行分區/子分區嗎?
- 16. 使用IList.Contains(分區)對多個分區進行DocumentDb查詢
- 17. Oracle 12c - 如何查看某個表的所有分區和子分區以及每個分區的記錄數
- 18. 使用alter table查詢添加分區和子分區
- 19. 如何在MongoDB聚合框架中進行區分和分組?
- 20. 在C#中對可觀察分區進行分區#
- 21. 按模式對Oracle表進行分區
- 22. mod分區(分區,分段)
- 23. 交換/移動分區
- 24. Oracle SQL分區和排名
- 25. Oracle 10g分區:我可以分區一個子表嗎?
- 26. 在Oracle中使用鉛的分區
- 27. 在Oracle 10g中使用表分區
- 28. 甲骨文 - 交換子分區
- 29. Oracle分區序列
- 30. Oracle分區性能