본문 바로가기

Database

[HANA] Delta Merge

수행 내

  • Before Merge
    • Write operation이 Delta1 storage에 발생
    • Read operaition이 Delta1, Main1에서 발생 
  • During Merge
    • 모든 Write operation이 Delta2로 변경
    • Uncommited 변경이 Delta 1 → Delta 2로 이동
    • Main 1의 내용과 Delta 1의 committed 내용이 Merge되어 Main Storage에 저장됨 (Main 2)
    • Read operation 수행
      • Main 1
      • Delta 1 (Committed)
      • Delta 2 (Uncommited + New Changes)
    • Main 1과 Delta 1은 Main 2 (Finished compression)로 대체 됨 (짧은 lock 발생)
  • After Merge
    • Old storage(Main 1, Delta 1)은 정리되고 Main2, Delta 2가 그 역할을 수행함
    • Main 2, Delta 2가 Disk layer에 유지되고 Merge operation 이전에 쓰여진 Delta log는 정리됨

 

특징

  • double buffer concept → Table에는  Lock이 발생하게 됨
    1. open transaction이 Delta2로 옮겨질  
    2. Storage가 Switched 될 때
  • Memory 필요량 
    = 현재 main storage + 미래 main storage + 현재 Delta storage + 추가 Memory
  • 만약 Column store의 테이블이 unloaded 또는 partly loaded 된 상황에서
    Delta merge를 수행하기 위해서 전체 테이블이 Memory에 load 됨

 

 

다음과 같은 이유로 Expensive 함

  • The complete main storage of all columns of the table are re-writen in memory→ CPU도 사용하고, 메모리도 2배로 사용함 (Main 1, 2가 모두 존재하는 동안) 
  • The complete main storages are persisted to disk, even if only a relatively small number of records were changed. This creates disk I/O load.
  • 이런 경우는 다음과 같이 회피 가능
    • Memory-only merge를 수행
    • Partition table로 쪼깨면 각 partition별로 main과 delta storage를 가지므로 조금 더 작게 관리 가능

 

 

