IMCS 소개

DB 성능 최적화를 위한 In-Memory Column Store의 개념과 기능을 설명합니다.

개요

In-Memory Column Store (IMCS)는 컬럼에대한 스캔을 최적화하기 위한 메모리 저장구조로 데이터의 복제본을 컬럼 포맷으로 저장하여 관리합니다.

기존의 로우 포맷 방식에 컬럼 포맷 방식을 추가로 지원함으로써 OLTP 및 OLAP 업무가 혼재된 환경에서 데이터베이스의 성능을 향상시킬 수 있는 기능입니다.

[그림 1] 로우 포맷 방식과 컬럼 포맷 방식

In-Memory Column Store 특징

In-Memory Area

In-Memory Column Store는 공유 메모리의 In-Memory Area라는 곳에 존재합니다. In-Memory Area는 부 팅 시점에 고정된 크기로 할당되며 한 번 할당되면 DB 재기동 전까지 크기가 변경되지 않습니다. Cache Out이 발생하는 버퍼 캐시와는 달리 In-Memory Column Store에는 데이터가 한번 적재되면 유저가 따로 명령을 수행하지 않는 한 데이터가 In-Memory Area에 계속 존재합니다. 이 때문에 In-Memory Column Store에 저장된 데이터를 읽을 때는 별도의 I/O 비용이 발생하지 않습니다.단, In-Memory 데이터가 유효하지 않아 버퍼 캐시를 읽어야 하는 경우에는 In-Memory 스캔을 수행하더라도 I/O가 발생할 수 있습니다.

Columnar Format

In-Memory Column Store는 데이터의 복제본을 스캔에 최적화된 컬럼 포맷으로 변환하여 저장합니다. 컬럼 포맷의 데이터는 내부적으로 고정된 사이즈로 저장되며 이를 통해 스캔 시 필터 연산(e.g. <, >, =)을 효율적으로 처리할 수 있습니다.

Compression

In-Memory Column Store에서 각 컬럼 데이터는 중복 데이터를 제거하는 방법으로 데이터를 압축하여 저장합니다. 이를 통해 메모리 효율을 높이고 스캔 시 조회하는 데이터 갯수를 줄임으로써 효율적인 스캔을 지원합니다.

Data Pruning

In-Memory Column Store에서 각 컬럼 데이터는 In-Memory Compression Unit (IMCU)라는 저장 유닛으로 관리되며 IMCU에는 각 컬럼 데이터의 최소 및 최대값 정보가 포함되어 있습니다. 스캔 시 각 IMCU에 포함되어 있는 데이터의 최소 및 최대값을 확인하여 필요한 IMCU만 조회함으로써 스캔 효율을 높일 수 있습니다.


In-Memory Column Store 저장 구조

In-Memory Area는 부팅 시점에 공유 메모리(Shared Memory) 내 고정 (Fixed) 영역에 할당됩니다. In-Memory Area의 크기는 초기화 파라미터 INMEMORY_SIZE로 설정합니다.

In-Memory Area는 컬럼 데이터를 저장하는 In-Memory Compression Unit (IMCU)과 컬럼 데이터의 메 타를 저장하는 Snapshot Metadata Unit (SMU)로 구성되어 있습니다.

[그림 2] In-Memory Column Store 구조

In-Memory Compression Unit(IMCU)

IMCU (In-Memory Compression Unit)는 In-Memory Column Store (IMCS)의 저장 유닛으로 하나 이상의 컬럼의 데이터를 압축된 형태로 저장하고 있습니다. IMCU의 크기는 1 MB이며, IMCS는 하나의 오브젝트(테 이블, 파티션, 서브파티션)의 데이터를 컬럼 형태로 변환하여 여러 개의 IMCU에 저장합니다.

IMCU에는 오직 하나의 오브젝트의 컬럼 데이터만 저장됩니다. IMCU는 하나 이상의 Column Compression Unit(CU)를 포함하고 있습니다.

Column Compression Unit(CU)

CU(Column Compression Unit)는 IMCU 내에서 하나의 컬럼 데이터를 저장하는 영역입니다. CU 내 저장되는 각 로우의 컬럼 값은 2 byte 값으로 인코딩되어 CU 내 저장됩니다. 인코딩된 값을 dictionary code라고 하며, CU 안에는 각 dictionary code와 실제 컬럼 데이터 간의 매핑 테이블이 존재합니다.

Snapshot Metadata Unit (SMU)

SMU (Snapshot Metadata Unit)은 IMCU에 대한 메타 데이터를 저장하는 영역입니다. In-Memory Column Store 공간에서는 각 IMCU 마다 하나의 SMU가 매핑되어 있습니다. SMU에는 오브젝트 정보 및 IMCU에 적재 된 블럭의 주소 정보가 들어있으며, 트랜잭션 저널 (transaction journal)이라는 DML이 발생한 로우들에 대한 정보가 기록되어 있습니다.


In-Memory Process 구조

In-Memory Column Store 공간에 데이터를 컬럼 포맷으로 적재하는 작업(populate)은 백그라운드 프로세스에서 수행합니다. 에이전트 프로세스는 부팅 시점에 In-Memory priority가 지정된 오브젝트에 대해서 populate를 수행하며, priority가 지정되지 않은 오브젝트의 경우 쿼리를 통해 최초 접근 시 에이전트 프로세스에서 해당 오브젝트에 대한 populate 작업을 수행합니다.

In-Memory Column Store 공간에 데이터가 적재된 오브젝트에 대해 쿼리를 수행하여 컬럼 포맷의 데이터를 읽거나 혹은 DML을 수행하여 SMU에 트랜잭션 저널을 기록하는 작업은 워커 프로세스에서 수행합니다.


SIMD Vector Processing

SIMD(Single Instruction, Multiple Data) 벡터 연산을 통해서 WHERE 절의 expression 계산 성능을 향상 시킵니다. 예를 들어 CU를 구성하고 있는 2bytes의 고정된 byte의 데이터를 CPU에 8개씩 로드를 하고 한번의 비교 연산으로 8개의 결과를 출력합니다.

SIMD를 수행하기 위한 조건은 In Memory Column과 바인드 파라미터 또는 상수 값의 비교 연산하는 경우입니다. 가능한 비교 연산자는 >, >=, =, <, <=, AND 입니다.

Last updated