Delta Merge 작업이란?
HANA DB에서 DB공간에 Write 작업은 Delta Storage에서만 수행됩니다. 데이터를 메모리 소모와 읽기 성능 측면에서 최적화된 형식으로 변환하기 위해서는 Main Storage로 전송되어야 합니다. 이는 Delta Merge 작업을 통해 수행됩니다.
Delta Merge 프로세스 순서
- Before Merge: Delta Merge 작업 전에 모든 write 작업은 Delta1 Storage에 작성되고, 모든 read 작업은 Main1 및 Delta1 Storage에서 읽습니다.
- During Merge: Delta Merge 작업이 실행되는 동안 아래와 같은 작업이 진행됩니다
- 모든 Write 작업은 두 번째 Delta2 Storage에서 쓰기작업이 진행됩니다.
- 기존에 사용되었던 Main1 Storage와 두 Delta Storage인 Delta1, Delta2 Storage에서 read 작업을 합니다.
- Main1과 Delta1은 새로운 Main2에 Merge 작업이 진행됩니다.
- After Merge: Delta Merge 작업이 완료된 후 아래와 같은 작업이 진행됩니다.
- Main1 과 Delta1 storages는 삭제됩니다.
- 전체 Main Storage의 내용은 디스크에 유지됩니다.
Note
이중 버퍼 개념을 사용하면, 트랜잭션이 Delta2로 이동되는 프로세스가 시작될 때와 저장소가 "전환(Switched"될 때 프로세스가 끝날 때 아주 짧은 시간 동안 테이블락이 발생하게 됩니다.
Caution
Delta Merge 작업을 진행하는데 있어서 최소 메모리 요구사항으로 현재 사용하고 있는 Main Storage의 크기, 향후 Main Storage의 크기, 현재 Delta Storage 크기, 일부 추가 메모리가 필요합니다. Column Store 테이블이 언로드되거나 부분적으로 로드되더라도 Delta Merge를 수행하기 위해 전체 테이블이 메모리에 로드된다는 점을 이해하는 것이 중요합니다.
Delta Merge 작업에는 아래와 같은 리소스가 많이 필요로 할 수 있습니다.
- 테이블의 모든 열에 대한 전체 Main storages가 메모리에 다시 기록됩니다. 일부 CPU 리소스를 소비하고 적어도 Main storages에 필요한 메모리를 일시적으로 복제됩니다.(Main1, Main2가 병렬로 존재하는 동안)
- 상대적으로 적은 수의 레코드만 변경된 경우에도 Main Storage는 디스크에 유지됩니다. 이는 디스크 I/O 로드를 생성합니다.
성능에 대하여 잠재적으로 부정적인 영향을 방지하려면 테이블을 분할하여 완화할 수 있습니다. 테이블은 각각 자체 Main storage와 Delta Storage가 있는 여러 파티션으로 분할하여 Main Storage의 크기를 줄일 수 있습니다. Delta Merge 작업은 파티션 수준에서 실제로 필요한 파티션에 대해서만 수행됩니다. 이는 Delta Merge를 유지해야 하는 데이터가 적다는 것을 의미합니다. 단, 테이블을 분할하는 데에는 고려해야 할 단점도 있다는 점에 주의하세요.
분할된 테이블의 Delta Merge
Delta Merge 작업 중에 파티션을 나눈 테이블의 모든 파티션은 자체 데이터와 Delta storage가 있는 독립형 테이블로 내부적으로 처리됩니다. 영향을 받은 파티션만 Merge 작업의 대상이 됩니다. 위에서 설명한 것처럼 Merge 작업 시 테이블 전체를 복제해야 하므로 분할된 테이블의 경우 파티션 크기에 따라 Merge 작업 시 필요한 메인 메모리의 양이 줄어듭니다.
Main 또는 Delta Storage에 데이터가 있는지 여부와 관계없이 테이블을 다시 분할할 수 있습니다. 그러나 Delta가 작으면 다시 분할하는 것이 더 빠를 수 있습니다.
참고 URL(HANA DB version 2.0 SPS07 기준): https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/bd9ac728bb57101482b2ebfe243dcd7a.html