본문 바로가기

IT관련

테이블 압축방식 체크 스크립트, Table Compression Type Check Script

Oracle DBMS 는 DB 내에 들어있는 테이블 데이터에 대해 압축기능을 지원합니다.

공짜(무료)로 사용할 수 있는 Basic Compression 이 있고,

유료로 사용할 수 있는 ACO (Advanced Compress Option) 압축이 있고,

Exadata(엑사데이터) 같은데에서만 사용할 수 있는 HCC (Hybrid Columnar Compression) 압축이 있습니다.

 

Basic Compression 은 테이블에 데이터를 벌크(Bulk) 로딩할 때만 동작(압축) 됩니다.

CTAS 문장이나 Insert /*+ apppend */ .. 문장을 사용해서 처음에 대량 로딩할 때만 압축되는 방식입니다.

이건 무료입니다.

 

ACO 의 경우는, 유료옵션인데 좀 더 좋죠~ 당근~

벌크 로딩이 아니어도, Insert 될때마다 Update 될때마다 압축이 일어납니다. 실제로는 압축이라기 보다는 Deduplication(중복제거) 방식입니다. 그래서 zip 처럼 압축하는 방식이 아니기 때문에, DML 이 일어날때마다 압축(Deduplication) 이 가능한 것이고, 압축이 되었어도 성능에 영향을 주지 않는 이유입니다.

즉, 성능저하없이 테이블에 압축기능을 사용할 수 있는 장점이 있죠~

But, 대신 Deduplication 이기 때문에 압축효율은 좀 떨어지겠죠... 같은 데이터가 반드시 들어와야 효과가 있습니다.

하지만, 별로 걱정하지 않아도 될게.. 원래 테이블에 중복데이터는 항상 차고도 넘치기 마련이니까 ^^

 

 

아래는 테이블 데이터의 압축방식을 체크하는 스크립트입니다.

 


set linesize 200
col compression_type for a30
col num_rows for 999,999,999


select CASE compression_type
       WHEN 1 THEN 'No Compression'
       WHEN 2 THEN 'Advanced compression level'
       WHEN 4 THEN 'Hybrid Columnar Compression for Query High'
       WHEN 8 THEN 'Hybrid Columnar Compression for Query Low'
       WHEN 16 THEN 'Hybrid Columnar Compression for Archive High'
       WHEN 32 THEN 'Hybrid Columnar Compression for Archive Low'
       WHEN 64 THEN 'Compressed row'
       WHEN 128 THEN 'High compression level for LOB operations'
       WHEN 256 THEN 'Medium compression level for LOB operations'
       WHEN 512 THEN 'Low compression level for LOB operations'
       WHEN 1000 THEN 'Minimum required number of LOBs in the object for which LOB compression ratio is to be estimated'
       WHEN 4096 THEN 'Basic compression level'
       WHEN 5000 THEN 'Maximum number of LOBs used to compute the LOB compression ratio'
       WHEN 1000000 THEN 'Minimum required number of rows in the object for which HCC ratio is to be estimated'
       WHEN -1 THEN 'To indicate the use of all the rows in the object to estimate HCC ratio'
       WHEN 1 THEN 'Identifies the object whose compression ratio is estimated as of type table'
       ELSE 'Unknown Compression Type'
       END AS compression_type,  n as num_rows
from ( select compression_type, Count(*) n 
       from (  select dbms_compression.Get_compression_type(USER, 'EMP', ROWID) as compression_type     --> 여기에 압축방식 조회할 테이블로 대체
               from scott.EMP                                                                           --> 여기에 압축방식 조회할 테이블로 대체
            )
       group  by compression_type
     );

 

위에서는 scott 유저의 EMP 테이블에 대해서 체크하고 있습니다.

다른 테이블을 체크하려면 변경해줘야 합니다.

스크립트가 위 처럼 Inline View 를 쓸수밖에 없는 이유는 테이블에 있는 데이터마다 다 읽어서 체크하기 때문입니다.

 

스크립트에서 Hybrid Columnar Compression 이라고 되어 있는 부분이 Exadata 에서 사용하는 HCC 압축방식입니다.

일반 Oracle DB 에서는 나오지 않죠~

 

위 스크립트는 테이블을 통째로 다 읽기 때문에, 테이블이 크면 시간이 오래 걸립니다.

그냥 특정 몇개의 Row 만 확인하려면 아래처럼 하면 됩니다.

 


select dbms_compression.get_compression_type('SCOTT', 'EMP', rowid) 
from scott.EMP 
where rownum < 10;

 

이때 숫자가 나올건데.. 이걸 위 스크립트의 compression_type 을 참조하면 되겠죠~