Merge motivation (Merge Type)

  • Automatic System Process 
    • Auto (mergedog)
      • System process가 주기적으로 mergedog을 call해서 column store 테이블을 check 함
      • Delta store의 크기, available Memory, 마지막 Merge 후 경과된 시간 등등으로 판단함 
      • 관련 Command
        • ALTER TABLE <table name> ENABLE|DISABLE AUTOMERGE;
    • Critical (mergedog)
      • Auto merge가 disabled되고 Smart merge hint도 없는 상황이라도 Critical한 threshold를 넘는 경우가 생기면 System에서 자동으로 Merge를 수행함
      • 관련 파라미터
        • indexserver.ini -> [mergedog] -> critical_merge_decision_func
  • User/Application Task
    • Hard (SQL)
      • 적정한 resource가 있다면 바로 수행 됨 / 준비가 안되어 있으면 준비 되는대로
      • compression optimization이 수행되지 않음
        (즉 압축된 Table이라면 기존과 동일한 방식으로만 compress됨, 압축되지 안은 Table이라면 압축안된 상태로 유지) 
      • 관련 Command
        • MERGE DELTA OF <table name> [FORCE REBUILD];
          • FORCE REBUILD option = delta log on disk is cleaned immediately (SAP Note 2144274)
        • MERGE DELTA OF <table name> PART <part_id> ...
    • Forced (SQL) 
      • resource의 확인 없이 그냥 바로 수행되길 바라는 경우
      • Heavy system load 상에서 유용함
      • compression optimization이 수행되지 않음
      • 관련 Command
        • MERGE DELTA OF <table name> WITH PARAMETER ('FORCED_MERGE' = 'ON')
    • Smart (SQL + Hint)
      • 대량의 데이터를 올리는 경우는 Merge를 꺼놓고 loading이 수행된 후에 Merge가 수행되도록 Hint를 줄 수 있음.
        이때 사용 가능한 방법
      • 반드시 수행되는 것은 아니고 Delta merge가 필요한지를 판단하는 것을 수행 함
        (When the application issues a smart merge hint to the database to trigger a merge, the database evaluates the criteria that determine whether or not merge is necessary)
      • 조건이 충족되면 Delta merge 수행 됨
      • 사용하기 위해서는 Auto merge를 Disable 해 놓아야 함
      • 관련 파라미터 / Command
        • indexserver.ini -> [mergedog] -> smart_merge_enabled
        • indexserver.ini -> [mergedog] -> smart_merge_decision_func
        • MERGE DELTA OF <table name> WITH PARAMTERS ('SMART_MERGE") = 'ON');
        • (in SAP ABAP) TREX_EXT_MERGE_DELTA_INDEX
    • Memory (SQL)
      • SPS08까지만 사용가능 (그러니 잊어버리자)

 

 

Merge Monitor

  • Merge request는 merge montiro로부터 merge token을 받아서 수행 됨
    • Merge token = represents an allocation of system resources and 'entitles' the merge to actually start
    • Forced merge가 아닌 경우에는 모두 merge token이 있어야만 merge가 수행 가능
    • 현재 시스템 resource의 가용 여부를 산정 (주기적으로 재계산 됨)
  • indexserver.ini file의 mergedog section의 load_balancing_func 로 config 가능
  • Merge token의 개수를 체크하는 것은 불가능 → trace level = INFO인 경우 logging 됨
  • 시스템 resource가 가용한 것이 없는 경우에는 merge monitor가 merge request를 block 시킴
    • 그래서 merge monitor를 죽이거나 disable, stop 할 수 있는 방법도/필요도 없음 (얘는 thread가 아님) 
  • 관련 Parameter
    • indexserver.ini -> [mergedog] -> active 
    • indexserver.ini -> [mergedog] -> check_interval     (frequency_ms, default = 60000 = 1min)
  • 모니터링
    • M_DELTA_MERGE_STATISTICS
Type Merge  Details
FACT No BW fact table compression (BW_F_FACT_TABLE_COMPRESSION)
HINT No Smart merge request triggered by application, smart_merge_decision_func is evaluated and - if merge is indicated - a subsequent MERGE step is performed
MERGE Yes Delta merge
RECLAIM No Garbage collection in delta storage
SPARSE No Compression optimization (see SAP Note 2112604)
Typically executed as subsequent step of an auto merge, smart merge or critical merge, can also be triggered manually
Not restricted to SPARSE compression, so 'COMPRESS' would be a clearer name for this type

 

 

Cost function 

  • Merge motivation에서 사용됨 (Auto, Smart인 경우 수행할 것인지 말것인지를 판단)
  • Cost Function 종류
    • auto_merge_decision_func / smart_merge_decision_func
      • 설정예) 
        • delta storage가 1000MB 이상 OR
        • Merge 수행 후 60분 이상 소요 OR
        • Delta cell count가 800 million 이상 OR
        • Main storage의 20% 이상의 레코드가 삭제된 경우 OR
        • Delta Log가 5000MB 이상이 경우 
    • auto_merge_priority_func / smart_merge_priority_func
    • critical_merge_decision_func
      • 설정예) Default
        • UPT >43200 and             Indexserver uptime at least 43200 seconds (12 Hr)
        • ( ( MMS < 10000 and      Main memory size < 10 GB
        •      DMS > 1000 and         Delta memory size > 1 GB
        •       TMD > 86400             Table merge delay (time since last merge, in sec)
        •     ) or
        •    TMD >604800 )              
    • hard_merge_priority_func
    • load_balancing_func
  • Merge request마다 단 한번씩만 수행 됨
    • Smart merge hint가 사용된 경우 FALSE로 판정이 되면 그걸로 끝
    • 다시 Smart merge hint가 사용되기 전까지는 판정하지 않음
  • Delta merge의 default setting값을 변경하는 것은 권고하지 않음
    • 수정하는 방법
      • ALTER SYSTEM ALTER CONFIGURATION ('indexserver.ini', 'SYSTEM') SET ('mergedog','auto_merge_decision_func')= '((DRC*TMD>3600*(MRC+0.0001)) or (THM>=256000 and (((DMS>100 or DCC>100 or DLS>1000) and DRC>MRC/100) or (DMR>0.2*MRC and DMR>0.001))) or (THM<256000 and (DMS>50 or DCC>8 or DLS>100))) and (DUC<0.1 or 0.05*DRC>=DUC)' WITH RECONFIGURE
    • Shortcut 의미
