본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] range 파티션 split 작업 체크리스트

반응형

1. 파티션 테이블 구성하는 경우, 스크립트 예시

보관주기에 따라 Truncate하는 테이블,

또는 데이터의 규모가 커서 기간별로 관리하는 테이블의 경우.

 

Range 파티션을 구성하면 효과적으로 데이터를 관리할 수 있다.

 

고객 소비내역 테이블을 TABLE001 이라고 가정한다면,  

아래 그림처럼 결제시각에 따라 월 RANGE 파티션으로 구성할 수 있다.

 

각각의 파티션은 하나의 테이블과 물리적으로 동일하기 때문에

대량 배치작업시 enq tx - row lock contention을 방지할 수도 있고 

DML 성능을 향상시킬수도 있다.

 

* CREATE TABLE SCRIPT 예시

CREATE TABLE TABLE001
(
	CST_ID    NUMBER    NOT NULL,
	PMT_TIME  TIMESTAMP NOT NULL,
	PMT_NO    NUMBER    NOT NULL,
	PMT_AMT   NUMBER    NOT NULL,
	COLUMN_1 VARCHAR2(4),
	COLUMN_2 VARCHAR2(2),
	COLUMN_3 VARCHAR2(2),
	COLUMN_4 NUMBER
)
TABLESPACE TABLESPACE_NAME
STORAGE
(
	INITIAL 64K
	NEXT 1M
)
PARTITION BY RANGE ( PMT_TIME )
(
	PARTITION PT_R202201 VALUES LESS THAN (TIMESTAMP'2022-02-01 00:00:00 +0:00'),
	PARTITION PT_R202202 VALUES LESS THAN (TIMESTAMP'2022-03-01 00:00:00 +0:00'),
	PARTITION PT_R202203 VALUES LESS THAN (TIMESTAMP'2022-04-01 00:00:00 +0:00'),
	PARTITION PT_R202204 VALUES LESS THAN (TIMESTAMP'2022-05-01 00:00:00 +0:00'),
	PARTITION PT_MAX	   VALUES LESS THAN (MAXVALUE)
	TABLESPACE TABLESPACE_NAME
	STORAGE
	(
		INITIAL 64K
		NEXT 1M
	)
);

 

2. 파티션 RANGE를 추가하는 경우, 스크립트 예시

위 스크립트 예시처럼 range 파티션으로 구성할때 파티션을

Procedure나 Job을 통해 구성하거나 아니면 SCRIPT를 직접 작성 후 수행할 수 있다.

-- MAX 파티션을 2023년 1월 파티션, MAX 파티션으로 SPLIT
ALTER TABLE OWNER.TABLE_NAME SPLIT PARTITION PT_MAX AT (TIMESTAMP'2023-02-01 00:00:00') INTO (PARTITION PT_R202301 STORAGE (INITIAL 64K NEXT 1M), PARTITION PT_MAX);

-- 통계정보 복사
EXEC DBMS_STATS.COPY_TABLE_STATS( OWNNAME => 'OWNER', TABNAME => 'TABLE_NAME', SRCPARTNAME => 'PT_R202201', DSTPARTNAME => 'PT_R202301');
EXEC DBMS_STATS.COPY_TABLE_STATS( OWNNAME => 'OWNER', TABNAME => 'TABLE_NAME', SRCPARTNAME => 'PT_R202201', DSTPARTNAME => 'PT_MAX');

 

3. 파티션 RANGE SPLIT 작업 전/후 체크 리스트

1) 작업 전 CHECK

   - 테이블스페이스 용량이 충분한지

      ( 일 파티션 또는 복합 파티션의 경우 INITIAL EXTENT의 합의 크기가 상당할 수 있으니 미리 체크해야한다 )

   - MAX 파티션에 데이터가 들어있는지 

      ( MAX 파티션에 데이터가 있는 경우 SPLIT하면 INDEX가 UNUSABLE에 빠져 장애를 유발할 수 있다 )

        → INDEX UNUSABLE에 빠지면 PARTITION 단위로  REBUILD해서 USABLE 상태로 만들어야한다.

 

  2) 작업 후 CHECK

    - UNUSABLE에 빠진 인덱스는 없는지 (있는 경우 바로 REBUILD)

    - NOLOGGING인 인덱스는 없는지

    - 통계정보 누락 파티션은 없는지

-- 1) 파티션 테이블 UNUSABLE, NOLOGGING 조치
SELECT 'ALTER INDEX '||INDEX_OWNER||'.'||INDEX_NAME||' REBUILD PARTITION '||PARTITION_NAME||' NOLOGGING ONLINE;'
FROM   DBA_IND_PARTITIONS
WHERE  INDEX_OWNER = :owner
       AND STATUS != 'USABLE'
       AND COMPOSITE != 'YES';

SELECT 'ALTER INDEX '||INDEX_OWNER||'.'||INDEX_NAME||' LOGGING;'
FROM   DBA_IND_PARTITIONS
WHERE  INDEX_OWNER = :owner
       AND LOGGING != 'YES'
       AND COMPOSITE != 'YES'       
GROUP BY INDEX_OWNER, INDEX_NAME;

-- 2) 서브파티션 테이블 UNUSABLE, NOLOGGING 조치
SELECT 'ALTER INDEX '||INDEX_OWNER||'.'||INDEX_NAME||' REBUILD PARTITION '||PARTITION_NAME||' NOLOGGING ONLINE;'
FROM   DBA_IND_SUBPARTITIONS
WHERE  INDEX_OWNER = :owner
       AND STATUS != 'USABLE';

SELECT 'ALTER INDEX '||INDEX_OWNER||'.'||INDEX_NAME||' LOGGING;'
FROM   DBA_IND_PARTITIONS
WHERE  INDEX_OWNER = :owner
       AND LOGGING != 'YES'      
GROUP BY INDEX_OWNER, INDEX_NAME;

 

반응형