본문 바로가기

카테고리 없음

ORACLE PARTITION TABLE COMPRESSION v1.0


ORACLE PARTITION TABLE COMPRESSION

 

from

 

1.    ORACLE PARTITION TABLE COMPRESSION

 

PARTITION TABLE SEGMENT 역시 일반 HEAP TABLE 과 마찬가지로 압축이 가능하다.

압축이 일어나는 경우는 SQL LOADER, PARALLEL INSERT, INSERT APPEND 의 경우가 있다. 다시말해 BULK LOADING,INSERT 가 있는 경우 (ROW1 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 로 바뀌었기 때문에 크기가 변하게 되었다.