SAP HANA DB 는 인메모리 DB 로써, DB 시작 시 대부분의 데이터가 메모리로 올라가며, 해당 메모리를 통해서 읽기(Read)와 쓰기(Write) 작업을 수행한다.
여기서 Column 테이블의 경우, HANA DB 메모리의 내의 Column Store 에 로드된다.
이러한 Column 테이블에 대한 데이터 변경은 조금 특별하게 이루어진다.
Column Store 메모리에 각각의 Column 테이블 내부적으로 Main Storage 와 Delta Storage 로 나눠지며, 여기서 데이터 변경에 대한 사항은 오직 Delta Storage 에만 기록된다.
이러한 방식을 취한 이유는, HANA DB 가 열 기반이며, 데이터가 압축되어서 저장되기 때문에 Main Storage 에 대한 직접 쓰기 작업은 Cost 가 매우 비싸기 때문이다.
따라서 쓰기 작업은 쓰기 작업에 최적화된 Delta Storage 에서만 수행되고, 이 후 Merge Dog 프로세스를 통해 자동적으로 Main Storage 와 Delta Storage 를 합치는 Delta Merge 작업을 수행하게 된다.
쓰기 작업은 오직 Delta Storage 에서만 이루어지지만, 읽기 작업은 Main/ Delta Storage 모두에서 이루어질 수 있다.
즉 Delta Merge(델타 병합) 란, 각 Column 테이블 Delta Storage 의 모든 쓰기 작업(Write)을 읽기 작업(Read)에 최적화된 Main Storage 로 옮겨 합지는 것이다.
Delta Merge 작업 후, Main Storage 의 내용은 디스크 에 저장되며, 필요한 경우 압축 및 최적화를 진행한다.
Delta Storage 는 메모리 상에서만 존재하는 개념이며, 디스크에는 저장되지 않는다.
Delta Merge 는 여러 이벤트에 의해 자동적으로 트리거 되거나, 비동기적 또는 수동으로 실행할 수 있다.
(출처 : SAP Help Portal - SAP HANA Administration Guide for SAP HANA Platform)
병합 작업 전에는, 각각의 Column 테이블은 Main Storage, Delta Storage 가 존재한다.
병합 작업이 수행되면,
병합 작업이 완료 되면,
Delta Log 는 Delta Storage 에 대한 논리적인 Redo Log 이다.
DB 가 재시작되면, Delta Log 를 사용하여 메모리 내에 Delta Storage 를 재구성한다.
이러한 Delta Log 는 Delta Merge 작업 이후, Merge 이전에 작성된 Delta Log 를 삭제하여 Delta Log 파일을 자른다.
이러한 Double Buffer (Main(1,2) / Delta(1,2)) 를 사용하면 병합 작업 마지막에 Main(1), Delta(1) 을 Main(2), Delta(2) 로 전환될 때, 짧은 시간 동안만 Lock 이 필요하게 된다.
자세한 내용은 아래 SAP Notes 를 참조하기 바란다.
- SAP Notes 2780767 - Hesitantly Locking Delta Merge and Optimize Compression
위에서 Delta Merge 프로세스를 살펴보면 알겠지만, 병합 작업에는 많은 메모리를 필요로 한다.
추가적인 메모리가 필요한 이유는 Delta Merge 대상이 되는 Table 은 메모리 상에 Full Load 되어야 하기 때문이다.
Main Storage 가 필요에 따라 압축 및 최적화가 될때 CPU, Memory 부하가 발생한다.
병합 작업 마지막에 Main Storage 가 디스크에 저장될때, Disk I/O 부하가 발생한다.
이러한 잠재적 영향도에 대해서는 테이블을 파티셔닝함으로써 완화할 수 있다.
테이블을 여러 파티션으로 분할할 경우, 각각의 파티션은 독립적으로 자체적인 Main / Delta Storage 를 가지게 되며, Delta Merge 는 각각의 파티션 단에서 수행된다.
기본적으로 SAP HANA 에서는 DB 시스템이 자동으로 Delta Merge 작업을 제어하며, 특수한 경우를 제외하고는 사용자가 수동으로 수행하는 경우는 거의 없다.
Delta Merge 는 수행 트리거에 따라 다음과 같이 Type 이 구분된다.
(출처 : SAP Notes 2057046 - FAQ: SAP HANA Delta Merges)
이 외에 경우에도, 다음 상황에서는 트리거와 관계없이 암묵적으로 병합이 수행될 수 있다.
- DB 복구
- Log Replay
자동 병합은 시스템 프로세스인 MergeDog 에 의해서 수행된다.
MergeDog 은 설정된 값에 따라 로드된 Column Store 테이블을 주기적으로 확인하며, 특정 기준(예: Delta Storage 크기, 사용 가능한 메모리, 마지막 병합 이후 시간 등등) 에 따라 Delta Merge 가 필요한지의 여부를 판단한다.
MergeDog 은 다음과 같은 파라미터로 구성된다.
indexserver.ini -> [mergedog] -> active
indexserver.ini -> [mergedog] -> check_interval
<frequency_ms>
(default : 60000 / 1m)TABLES (SYS) 시스템 뷰의 AUTO_MERGE_ON 필드 값을 통해, 개별 테이블에 대한 자동 병합의 활성화 여부를 알 수 있다.
특정 조건이 충족되면 MergeDog 프로세스에 의해 자동으로 Delta Merge 가 수행된다.
다음 파라미터를 통해 Auto Merge 의 기준(Cost 함수) 을 설정할 수 있다.
indexserver.ini -> [mergedog] -> auto_merge_decision_func
또한 다음 명령어를 통해서 각각의 테이블에 대한 Auto Merge 설정을 활성화/비활성화할 수 있다.
ALTER TABLE "<table_name>" ENABLE AUTOMERGE
ALTER TABLE "<table_name>" DISABLE AUTOMERGE
다음 SAP Notes 에 따르면, 기본적으로 Cost 함수는 수동으로 변경할 필요는 없다. 다만 운영 환경에 따라서 가이드에 따라 변경이 필요할 수 있다고 한다.
당연히 해당 값 변경 전, 테스트 환경에서 충분히 영향도를 체크하고, 모니터링 후에 진행해야 한다.
시스템의 불안정성을 방지하기 위해, Delta Merge 설정을 비활성화해도 자동으로 Delta Merge 가 수행된다.
다음 파라미터를 통해 Critical Merge 의 기준(Cost 함수) 을 설정할 수 있다.
indexserver.ini -> [mergedog] -> critical_merge_decision_func
자동 병합 미수행 또는 특정 테이블의 문제로 Delta Merge 수행에 특수한 상황이 발생했을때 사용한다.
관리자나 어플리케이션이 제어하는 Hard Merge 이며, 수행 즉시 실행된다.
(단, 이미 수행중인 Delta Merge 작업이 너무 많은 경우, 리소스가 사용 가능해지는 즉시 실행된다)
다음 명령어로 Hard Merge 를 수행할 수 있다.
MERGE DELTA OF "<table_name>"
MERGE DELTA OF "<table_name>" FORCE REBUILD
MERGE DELTA OF "<table_name>" PART <part_id> ...
FORCE REBUILD 옵션은 Merge 기준 함수(merge_decision_func) 및 실제로 수정된 레코드와 같은 특정 전제 조건이 충족되지 않아도 Delta Merge 를 수행한다.
이 외에도 HANA Studio 또는 기본 제공 Python 스크립트를 사용하여 Hard Merge 를 수행할 수 있다.
- HANA Studio :
System -> Catalog -> Schema -> Table -> "Perform Delta Merge..."
- Python Script :
/usr/sap/<SID>/HDB<inst_id>/exe/python_support/mergeAllDeltaTables.py
위와 같은 Hard Merge 는 일반적인 상황에서는 수행할 필요가 없다.
합리적이고 최적의 병합 작업은 MergeDog 이나 Smart Merge 에 의해 수행되기 때문이다.
Hard / Forced Merge 는 병합 작업 수행 이 후, 새로운 Main Storage 에 대한 압축 최적화를 진행하지 않는다. 따라서 수동 병합 이후에는 수동으로 압축 최적화를 트리거 해야한다.
위의 Hard Merge 의 경우, 기수행 중인 Delta Merge 작업이 너무 많은 경우, 리소스의 여유가 생길때까지 수행이 지연된다.
이러한 이유는 Merge 작업이 Merge Token 제어 메커니즘의 적용을 받기 때문이다.
만약 시스템 리소스의 가용성에 관계없이, 즉시 Delta Merge 를 수행해야 한다면 Fored Merge 를 사용하여 수행하면 된다.
(예, 시스템 부하가 크지만, 작은 테이블에 대해서 Merge 를 수행하는 경우)
다음 명령어로 Forced Merge 를 수행할 수 있다.
MERGE DELTA OF "<table_name>" WITH PARAMETERS ('FORCED_MERGE' = 'ON')
여기서 Merge Token 은 시스템의 리소스 크기에 대해 자동으로 계산된 값이다.
일종의 Merge 작업 수행을 위한 티켓이며, 해당 티켓을 통해서 전체 Merge 작업을 제어한다.
Smart Merge 는 관리자가 보다 직접적으로 Megre 에 대한 제어가 필요할 때 사용된다.
기본적으로 병합 작업 수행에 DB Hint 를 추가하여 기준을 새롭게 평가 후, 병합 작업이 트리거 된다.
(예, 애플리케이션에서 큰 테이블을 로드하는 등, 큰 부하가 있는 작업 수행 시, 해당 작업이 완료된 후, Delta Merge 가 수행되도록 Hint 를 준다.)
Smart Merge 를 사용하는 테이블에 대해서는 Auto Merge 를 비활성화 해놔야 한다.
Auto Merge 와 Smart Merge 가 서로 간섭할 수 있기 때문이다.
다음 파라미터를 통해 Smart Merge 를 설정할 수 있다.
indexserver.ini -> [mergedog] -> smart_merge_enabled
다음 파라미터를 통해 Smart Merge 의 기준(Cost 함수) 을 설정할 수 있다.
indexserver.ini -> [mergedog] -> smart_merge_decision_func
다음 명령어로 Smart Merge 를 수행할 수 있다.
MERGE DELTA OF "<table_name>" WITH PARAMETERS ('SMART_MERGE' = 'ON')
또한, ABAP 단에서도 함수모듈 TREX_EXT_MERGE_DELTA_INDEX 를 사용하여 Smart Merge 를 수행할 수 있다.
Memory Merge 는 SAP HANA 1.0 SPS 08 이전 버전에서만 사용할 수 있다.
사실상 옛날 버전이기에 이제는 사용하지 않는 방법이다.
간단하게 설명하면, Delta Merge 수행 후 Main Storage 가 디스크에 저장되는데, Memory Merge 의 경우 이때 디스크에 저장하지 않고, 메모리 단에서만 병합을 마치는 작업이다.
Delta Merge 작업에 대한 이력은 모니터링 뷰 M_DELTA_MERGE_STATISTICS 에 기록된다.
해당 모니터링 뷰는 시스템이 재시작할때 새롭게 기록된다.
모든 Delta Merge 기록은 HOST_DELTA_MERGE_STATISTICS (_SYS_STATISTICS) 에서 확인 할 수 있으며, 통계 데이터는 주기적으로 수집하므로 가장 최근의 Delta Merge 이력은 없을 수 있다.
Delta Merge 의 수행 기준이 되는 Cost 함수는 파라미터로 설정되어있으며, 운영 환경에 맞춰 변경이 가능하다.
❗❗❗ 그러나 SAP 지원팀의 지시가 없는 한 해당 Cost 함수에 대한 변경을 하지 않는 것을 권장한다.
여기서는 일반적인 Critical Merge 의 기본 Cost 함수에 대해서 분석한다.
각 값에 대한 자세한 설명은 다음 SAP Notes 를 참조하기 바란다.
UPT > 43200 and
( ( MMS < 10000 and
DMS > 1000 and
TMD > 86400
) or
TMD>604800
)
위 파라미터는 다음의 경우, 테이블이 자동으로 Delta Merge (Critical) 가 수행된다.
Indexserver 가 최소 12시간 이상 실행되고 (UPT > 43200)
이 후, 다음 두 조건 중 하나 이상이 충족 되는 경우,
조건에 따라서, 마지막 Delta Merge 가 7일 전에 수행된 경우, 무조건적으로 Delte Merge 가 수행된다.