오라클 Partition Table(파티션 테이블)
## Range patition 예제
CREATE TABLE SALES
(SALES_NO VARCHAR2(10),
CUSTOMER_NAME VARCHAR2(30),
PRICE NUMBER,
SALES_DT DATE)
PARTITION BY RANGE (SALES_DT)
(
PARTITION P2019 VALUES LESS THAN (TO_DATE('20200101','YYYYMMDD')),
PARTITION P202001 VALUES LESS THAN (TO_DATE('20200201','YYYYMMDD')),
PARTITION P202002 VALUES LESS THAN (TO_DATE('20200301','YYYYMMDD')),
PARTITION P202003 VALUES LESS THAN (TO_DATE('20200401','YYYYMMDD')),
.
.
.
PARTITION P9999 VALUES LESS THAN (MAXVALUE)
);
* MAXVALUE : 파티션 범위에 포함되지 않는 데이터가 저장됨
## Sample Data
INSERT INTO SALES (SALES_NO, CUSTOMER_NAME, PRICE, SALES_DT) VALUES('1001' , 'KIM', 15000 , TO_DATE('20190101', 'yyyymmdd'));
INSERT INTO SALES (SALES_NO, CUSTOMER_NAME, PRICE, SALES_DT) VALUES('1002' , 'HONG', 20000 , TO_DATE('20200101', 'yyyymmdd'));
INSERT INTO SALES (SALES_NO, CUSTOMER_NAME, PRICE, SALES_DT) VALUES('1003' , 'WHANG', 30000 , TO_DATE('20200201', 'yyyymmdd'));
INSERT INTO SALES (SALES_NO, CUSTOMER_NAME, PRICE, SALES_DT) VALUES('1004' , 'HA', 33000 , TO_DATE('20200201', 'yyyymmdd'));
## 해당 파티션 데이터 조회
SELECT * FROM SALES PARTITION(P202001);
## 파티션 ADD
ALTER TABLE SALES ADD PARTITION P202004 VALUES LESS THAN (TO_DATE('20200501','YYYYMMDD'));
## 파티션 DROP
ALTER TABLE SALES DROP PARTITION P2019;
## 파티션 TRUNCATE
ALTER TABLE SALES TRUNCATE PARTITION P202001;
## 파티션 SPLIT
ALTER TABLE SALES
SPLIT PARTITION P202004 AT (TO_DATE(' 2020-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))
INTO (PARTITION P9999);
## 테이블의 파티션 정보 (DBA 권한필요)
SELECT OWNER,TABLE_NAME, PARTITIONING_TYPE, SUBPARTITIONING_TYPE, STATUS, DEF_TABLESPACE_NAME, DEF_LOGGING, DEF_COMPRESSION, INTERVAL
FROM DBA_PART_TABLES
WHERE TABLE_NAME ='SALES';
## 관련 오라클 딕셔너리 테이블 (DBA 권한필요)
SELECT *
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = 'SALES'
## 로컬 인덱스 생성
CREATE INDEX IDX_SALES_01 ON SALES (SALES_NO) LOCAL;
## 글로벌 인덱스 생성
CREATE INDEX IDX_SALES_02 ON SALES (CUSTOMER_NAME) GLOBAL;
(* GLOBAL 키워드 생략시 디폴트로 글로벌 인덱스로 생성)
## 인덱스 REBUILD
ALTER INDEX IDX_SALES_02 REBUILD;
## 글로벌 인덱스 상태확인
SELECT INDEX_NAME, STATUS
FROM DBA_INDEXES
WHERE TABLE_NAME = 'SALES'
AND OWNER = 'TEST_USER';
INDEX_NAME STATUS
------------------------------ --------
IDX_SALES_01 N/A --> 파티션 인덱스는 조회불가
IDX_SALES_02 VALID --> INVALID / VALID
## 글로벌 인덱스 상태확인2
SELECT INDEX_NAME, STATUS
FROM DBA_INDEXES
WHERE STATUS = 'UNUSABLE';
## 파티션 인덱스 상태확인
SELECT INDEX_NAME, PARTITION_NAME, STATUS
FROM DBA_IND_PARTITIONS
WHERE INDEX_NAME IN ( SELECT INDEX_NAME FROM DBA_PART_INDEXES WHERE TABLE_NAME ='SALES' AND OWNER = 'TEST_USER' ) ;
[참고] 오라클 파티션 (Partition) 관리하기|작성자 Nerd