ORACLE PARTITION TABLE COMPRESSION
from
1. ORACLE PARTITION TABLE COMPRESSION
PARTITION TABLE의 SEGMENT 역시 일반 HEAP TABLE 과 마찬가지로 압축이 가능하다.
압축이 일어나는 경우는 SQL LOADER, PARALLEL INSERT, INSERT APPEND 의 경우가 있다. 다시말해 BULK LOADING,INSERT 가 있는 경우 (ROW를 1건 1건 넣지 않는다) 압축이 일어난다.
2. ORACLE PARTITION TABLE 예제
<<TABLE 생성 때 압축옵션>>
기존에 INITIAL 64K, NEXT 64K (UNIFORM SIZE) EXTENT 할당을 하는 LIST PARTITION TABLE 을 사용했다. EXTENT 크기를 작게 한 이유는 데이터가 초기 EXTENT 할당량보다 적게 사용하는 경우 데이터의 크기를 알 수 없기 때문이다.
PARTITION TABLE 은 아래의 쿼리로 확인할 수 있다.
SQL> SELECT TABLE_NAME,PARTITIONED FROM USER_TABLES;
TABLE_NAME PAR
------------------------------ ---
PLAN_TABLE NO
ACTIVE_CNT YES
PARTITION TABLE 은 PARTITION KEY 로 나뉘어진 다수의 SEGMENT 로 이루어져 있다.
SQL> SELECT SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB FROM USER_SEGMENTS
2 WHERE SEGMENT_NAME = 'ACTIVE_CNT';
SEGMENT_NAME PARTITION_NAME MB
------------------------------ ------------------------------ ----------
ACTIVE_CNT DBDIV1_AC_100222 4
ACTIVE_CNT DBDIV1_AC_100223 4
ACTIVE_CNT DBDIV2_AC_100222 .0625
ACTIVE_CNT DBDIV2_AC_100223 .0625
ACTIVE_CNT DBDIV3_AC_100222 .0625
ACTIVE_CNT DBDIV3_AC_100223 .0625
각 SEGMENT 에 대한 압축 여부는 *_TAB_PARTITIONS 를 통해 조회할 수 있다.
일반 TABLE 의 경우엔 *_TABLES 를 통해 조회가능하다. PARTITION TABLE 의 경우 이 항목은 비어있다.
SQL> SELECT PARTITION_NAME,COMPRESSION
2 FROM USER_TAB_PARTITIONS;
PARTITION_NAME COMPRESS
------------------------------ --------
DBDIV1_AC_100222 DISABLED
DBDIV1_AC_100223 DISABLED
DBDIV2_AC_100222 DISABLED
DBDIV2_AC_100223 DISABLED
DBDIV3_AC_100222 DISABLED
DBDIV3_AC_100223 DISABLED
6 개의 행이 선택되었습니다.
위 데이터를 압축해보겠다. 우선 위 테이블의 DDL 에 이름을 변경하고 COMPRESS 옵션을 걸어 생성해 보겠다.
SQL> SET LONG 5000
SQL> SET PAGESIZE 120
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME) FROM USER_TABLES
2 WHERE TABLE_NAME = 'ACTIVE_CNT';
DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME)
--------------------------------------------------------------------------------
CREATE TABLE "LOGTEST"."ACTIVE_CNT"
( "PARTITION_KEY" VARCHAR2(74),
"TNSNAME" VARCHAR2(64),
"LOGGING_TIME" DATE,
"SESS_COUNT" NUMBER(38,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(INITIAL 20971520 NEXT 20971520
PCTINCREASE 0 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
PARTITION BY LIST ("PARTITION_KEY")
(PARTITION "DBDIV1_AC_100222" VALUES ('DBDIV1_100222')
PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" NOCOMPRESS ,
((( 중략 )))
COMPRESS 를 거는 방법은 아래와 같다. /*+ COLUMN LEVEL 에 거는 방법추가 */
첫번째는 TABLE LEVEL 로 거는 방법이다. 이 경우에 PARTITION BY… 절 전에 사용한다.
((( 중략 )))
TABLESPACE "USERS"
COMPRESS
PARTITION BY LIST ("PARTITION_KEY")
((( 중략 )))
두번째는 SEGMENT LEVEL 로 거는 방법이다.
(PARTITION "DBDIV1_AC_100222" VALUES ('DBDIV1_100222')
PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
((( 중략 )))
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" COMPRESS ,
((( 중략 )))
TABLE LEVEL 에서 COMPRESS 를 주면 SEGMENTS LEVEL 에서 자동으로 COMPRESS OPTION 이 적용된다.
((TABLE LEVEL COMPRESS TABLE 생성 후))
SQL> SELECT PARTITION_NAME,COMPRESSION
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME = 'ACTIVE_CNT_1';
PARTITION_NAME COMPRESS
------------------------------ --------
DBDIV1_AC_100222 ENABLED
DBDIV1_AC_100223 ENABLED
DBDIV2_AC_100222 ENABLED
DBDIV2_AC_100223 ENABLED
DBDIV3_AC_100222 ENABLED
DBDIV3_AC_100223 ENABLED
((SEGMENT LEVEL COMPRESS TABLE 생성 후))
SQL> ED
file afiedt.buf(이)가 기록되었습니다
1 SELECT PARTITION_NAME,COMPRESSION
2 FROM USER_TAB_PARTITIONS
3* WHERE TABLE_NAME = 'ACTIVE_CNT_2'
SQL> /
PARTITION_NAME COMPRESS
------------------------------ --------
DBDIV1_AC_100222 DISABLED
DBDIV1_AC_100223 DISABLED
DBDIV2_AC_100222 ENABLED
DBDIV2_AC_100223 DISABLED
DBDIV3_AC_100222 DISABLED
DBDIV3_AC_100223 DISABLED
압축 옵션을 준 SEGMENT 에 대해서만 적용됨을 확인할 수 있다.
(복사중에 누락되었다;;)
INSERT /*+ APPEND */ INTO ACTIVE_CNT_1 SELECT * FROM ACTIVE_CNT
ACTIVE_CNT_1 에 대해 데이터가 압축되어 들어가는 걸 확인해 보겠다.
SQL> SELECT SEGMENT_NAME,BYTES/1024/1024 MB
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'ACTIVE_CNT_1';
SEGMENT_NAME MB
------------------------------ ----------
ACTIVE_CNT_1 2
ACTIVE_CNT_1 2
ACTIVE_CNT_1 .0625
ACTIVE_CNT_1 .0625
ACTIVE_CNT_1 .0625
ACTIVE_CNT_1 .0625
크기가 작아진 걸 확인할 수 있다.
<<TABLE 생성 후 압축옵션>>
기존 TABLE 을 모두 DROP 후 본래의 TABLE 을 가지고 진행하겠다.
여기서도 TABLE LEVEL, SEGMENT LEVEL 로 압축 OPTION 을 줄 수 있다.
ALTER TABLE TABLE_NAME COMPRESSION
ALTER TABLE TABLE_NAME MOVE PARTITION PARTITION_NAME COMPRESS
SQL> SELECT TABLE_NAME,COMPRESSION FROM USER_TABLES;
TABLE_NAME COMPRESS
------------------------------ --------
PLAN_TABLE DISABLED
ACTIVE_CNT
TABLE LEVEL 로 COMPRESS 옵션을 주겠다.
SQL> ALTER TABLE ACTIVE_CNT COMPRESS;
테이블이 변경되었습니다.
USER_TABLES 에서는 PARTITION TABLE 에 대한 COMPRESS 여부 확인이 안된다.
SQL> SELECT TABLE_NAME,COMPRESSION FROM USER_TABLES;
TABLE_NAME COMPRESS
------------------------------ --------
PLAN_TABLE DISABLED
ACTIVE_CNT
USER_TAB_PARTITIONS 를 조회한 결과 TABLE 을 구성하는 모든 SEGMENTS 에 대해
COMPRESS 옵션이 적용됐음을 알 수 있었다.
SQL> SELECT PARTITION_NAME,COMPRESSION
2 FROM USER_TAB_PARTITIONS;
PARTITION_NAME COMPRESS
------------------------------ --------
DBDIV1_AC_100222 ENABLED
DBDIV1_AC_100223 ENABLED
DBDIV2_AC_100222 ENABLED
DBDIV2_AC_100223 ENABLED
DBDIV3_AC_100222 ENABLED
DBDIV3_AC_100223 ENABLED
6 개의 행이 선택되었습니다.
COMPRESS 가 적용됐음에도 불구하고 SIZE 는 변동이 없다. 그 이유는 적용대상에 있다. 위에서 실시한 명령은 SEGMENT 에 대해 이후부터 COMPRESS 를 하겠다는 의미로 기존 데이터에는 아무런 변화가 없다.
SQL> SELECT SEGMENT_NAME,BYTES/1024/1024 MB
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'ACTIVE_CNT';
SEGMENT_NAME MB
------------------------------ ----------
ACTIVE_CNT 4
ACTIVE_CNT 4
ACTIVE_CNT .0625
ACTIVE_CNT .0625
ACTIVE_CNT .0625
ACTIVE_CNT .0625
6 개의 행이 선택되었습니다.
SEGMENT LEVEL 로 COMPRESS 옵션을 적용했다.
SQL> ALTER TABLE ACTIVE_CNT MOVE PARTITION DBDIV1_AC_100222 NOCOMPRESS;
테이블이 변경되었습니다.
명령어에 해당하는 특정 세그먼츠만 속성이 변경되었다.
SQL> SELECT PARTITION_NAME,COMPRESSION
2 FROM USER_TAB_PARTITIONS;
PARTITION_NAME COMPRESS
------------------------------ --------
DBDIV1_AC_100222 DISABLED
DBDIV1_AC_100223 ENABLED
DBDIV2_AC_100222 ENABLED
DBDIV2_AC_100223 ENABLED
DBDIV3_AC_100222 ENABLED
DBDIV3_AC_100223 ENABLED
6 개의 행이 선택되었습니다.
이번에는 같은 명령어로 OPTION 만 COMPRESS 로 적용했다.
SQL> ALTER TABLE ACTIVE_CNT MOVE PARTITION DBDIV1_AC_100222 COMPRESS;
테이블이 변경되었습니다.
SQL> ED
file afiedt.buf(이)가 기록되었습니다
1 SELECT SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 MB
2 FROM USER_SEGMENTS
3* WHERE SEGMENT_NAME = 'ACTIVE_CNT'
SQL> /
SEGMENT_NAME PARTITION_NAME MB
------------------------------ ------------------------------ ----------
ACTIVE_CNT DBDIV1_AC_100222 2
ACTIVE_CNT DBDIV1_AC_100223 4
ACTIVE_CNT DBDIV2_AC_100222 .0625
ACTIVE_CNT DBDIV2_AC_100223 .0625
ACTIVE_CNT DBDIV3_AC_100222 .0625
ACTIVE_CNT DBDIV3_AC_100223 .0625
SEGMENT 가 압축되었음을 확인하였다. 그 이유는 MOVE PARTITION 이라는 명령절에 있다. 해당 명령어는 PARTITION 을 말그대로 다른 테이블 스페이스에 옮길수도 있고 그 속성을 변경할 수 있다. 본래 타겟 테이블 스페이스에 대한 정보를 추가로 입력하지만 위와 같이 생략하는 경우는 그 테이블 스페이스에 그대로 재구성한다는 것을 의미한다. 다만 옵션이 COMPRESS 로 바뀌었기 때문에 크기가 변하게 되었다.