Data Engineering/Oracle

오라클 Partition Table(파티션 테이블)

하 선생 2019. 11. 3. 22:53

## 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