들어가며

Oracle은 데이터 압축을 통해 저장 공간을 절약할 뿐만 I/O 비용을 최소할 수 있다. 표준 Oracle에서는 이미 9i부터 기본 압축을 제공하고 11g부터는 OLTP의 Advanced 압축 기법을 제공한다. 그리고 Exadata에서는 Exadata Hybrid Columnar Compression(EHCC) 이라고 하는 새로운 압축 기법을 제공한다


이번 장에서는 Exadata의 주요 기능인 EHCC에 대해 자세히 알아본다.



EHCC

Oracle은 BASIC 압축, OLTP 압축, EHCC의 3가지 압축 기법을 제공한다. BASIC 압축과 OLTP 압축은 표준 Oracle에서 제공하는 압축 기법으로 데이터를 블록 레벨로 압축하는 방식이다. 반면에 EHCC는 Compression Unit이라는 논리적인 압축 단위로 압축하는 기법이다.


하나의 로우는 여러 개의 컬럼들로 구성되어 있고, 각각의 컬럼은 다른 데이터타입으로 구성되어 있기 때문에 Row Format 단위로 블록을 압축했을 경우 저장 공간을 절약하는 데에는 한계가 있다. 

반면에 같은 타입, 같은 특성의 데이터들로 이루어진 컬럼 별로 데이터를 압축하면 압축률은 더 좋아지게 된다. 그렇다고 칼럼 별로 데이터를 압축하는 것이 장점만 있는 것은 아니다. 컬럼 별로 압축할 경우 압축률이 좋아지기는 하지만, 하나의 로우가 여러 개의 블록에 나뉘어 저장되기 때문에 특정 로우 하나만 Access 하더라도 로우의 데이터가 포함되어 있는 여러 개의 블록을 모두 읽어야 한다는 단점도 있다.


EHCC는 로우 별로 데이터를 압축하는 방식과 칼럼 별로 데이터를 압축하는 방식을 결합한 Hybrid 방식을 택하고 있다. 먼저, 여러 개의 블록으로 구성된 압축 단위인 Compression Unit(CU) 안에는 여러 개의 로우들이 저장된다. 그러나 Row level로 압축하지 않고 CU 내에서 다시 컬럼 별로 데이터를 재구성하여 정렬한 후 압축을 수행하게 된다. 


EHCC 압축 방식



이렇게 압축하는 방식은 로우 별로 압축하는 것에 비해 CU내에서 컬럼 별로 재구성하여 압축하기 때문에 압축률이 좋아지게 된다. 아울러 특정 컬럼 하나의 데이터들만 조회한다면 CU 중에서도 해당 컬럼을 포함한 블록만 검색하면 되므로 로우 별로 압축하는 것보다 성능이 좋아진다. 하지만 EHCC를 적용할 경우 I/O의 단위가 CU 단위로 변경되기 때문에 하나의 로우 를 질의할 때 해당 Row가 포함된 CU 내의 모든 블록을 검색해야 한다는 것이다.

때문에 하나의 로우를 검색할 경우 로우 별로 압축하는 표준 Oracle의 압축 방식보다 조회 성능이 느릴 수 있다. 하지만, 컬럼 기반의 압축 방식에 비해서는 EHCC 방식이 훨씬 빠른 성능을 제공한다. 



EHCC 유형 및 적용 방법

EHCC는 크게 조회 성능 및 압축률에 따라 Query Mode와 Archive Mode로 나눌 수 있다. Query Mode는 일반적으로 속도와 성능에 최적화된 DW용 데이터에 적용하고, Archive Mode는 자주 사용되지 않는 Historical 데이터에 적용한다. Query Mode는 약 4~10배 정도의 압축률을 보이고 Archive Mode는 보통 10배~50배 정도의 압축률을 보인다. 


특히 Archive Mode는 압축률이 좋기 때문에, 그 동안 DB에 저장하기 부담스러워 테잎과 같은 외부 장치에 백업했던 데이터들에 적용하기 좋은 압축 모드이다. 백업 장치에 저장한 경우 데이터를 조회하기 위해 백업 장치에서 DB로 Restore하는 번거로움이 있지만 Archive Mode로 압축할 경우에는 언제든지 DB 서버에서 압축된 데이터를 조회할 수 있다.





EHCC 압축 유형에는 다음과 같은 총 4가지 옵션이 제공되는데 데이터의 특성에 따라 적절한 압축 유형을 선택하여 테이블 혹은 파티션 생성 혹은 변경 시 지정하면 된다. 만약 이미 데이터가 있는 테이블이나 파티션의 데이터를 압축하고 싶다면 Alter~Move 구문을 수행하면 된다.





EHCC 모니터링

테이블 혹은 파티션의 압축 유형을 확인하고 싶다면 dba_tables, dba_tab_partitions의 compress_for 컬럼을 조회하면 된다. 하지만, 조회된 압축 유형으로 실제 데이터가 압축되었는지는 확신할 수 없다. 데이터가 먼저 삽입되고 이후 Alter 구문으로 단지 테이블의 압축 유형만 변경할 수 있기 때문이다. 


만약 실제 데이터에 적용된 압축 방식을 확인하고 싶다면 다음과 같이 DBMS_COMPRESSION.GET_COMPRESSION_TYPE 프로시저를 호출하면 된다.






Posted by 비투엔

댓글을 달아 주세요