적용 대상:
Oracle database – 12.1.0.2
만든 이:
Mahesh Reddy M
소개:
Oracle Database 12c In-Memory가 도입됨에 따라 이제 단일 데이터베이스가 혼합 워크로드를 효율적으로 지원하여 트랜잭션 성능을 최적화하는 동시에 실시간 분석 및 보고를 제공합니다. In-Memory를 사용하면 데이터 마트와 데이터 웨어하우스가 더 많은 애드혹 분석을 제공할 수 있기 때문에 최종 사용자는 현재 하나의 쿼리만 요청하는 데 걸리는 시간과 동일한 시간에 여러 비즈니스 기반 쿼리를 요청할 수 있습니다. 이 기능을 사용하면 열, 테이블, 파티션 및 구체화된 뷰를 일반적인 행 형식이 아닌 열 형식으로 메모리에 저장할 수 있습니다. In-Memory Column Store(IM 열 저장소)는 12.1.0.2 패치 세트의 대표적인 기능입니다.
Oracle Database 12c In-Memory 아키텍처:
일반적으로 데이터는 행 형식으로만 저장되는 반면 In-Memory 데이터베이스에서는 열 형식으로만 데이터를 저장합니다. 따라서 Oracle Database 12c는 듀얼 형식 아키텍처를 지원합니다.
- 읽기/쓰기 작업(데이터 조작)을 위해 데이터가 요청될 때마다 기존 행 저장소(버퍼 캐시)에 데이터가 로드됩니다.
- 읽기 전용 작업을 위해 데이터가 요청될 때마다 새 In-Memory Column Store에 데이터가 채워집니다. 물론 이렇게 데이터가 채워질 때는 행에서 열 형식으로 변환됩니다.
- 삽입, 업데이트 또는 삭제가 포함된 트랜잭션이 커밋될 때마다 새 데이터가 즉시 그리고 동시에 행 저장소와 In-Memory Column Store에 표시됩니다. 따라서 두 저장소 모두 트랜잭션이 동일하게 진행됩니다.
In-Memory Column Store:
Database In-Memory는 In-Memory Area라고 하는 SGA(System Global Area)의 새로운 구성 요소인 In-Memory Column Store를 사용합니다. IM 열 저장소의 데이터는 기존 행 형식으로 존재하는 것이 아니라 새 열 형식을 사용합니다. IM 열 저장소는 버퍼 캐시를 대체하지는 않지만 보완하는 역할을 하므로 이제 데이터는 행과 열의 두 가지 형식으로 메모리에 저장될 수 있습니다.
In-Memory Area는 SGA 내의 정적 풀로, 이 풀의 크기는 초기화 매개변수 INMEMORY_SIZE(기본값 0)로 제어됩니다. 현재 In-Memory Area의 크기는 V$SGA에서 볼 수 있습니다.
IM 열 저장소 하위는 다음과 같은 두 개의 풀로 나누어 집니다.
- 1MB 풀 - 실제 열 형식 데이터를 저장합니다.
- 64K 풀 - 오브젝트에 대한 메타데이터를 저장합니다.
아래 쿼리를 사용하여 각 풀에서 사용 가능한 메모리 용량을 확인할 수 있습니다.
SQL> select * from v$inmemory_area;
POOL |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
1 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
1 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
2 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
2 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
3 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
3 |
표 1: 각 풀에서 사용 가능한 메모리
IM 열 저장소 활성화:
정적 풀로서, 데이터베이스 인스턴스가 재시작될 때까지 INMEMORY_SIZE 매개변수에 대한 모든 변경 사항이 적용되지 않습니다. 또한 AMM(Automatic Memory Management)에 의해 영향을 받거나 제어되지 않습니다. In-Memory Area의 최소 크기는 100MB여야 합니다.
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
ORACLE instance started.
Total System Global Area 4.2950E+11 bytes
Fixed Size 7677400 bytes
Variable Size 2.0938E+10 bytes
Database Buffers 8.5899E+10 bytes
Redo Buffers 529190912 bytes
In-Memory Area 3.2212E+11 bytes
Database mounted.
Database opened.
아래 쿼리를 사용하여 In-Memory 설정을 확인할 수 있습니다.
SQL> SHOW PARAMETER INMEMORY
NAME TYPE VALUE
---------------------------------- ----------- -----
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 1
inmemory_query string ENABLE
inmemory_size biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
CDB 및 PDB 수준에서도 inmemory_size 매개변수를 설정할 수 있습니다. 이 매개변수를 PDB 수준에서 설정하는 경우 인스턴스 또는 PDB를 재시작할 필요가 없습니다. 모든 PDB 값의 합은 CDB 값보다 작거나 동일합니다.
아래 표시된 PDB 수준에서 In-Memory 옵션을 활성화 및 비활성화할 수 있습니다.
PDB에 연결한 다음 아래 명령을 실행합니다.
비활성화:
Alter system set inmemory_size=0; 또는
Alter system reset inmemory_size;
활성화:
Alter system set inmemory_size=20G;
In-Memory 우선 순위 수준:
IM 열 저장소는 데이터베이스에서 성능에 가장 중요한 데이터로 채워져 있어야 합니다. 저비용 플래시 또는 디스크에는 성능에 덜 중요한 데이터가 있을 수 있습니다. 물론 데이터베이스가 작을 경우 IM 열 저장소에 모든 테이블을 채울 수 있습니다. Database In-Memory는 테이블 및 구체화된 뷰에 대해 새로운 INMEMORY 특성을 추가합니다.
테이블스페이스, 테이블, (하위) 파티션 및 구체화된 뷰에서
INMEMORY 특성을 활성화할 수 있습니다.
테이블스페이스 수준에서 이 특성을 활성화하면 기본적으로 테이블스페이스의 모든 테이블 및 구체화된 뷰가 IMCOLUMN 저장소에서 활성화됩니다.
alter tablespace quest INMEMORY;
테이블 수준에서 이 속성을 활성화하면 IMCOLUMN 저장소에 테이블의 모든 열이 채워져야 합니다. 하지만 IMCOLUMN 저장소에 열의 하위 집합만 채울 수 있습니다.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
마찬가지로 파티셔닝된 테이블의 경우
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
백그라운드 프로세스:
IMCO: IMCO 백그라운드 프로세스는 LOW/MEDIUM/HIGH/CRITICAL 우선 순위에 따라 In-Memory 지원 오브젝트 채우기(사전 채우기)를 시작합니다.
SMCO: SMCO는 이러한 작업을 구현하기 위해 슬레이브 프로세스(Wnnn)를 동적으로 생성합니다.
Wnnn: Wnnn 프로세스는 In-Memory 지원 오브젝트의 채우기 또는 사전 채우기를 위해 In-Memory 채우기 및 In-Memory 다시 채우기 작업을 실행합니다.
데이터베이스가 열린 직후 또는 데이터베이스를 처음 스캔(쿼리)한 후에 IM 열 저장소에 우선 순위가 지정된 목록으로 오브젝트가 채워집니다. 오브젝트가 채워지는 순서는 키워드 PRIORITY(5개 수준이 있음)에 의해 제어됩니다. 기본 PRIORITY는 NONE입니다. 즉, 오브젝트를 처음 스캔한 후에만 오브젝트가 채워집니다.
INMEMORY 절의 PRIORITY 하위 절에 의해 제어되는 다양한 우선 순위 수준
우선 순위 수준 설명
CRITICAL 데이터베이스가 열린 직후 오브젝트가 채워집니다.
HIGH 모든 CRITICAL 오브젝트가 채워진 후에 오브젝트가 채워집니다.
MEDIUM 모든 CRITICAL 및 HIGH 오브젝트가 채워진 후에 오브젝트가 채워집니다.
LOW 모든 CRITICAL, HIGH 및 MEDIUM 오브젝트가 채워진 후에 오브젝트가 채워집니다.
NONE 오브젝트는 오브젝트를 처음 스캔한 후에만 채워집니다(기본값).
메모리가 1MB 청크로 할당된 경우 64KB 미만의 오브젝트는 IM 열 저장소 내에서 상당한 양의 공간이 낭비되기 때문에 메모리에 채워지지 않습니다.
예: alter table quest inmemory priority critical;
In-Memory 압축 기법:
IM 열 저장소는 스토리지 감소보다는 액세스 속도에 최적화된 특수 압축 형식을 사용합니다. 다음과 같은 방식으로 데이터베이스 속도를 높일 수 있습니다.
- 압축 형식을 사용하면 데이터베이스에서 각 열을 처리하기 위한 메모리 양을 줄일 수 있습니다. SQL은 압축된 열에서 바로 실행됩니다.
- 데이터베이스는 SIMD 벡터(어레이) 명령을 사용하여 단일 CPU 클록 사이클에서 모든 열 값 어레이를 처리합니다. 데이터베이스는 벡터로 많은 값을 저장할 수 있으며, 이를 통해 SIMD 벡터 프로세싱의 성능 이점을 극대화할 수 있습니다.
In-Memory 압축은 INMEMORY 특성의 하위 절인 MEMCOMPRESS 키워드를 사용하여 지정됩니다. 여기에는 6개의 수준이 있으며 각각은 서로 다른 수준의 압축 및 성능을 제공합니다.
No Memcompress: 압축 없이 In-Memory에 데이터가 채워집니다.
Memcompress for DML: 주로 DML 성능 및 최소 압축에 사용됩니다.
Memcompress for Query Low: 쿼리 성능에 최적화되었습니다(기본값).
Memcompress for Query High: 쿼리 성능과 공간 절약에 최적화되었습니다.
Memcompress for Capacity Low: Query High와 Low에 비해 공간을 더 많이 절약합니다.
Memcompress for Capacity High: 성능보다는 공간 절약에 더 최적화되었습니다.
압축률은 선택한 압축 옵션, 데이터 유형 및 테이블 콘텐츠에 따라 2X~20X까지 달라질 수 있습니다.
예: alter table quest inmemory memcompress for query high;
RAC의 In-Memory Column Store:
클러스터 환경에서 각 노드에는 고유한 열 저장소가 있습니다. 클러스터의 각 노드는 IM 열 저장소와 동일한 크기로 유지되어야 합니다. 기본적으로 메모리에 채워진 모든 오브젝트는 클러스터의 모든 IM 열 저장소에 분산됩니다. 클러스터의 모든 IM 열 저장소에 걸친 오브젝트 분산은 INMEMORY 특성의 두 개의 추가 하위 절인 DISTRIBUTE 및 DUPLICATE(엔지니어링된 시스템만 해당)에 의해 제어됩니다.
분산:
클러스터 전체에 분산되는 오브젝트는 분산 하위 절에 의해 제어합니다. 다음과 같은 방법으로 오브젝트를 분산할 수 있습니다.
행 범위별로 분산 - 행을 기준으로 다른 노드에 오브젝트를 분산합니다.
파티션별로 분산 - 클러스터 내부 노드에 파티션을 분산합니다.
하위 파티션별로 분산 - 하위 파티션을 다른 노드에 분산합니다.
예: alter table quest inmemory distribute by partition;
여기에서 중요한 것은 Oracle In-Memory RAC는 쿼리에 대한
비공유 아키텍처라는 것입니다. 즉, inmemory 데이터 오브젝트에 대해 쿼리를 제기하면(두 IM 열 저장소에서 오브젝트가 분산되는 것으로 가정하면) 선호도 노드에만 있는 데이터에 액세스할 수 있습니다. 따라서 클러스터의 인스턴스 전체에서 IMCU(Inmemory compression units)는 공유하지 마십시오.
따라서
DOP(Degree Of Parallelism)를 AUTO로 설정할 수 있습니다. 병렬 쿼리 코디네이터는 IMCU 위치의 다른 인스턴스를 식별합니다. DOP를 AUTO로 설정할 수 없는 경우 병렬 쿼리 코디네이터는 IMCU의 다른 인스턴스를 사용하지 않습니다.
set the degree of parallel to auto
alter system set parallel_degree_policy=AUTO scope=both sid='*';
중복:
가용성을 높이기 위해 오브젝트는 모든 인스턴스에 복사됩니다. 중복 하위 절을 사용하여 inmemory 테이블이 클러스터에 있는 모든 인스턴스에 저장되도록 지정할 수 있습니다. 엔지니어링 시스템이 아닌 경우 이 옵션은 사용할 수 없습니다.
예: alter table quest inmemory duplicate all;
quest table is stored in all instances.
In-Memory 오브젝트 모니터링:
Inmemory 오브젝트를 모니터링하기 위해 Oracle은 다음 두 가지 새로운 V$views를 도입했습니다.
v$IM_SEGMENTS 또는 v$IM_USER_SEGMENTS 및 v$IM_COLUMN_LEVEL
이러한 뷰를 사용하면 현재 IMCOLUMN 저장소에 얼마나 많은 오브젝트가 채워져 있는지 확인할 수 있습니다.
예:
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
예:
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
위의 예에서는 두 개의 테이블(Customer 및 Supplier)에 INMEMORY 열에 대한 값이 없는 것을 확인할 수 있습니다. INMEMORY 특성은 세그먼트 수준 특성입니다. Customer 및 Supplier 모두 파티셔닝된 테이블이므로 논리적 오브젝트입니다. 이러한 테이블의 INMEMORY 특성은 *_TAB_ (SUB) PARTITIONS의 파티션 또는 하위 파티션 수준으로 기록됩니다.
세 개의 추가 열(INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE 및 INMEMORY_COMPRESSION)이 *_TABLES 뷰에도 추가되어 각 테이블의 현재 InMemory 특성을 나타냅니다.