본 기능은 테스트 목적으로 제공되는 실험적 기능입니다. 운영(Production) 환경에서의 사용은 권장 되지 않습니다.
개요
In-Memory Column Store (IMCS)는 컬럼에 대한 스캔을 최적화하기 위한 메모리 저장구조로 데이터의 복 제본을 컬럼 포맷으로 저장하여 관리합니다.
기존의 로우 포맷 방식에 컬럼 포맷 방식을 추가로 지원함으로써 OLTP 및 OLAP 업무가 혼재된 환경에서 데이터베이스의 성능을 향상시킬 수 있는 기능입니다.
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-Mem ory Area의 크기는 초기화 파라미터 INMEMORY_SIZE로 설정해줍니다.
In-Memory Area는 컬럼 데이터를 저장하는 In-Memory Compression Unit (IMCU)과 컬럼 데이터의 메 타를 저장하는 Snapshot Metadata Unit (SMU)로 구성되어 있습니다.
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 입니다.
In-Memory Column Store의 고가용성
In-Memory Column Store의 고가용성에 대하여 설명합니다.
TAC 환경에서의 In-Memory Column Store 기능
Tibero Active Cluster(이하 TAC) 환경에서 IMCS 기능을 사용할 경우, 실행 중인 모든 인스턴스는 자신만 의 In-Memory(IM) Column Store 공간을 가진다. 기본적으로 TAC 환경에서 오브젝트에 대한 populate를 수행할 경우 해당 오브젝트의 데이터는 각 노드에 분산되어 저장됩니다.
Tibero에서 모든 TAC 노드의 INMEMORY_SIZE 파라미터의 값은 동일해야합니다.
In-Memory Distribution
In-Memory 오브젝트에 지정하는 DISTRIBUTE 옵션은 오브젝트의 데이터가 각 TAC 노드에 어떻게 분산 되어 저장될지를 결정합니다.
다음은 DISTRIBUTE 옵션에 대한 설명입니다.
옵션
설명
AUTO
Tibero 내부 규칙에 따라 데이터를 각 노드별로 균등하게 분산시킴 (기본값)
By Rowid Range
데이터를 rowid의 range로 나누어 각 노드 별로 분산시킴
현재 Tibero 에서 미지원 상태
By Partition
데이터를 파티션 별로 나누어 각 노드별로 분산시킴
현재 Tibero에서 미지원 상태
By Subpartition
데이터를 서브파티션 별로 나누어 각 노드 별로 분산시킴
현재 Tibero 에서 미지원 상태
In-Memory Duplication
In-Memory 오브젝트에 지정하는 DUPLICATE 옵션은 각 TAC 노드가 데이터의 복제본을 저장 여부 및 방식을 결정합니다.
다음은 DUPLICATE 옵션에 대한 설명입니다.
옵션
설명
NO DUPLICATE
In-Memory 데이터의 복제본이 존재하지 않음 (기본값)
DUPLICATE
각 In-Memory 데이터는 하나의 복제본이 존재함
duplicate 옵션이 지 정된 In-Memory 오브젝트에 대한 populate 수행 시 2개의 TAC 노드에 같은 데이터가 저장됨
현재 Tibero에서 미지원 상태
DUPLICATE ALL
각 In-Memory 데이터는 노드 갯수만큼의 복제본이 존재함
모든 인스 턴스는 In-Memory 오브젝트의 복사본을 자신의 In-Memory Column Store 공간에 저장하고 있음
TAC 환경에서의 Parallelism
기본적으로 TAC 환경에서 In-Memory 데이터는 각 TAC 노드 별로 분산되어 저장되므로 In-Memory 데이 터에 대한 쿼리 수행은 병렬적으로 수행됩니다. 예를 들어, 3-node TAC 환경에서 populate가 완료된 테이블 에 대한 In-Memory scan을 수행하면, 각 TAC 노드에서 저장하고 있는 해당 테이블의 데이터를 읽어서 전 송해주게 됩니다.
즉, TAC 환경에서 In-Memory scan을 수행하면 노드 갯수만큼의 DOP(Degree Of Parallelism) 를 가지고 병렬적으로 스캔을 수행합니다.
[그림 1] 로우 포맷 방식과 컬럼 포맷 방식
[그림 2] In-Memory Column Store 구조
In-Memory Column Store 설정
In-Memory Column Store 기능을 활성화 및 비활성하고, 오브젝트별 In-Memory Column Store기능을 설정하는 방법에 대해 설명합니다.
In-Memory Column Store 기능 활성화 및 비활성화
In-Memory Column Store 기능을 활성화 및 비활성화 하기 위해서는 INMEMORY_SIZE라는 파라미터의 값을 변경해주어야 합니다.
INMEMORY_SIZE 파라미터
INMEMORY_SIZE 파라미터는 기본값이 0이며, INMEMORY_SIZE 파라미터 값이 0일 때는 In-Memory Column Store 기능이 비활성화된 상태입니다. In-Memory Column Store 기능을 활성화시키기 위해서는 INMEMORY_SIZE 파라미터 값을 100M 이상의 값으로 설정 후 데이터베이스를 기동해주어야 합니다.
INMEMORY_SIZE 파라미터는 동적으로 변경할 수 없으며, 변경을 위해서는 데이터베이스 재기동이 필요합니다.
INMEMORY_SIZE 파라미터 설정 변경
설정파일(tip 파일)에 INMEMORY_SIZE 를 변경합니다.
데이터베이스 기동 종료
데이터베이스 재기동
In-Memory Column Store 기능 활성화
In-Memory Column Store 기능 활성화를 위해서는 데이터베이스 재기동이 필요합니다.
INMEMORY_SIZE 파라미터 설정
데이터베이스 기동 전 설정파일(tip 파일)에 INMEMORY_SIZE 를 100M 이상의 값으로 설정해줍니다.
데이터베이스 기동 중이라면 데이터베이스 기동 종료
데이터베이스 기동
In-Memory Column Store 기능 비활성화
In-Memory Column Store 기능 비활성화를 위해서는 데이터베이스 재기동이 필요합니다.
INMEMORY_SIZE 파라미터 설정
데이터베이스 기동 전 설정파일(tip 파일)에 INMEMORY_SIZE를 0으로 설정하거나 INMEMORY_SIZE 파라미터를 삭제합니다.
데이터베이스 기동 종료
데이터베이스 재기동
오브젝트별 In-Memory Column Store 기능 활성화
본 절에서는 오브젝트별 In-Memory Column Store 기능 활성화 및 비활성화 방법과 priority, compression옵션에 대해 설명합니다.
In-Memory Population
In-Memory Population(이하 population)이란 데이터베이스에서 디스크로부터 row-format 데이터를 읽어 columnar-format으로 변경 후 In-Memory Column Store에 적재하는 것입니다. 테이블, 파티션, 서브파티션 만 population이 가능합니다.
In-Memory Population 동작
옵션별 priority 옵션 설정에 따라 데이터베이스 기동 또는 In-Memory 오브젝트에 접근하는 경우 population이 가능합니다.
In-Memory Population 우선순위
INMEMORY PRIORITY 절이 포함된 DDL 구문으로 population의 우선순위를 설정할 수 있습니다.
우선순위의 설정은 table, partition, subpartition에 대해 가능하며 column별로 우선순위 설정은 불가능하 다. 오브젝트에 inmemory 옵션을 설정하는 것은 population의 대상이 되는 것이지, 그 즉시 population 되 는 것은 아니라는 점에 유념합니다.
참고
Segment의 크기가 64KB 이하라면 해당 segment는 population 되지 않습니다. 따라서 inmemory 옵션 이 설정되어 있더라도 population이 되지 않는 오브젝트가 존재할 수 있습니다.
우선순위에 따른 population 동작은 다음과 같습니다.
동작
설명
PRIORITY Options
Prioirty 옵션별 동작은 다음과 같습니다.
옵션
설명
PRIORITY Option 설정 예시
CREATE TABLE 구문
ALTER TABLE 구문
In-Memory Population 제어
DDL 구문의 INMEMORY 절을 이용하여 테이블 스페이스, 테이블, 파티션, 서브파티션에 INMEMORY 옵션을 설정할 수 있습니다.
INMEMORY 절
INMEMORY 절은 기본적으로 segment 단위로만 설정할 수 있으며, column 단위로 지정할 경우 적용할 수 있는 옵션이 제약이 됩니다. Column 단위 INMEMORY 절은 추후 설명합니다.
INMEMORY 옵션을 설정하기 위해서는 아래의 구문에서 INMEMORY 절을 명시해줍니다.
CREATE TABLESPACE or ALTER TABLESPACE
테이블 스페이스에 INMEMORY 옵션을 사용하면, 해당 테이블 스페이스에서 만들어지는 테이블들은 테이블 스페이스의 INMEMORY 옵션을 따른다. 테이블에 INMEMORY 옵션을 명시할 경우 테이블 스 페이스의 INMEMORY 옵션을 override 합니다. 테이블 스페이스에 대한 INMEMORY 옵션은 만들어질 테 이블의 default INMEMORY 옵션에만 영향을 줍니다. 따라서 ALTER 테이블 스페이스를 통해 INMEMORY 옵션을 사용하여도 이미 만들어진 테이블들은 INMEMORY 옵션이 설정되지 않으며, ALTER TA BLESPACE를 통해 NO INMEMORY로 변경하여도 이미 INMEMORY 옵션이 설정된 테이블들은 NO INMEMORY로 변경되지 않는 것에 유의합니다.
CREATE TABLE or ALTER TABLE
테이블에 INMEMORY 옵션을 사용하면, 기본값으로 nonvirtual column들은 population 대상이 됩니다. Column 단위 INMEMORY 절로 특정 column 만 population 대상이 되게 설정할 수 있습니다. Partitioned 테 이블의 경우 partition별로 INMEMORY 옵션을 지정할 수 있습니다. 명시하지 않은 INMEMORY 옵션에 대해 서는 테이블의 옵션을 상속받으며, 명시한 INMEMORY 옵션은 테이블의 옵션을 override합니다.
테이블의 In-Memory Column Store 설정 예시
CREATE TABLE 구문
ALTER TABLE 구문
Column의 In-Memory Column Store 설정 예시
Column 단위 INMEMORY 절로 특정 column이 inmemory population 대상이 되지 않도록 설정할 수 있습니다.
CREATE TABLE 구문
ALTER TABLE 구문
Tablespace의 In-Memory Column Store 설정 예시
테이블 스페이스의 INMEMORY 절은 DEFAULT 절이 선행되어야 합니다.
CREATE TABLESPACE 구문
ALTER TABLESPACE 구문
On-demand population
INMEMORY PRIORITY 옵션의 기본값은 NONE
이 경우 해당 오브젝트에 대해 inmemory scan을 통해 접근하였을 경우만 population이 됨
오브젝트에 대해 접근이 없었거나, index scan, table full scan을 통해 접근이 되었을 경우 population이 되지 않음
Priority-based population
INMEMORY PRIORITY 옵션의 값이 NONE 이외의 값으로 설정되었을 경우, 오브젝트에 대한 접근이 없어도 population이 됨
Priority level 에 따라서 level이 높은 순으로 population시키며 priority level이 같을 경우 population의 순서는 보장할 수 없음
In-Memory Column Store의 공간이 부족할 경우 더 이상 population 시키지 않음
PRIORITY NONE
오브젝트 대해 접근시에만 population을 함
PRIORITY LOW
오브젝트에 대해 접근과는 무관하게 population을 함
다음 priority level의 population이 모두 완료된 후 population이 진행됨
MEDIUM
HIGH
CRITICAL
PRIORITY MEDIUM
오브젝트에 대해 접근과는 무관하게 population을 함
다음 priority level의 population이 모두 완료된 후 population이 진행됨
HIGH
CRITICAL
PRIORITY HIGH
오브젝트에 대해 접근과는 무관하게 population을 함
다음 priority level의 population이 모두 완료된 후 population이 진행됨
CRITICAL
PRIORITY CRITICAL
오브젝트에 대해 접근과는 무관하게 population을 함
최우선으로 population이 진행됨
INMEMORY_SIZE 파라미터를 Y로 설정한다면 다음과 같은 다음과 같은 파라미터 설정이 권장됩니다.
1) TOTAL_SHM_SIZE
- 기존에 사용하던 값에 Y를 더한 값으로 설정
2) DB_CACHE_SIZE
- single 환경인 경우: (TOTAL_SHM_SIZE - Y) * (2/3)
- TAC 환경인 경우 : (TOTAL_SHM_SIZE - Y) / 2
예를 들어, 기존에 TOTAL_SHM_SIZE를 100GB로 설정하여 DB를 구성하고 있었을 때 INMEMORY_SIZE로 30GB를 추가로 설정하려고 한다면,
TOTAL_SHM_SIZE를 기존 값에서 30GB를 더한 130GB으로 설정하는 것을 권장하며
DB_CACHE_SIZE는 single 환경인 경우 (130 - 30) * (2/3) = 66GB,
TAC 환경인 경우 (130 - 30) / 2 = 50GB로 설정하는 것을 권장합니다.