테이블/인덱스 압축 관련해서 질문 드립니다. 0 2 4,468

by 훈훈후니 [Oracle 기초] 압축 [2016.02.06 01:51:08]


안녕하세요.

 

오라클 테이블 하고 인덱스 압축 관련해서 몇가지 문의드립니다.

구글에서 이것저것 찾아봤는데.. 개념이 정확히 헷갈려서요..;;

 

1. 테이블 압축을 사용하는 경우가.. Update 문이 없고 Insert/Delete/Select 만 있는 테이블에 사용하는게 유리한가요?

2. 1번과 같은 경우라면 Insert/Delete/Select 시에 속도가 더 빠르다고 봤는데.. 맞나요?

3. Table 압축은 아래와 같이 적용할 경우, 새롭게 들어오는 데이터도 다 압축이 된 상태로 들어오는게 맞지요?

   CREATE TABLE <table_name> (...) COMPRESS FOR ALL OPERATIONS

  --  direct-path insert뿐만 아니라 모든 DML이 적용된다. OLTP환경에 사용한다. (11g)
  (or CREATE TABLE <table_name> (...) COMPRESS FOR OLTP)
  ALTER TABLE <table_name> (...) COMPRESS (출처 구루비)

4. Index 압축은 찾아보니.. 생성할 때 CREATE INDEX ... COMPRESS 처럼 제일 마지막에 COMPRESS 를 붙여주고..

   이미 생성된 Index 는  Rebuild Compress 를 하더라고요.

   근데 제가 Test 를 해보았을 때, 특정 테이블에 데이터를 10G Insert 후에 Index Rebuild Compress 하고..

   다시 추가로 10G 를 Insert 후에 Index Rebuild Compress 를 한번 더 해봤는데.. 용량이 2번 줄어들더라고요.

   그럼 기존의 Index 를 Rebuild Compress 하면.. 이미 들어가 있는 Index 만 압축이 되는건가요? 만약 그렇다면 이후에 들어오는 Index 도 압축이 된 상태로 들어오게 하려면 어떻게 해야 하는지요?

 

질문이 많네요.. 구루비랑 구글 찾아봐도 잘 안나와서 질문 올립니다.

 

다들 새해 복 많이 받으시고요~

by drakula [2016.02.12 16:09:15]

아무도~ 댓글을 달지 않는것 같아. 몇자 적습니다. 댓글을 자주 다는 편은 아니라;; ㅎㅎ

 

Oracle Compress의 기본 개념은 Block Compress  입니다. 하나의 Block에 똑같은 데이터를 Comrpess한다고 생각하시면 됩니다.

 

(제가. 있는 사이트는 한 테이블의 컬럼이 900개여서.ㅠ.ㅠ 아쉽게도 Compress를 해도 압축률이 안나와 사용하지 못하는 케이스가 많습니다.ㅠ.ㅠ)

 

 

 1. 테이블 압축을 사용하는 경우가.. Update 문이 없고 Insert/Delete/Select 만 있는 테이블에 사용하는게 유리한가요?

 

--> 오라클은 DML이 발생하지 않는 곳에 압축을 사용하라고 합니다.


     DELETE/UPDATE 의 경우는 DECOMPRESS를 한 이후에 작업을 수행해야 하기 때문에 테이블의 크기도 커지고, 속도도 느립니다.


     COMPRESS 이후에 기본적인 INSERT는 압축이 되지 않기 때문에(10g 까지는 Direct Insert만 압축되었음) 이후 추가 데이터는 COMPRESS  되지 않았습니다.
     결론은 DML이 발생하지 않고, SELECT만 발생하는 HISTORY성 데이터에 사용하는게 아주~ 좋겠죠!!!

 

 

2. 1번과 같은 경우라면 Insert/Delete/Select 시에 속도가 더 빠르다고 봤는데.. 맞나요?

 

--> 위의 설명대로 INSERT는 동일. DELETE는 DECOMPRESS 때문에 느려지고(FULL T.S의 Block수를  따져 봐야 합니다. 느려 질수(Decompress 작업으로)도 빨라 질수(Block수에 따라)도 있겠네요. 하지만, 이 작업의 여파로. SELECT가 느려 질 수 있습니다.) 


    SELECT는 무조건 빨라집니다.

 

 

3. 이건, 제가 테스트한 내용 입니다.

 

- 기존은 temp 테이블에 데이터를 인서트한 이후, 매일 저녁 배치 형식으로 COMPRESS하는 방식.

- 간헐적인 보정 작업으로 DML이 발생함에 따라  COMPRESS가 깨져 테이블의 크기가 커짐. 
   (SELECT 속도 저하 발생)

- 개발자의 귀차니즘 + 편함 NEEDS 발생

 

<시간 테스트 결과>

항목

사이즈

INSERT(초)

INSERT(초) - COMPRESS

합계(초)

기존 방식

6 MB

0.5

0.58

1.02

신기능 방식(OLTP)

6 MB

3.6

3.6

(*) 테스트 환경 - 17만건 TEST.

 

결론)

- COMPRESS FOR OLTP 압축률은 기존 COMPRESS 압축률과 동일
- COMPRESS FOR OLTP를 적용한 테이블의 DML은 2~3배 느려질 수 있음.
- DELETE 작업은 오히려 OLTP가 더 빠르며, 나머지는 비슷함.
- UPDATE 작업은 OLTP가 약간 더 느림.

 

 

4. INDEX의 COMPRESS.

 

- INDEX는 정렬이 필요한 데이터이고, 오라클은 Block 단위로 Compress하기 때문에
  INDEX는 테이블 처럼 들어오는 데이터를 바로바로 COMPRESS할수가 없습니다.


- 그러므로 INDEX는 REBUILD 또는 CREATE할때만 COMPRESS된다고 생각하시면 됩니다~

 

이상입니다.

 

 


by 훈훈후니 [2016.02.14 21:46:35]

우와.. 너무너무 감사드립니다.

한동안 답변이 없어서 못 보다가 늦게 글을 확인하였네요.

말씀하신 소중한 정보 잘 활용하겠습니다.

(__)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입