오늘은 Oracle Exadata의 압축방식과 데이터를 활용하는 방법에 대해서 알아보려고 한다.
1. Oracle 압축방식
Oracle은 데이터 압축을 통해서 저장 공간을 절약할 뿐만이 아니라 I/O의 비용을 최소화할 수 있다. 기존 오라클 압축에서는 BASIC 압축, OLTP 압축 방식이 있었는데 Exadata에서는 Exadata Hybrid Columnar Compression(EHCC, 또는 HCC)라고 하는 새로운 압축 기법을 제공하고 있다. Basic 압축과 OLTP 압축은 데이터를 블록 레벨로 압축하는 방식이다. 반면에 EHCC는 Compression Unit이라는 논리적인 압축 단위로 압축을 한다.
2. EHCC란 무엇인가?
기본적으로 테이블에는 여러개의 튜플(로우)와 여러개의 어트리뷰트(컬럼)으로 이루어져 있다. 하나의 로우에는 여러개의 컬럼들로 구성되어있고, 각 어트리뷰트는 한가지의 데이터 타입으로 구성되어있다.
이 상태에서 Row 기준으로 블록을 압축하여 저장할 경우, 한 로우에 다른 데이터 타입들이 저장되어있기 때문에 저장 공간을 절약하는 데에 한계가 존재한다. 반면에 같은 데이터 타입으로 구성된 컬럼을 기준으로 데이터를 압축하는 경우, 압축률이 더 좋아진다. 그러나 컬럼 별로 압축을 할 경우 압축률은 좋아지지만, 하나의 로우가 여러개의 블록에 나뉘어 저장되기 때문에 한 로우만 접근하여 리드하려고 하더래도 모든 블록을 모두 접근하여 읽어야 하기 때문에 효율이 떠러질 수도 있다.
이 때에, HCC는 로우 기준으로 압축하는 방식과 컬럼 기준으로 데이터를 압축하는 방식을 모두 결합한 Hybrid 방식을 택하고 있다. 여러개의 블록으로 구성된 압축 단위인 Compression Unit 안에는 여러개의 로우가 저장된다. 그러나 Row level로만 압축하는 것이 아니라 Unit 안에서 다시 컬럼별로 데이터를 재구성하여 정렬한 후 압축을 수행하게 된다. 한마디로 하나의 압축 안에 또하나의 압축을 진행하게 되는 것.
위 사진과 같이 Row 별로 1차 압축을 진행하고 그 안에 Column 기준으로 또 하나의 압축을 진행하기 때문에 둘 중 하나의 기준으로만 압축하는 것보다 압축률이 더욱 좋아진다. 또한 특정 컬럼 하나의 데이터만 조회한다면, Compression Unit 중에서도 해당 컬럼을 포함한 블록만 검색하면 되기 때문에 접근 속도도 훨씬 빨라진다.
3. EHCC의 압축 유형
EHCC는 크게 조회 성능 및 압축률에 따라서 Query Mode와 Archive Mode로 나눌 수 있다. Query Mode는 일반적으로 속도와 성능에 최적화되어있어 압축률은 Archive Mode 보다는 낮지만 속도와 성능에서는 훨씬 빠르다. 반면에 Archive Mode 는 속도와 성능 측면에서는 느리지만 압축률이 매우 좋아 Historical 데이터에 적합하다. EHCC 압축 유형은 총 4가지 옵션이 진행되는데 데이터의 특성에 따라서 압축 유형을 선택하면 된다.
위 표에서 보면 알겠지만 아래로 내려갈수록 압축률은 좋아지지만 조회속도는 좀 느려질 수 있다.
4. EHCC 의 접근 방법
Exadata의 압축 데이터를 접근할 때에는 몇가지 주의사항만 알아도 훨씬 효과적이고 빠르게 접근을 할 수 있기 때문에 어느정도 알아두는 것이 중요하다 보인다. (이것 때문에 블로그 포스팅을 한것도 있다.)
- Insert 시 HCC 압축을 위해 반드시 Direct Path I/O를 사용해야 한다.
- INSERT /*+ APPEND */ INTO 사용
- Update / Merge 위주의 작업 대신 Insert로 변경 작업을 해야한다.(압축 기술을 활요하기 위해)
- 적절한 Parallel 처리 시 시스템 부하 방지를 위한 Hint 구문을 사용한다.
- 과다한 Parallel 사용은 안하는게 좋다.(특히 Parallel Default는 MAX이므로 반드시 주의할 것)
- Temporary Table의 과다 사용 자제
- Temporyary table은 parallel 처리가 안되기 때문에 With 절을 사용하거나 Real Table을 사용하는 것을 권고함
'Code > Oracle' 카테고리의 다른 글
[Oracle] Oracle Exadata란 무엇인가 (0) | 2022.05.14 |
---|---|
[Oracle] 오라클 append와 append_values 힌트, 사용방법 (0) | 2022.04.23 |
[Oracle] 오라클 힌트(hint)의 개념, 사용법 알아보기 (0) | 2022.03.27 |
[Oracle] 오라클 WITH절을 사용하여 임시테이블 만들기 (0) | 2022.03.12 |
[Oracle] SQL 병렬 힌트를 부여하여 쿼리 수행시간 단축하기 (0) | 2022.02.26 |