Shortcut Unit Details
AHM MB Available heap memory
BASENAME   Table name (SAP HANA SPS >= 12)
CLA % CPU load average
CRCSOC million Changed row count since optimize compression
DCC million Delta cell count (number of rows in delta multiplied with number of table columns)
DLS MB Delta log size
DMR million Deleted main rows
DMS MB Delta memory size
DRC million Delta row count (uncommitted rows are not always taken into account)
DUC million Uncommitted delta row count
FULLNAME   Internal table name (SAP HANA SPS >= 12):
  • Table partitioned: _SYS_SPLIT/<table_name>~<part_id>
  • Table not partitioned: <table_name>
GAL MB Global allocation limit
IF(<arg1>, <arg2>, <arg3>)   Returns <arg2> if <arg1> is fullfilled (i.e. true or not 0), otherwise <arg3>
INSTR(<full_string>, <sub_string>)   Returns 0 if <sub_string> isn't contained in <full_string>, otherwise the position of the first occurrence of <sub_string> in <full_string> is returned
LCC   Logical CPU count
LOADED   TRUE if table is loaded, otherwise FALSE
MMS MB Main memory size
MMU million Main max UDIV
MRC million Main row count
NAME   Internal table name:
  • Table partitioned: _SYS_SPLIT/<table_name>~<part_id>
  • Table not partitioned: <table_name>
Due to the special naming convention for partitioned tables you have to use BASENAME (SAP HANA SPS >= 12) or the following approach if you want to refer to a partitioned table:
INSTR(NAME, '<table_name>') > 0
NMU million

Main max UDIV (>= SPS 09) 

NOW()  

Current date and time (localtime of the server timezone)

OCRC million (Last) optimize compression row count
PAL MB Process allocation limit
QDW s Queuing delay wait (wait time for assignment of token)
RHM MB Estimated required heap memory to complete table optimization
RP boolean TRUE if table is range partitioned, otherwise false
SCHEMA   Schema name
THM MB Total heap memory
TMD s Time since last merge of table
UPT s Uptime of indexserver

 

 

 

 

 Typicl Issue

  • IndexHandle wait
    • 특정 테이블에 대한 모든  the access/update가 block됨
    • Delta merge or DDL is running
    • Symptom

 

 

SAP Notes(2057046) summary 

  • (FAQ-16) Delta merge간 Memory 필요량을 줄이기 위한 방법 
Area Details
Partitioning Partition large tables so that smaller delta storages on partition level are used instead of a large table-wide delta storage.
Reduction of memory footprint Reduce the memory requirements of the table by actions like cleanup of basis tables, archiving, reduction of indexes, reduction of CONCAT attributes, data aging and extended storage. See SAP Note 1999997 ("Which options exist to reduce the risk of SAP HANA memory issues?") for more information
Reduction of changes Check from application side if you can reduce the amount of INSERT / UPDATE / DELETE operations.
Merge parameters Make sure that the merge related parameters are set to reasonable values (optimally default values) and avoid settings resulting in merges of large delta storages.
In individual cases you can adjust merge parameters so that merges happen before the delta storage has grown to critical sizes.
Manual merges In individual cases you can execute manual merges before the delta storage has grown to critical sizes.

'Database' 카테고리의 다른 글

[HANA] High availability support  (0) 2019.04.12
[HANA] SAP Notes 2600030 - Parameter Recommendations in SAP HANA Environments  (0) 2019.04.12
[HANA] Memory Control  (0) 2019.04.11
[HANA] Timeout관련 파라미터  (0) 2019.04.11
[HANA] Savepoint  (0) 2019.04.11