本文詳細描述了SAP HANA delta merge的技術
- 什么是Delta merge,為什么要進行Delta merge,
- Data merge的分類
- Data merge的手動操作
- Merge 的相關設置
- Delta Merge監控
- Merge 的過程
1.什么是Delta merge,為什么要進行Delta merge,
SAP HANA 的數據表(行存儲/列存儲)都會有兩塊區域用以存入數據,並定期進行合並.這兩下區域是Main Store和Delta Store,設定這兩塊區域的目的是使高壓縮比率和更快寫效率.
Main store 內的數據是有很高壓縮比率(通過創建字典和其它壓縮方法實現高壓縮比)的,有着更快的查詢和計算,但是寫的成本很高.
Delta 內存區域是對數據庫的寫優化設計的;存放在delta 區域中的數據會定期合並並加入到Main內存區域中,這個過程在SAP HANA 環境中稱為delta merge,就是將內存中的數據提交到數據庫表中.
在內存合並(Delta Store)過程中,系統中CPU和內存會有大量的消耗,因此需要對合並的過程加以控制,不能讓Merge進程使用當前系統全部的可用資源,因此每個Merge進程都需要得到下令牌(Merge token)(一個令牌都代表一個單個CPU),如果所有的merge token都占用了,那么下一個merge請求將需要等待之前的某個merge toker 被釋放之后才能開始Merge進程.
2.Data merge的分類:
- Auto Merge 是HANA的標准觸發Merge方式 ,HANA中的"Mergedog' 系統進程會定期檢查數據庫表的Delta內存區域是否有數據,然后完成Delta Merge.
- Smart Merge 是一種智能的自動觸發Merge方式, SAP HANA提供了這樣的一個功能,用戶能夠在系統中靈活定義一些觸發條件,一但條件滿足就開始執行Merge過程 例如:系統中給Delta內存區域定義一個閾值,一旦Delta區域國的數據量超過多少MB,就自動觸發Data Merge
- Memory Merge SQL 語句觸發,並且指定在內存中進行合並的方式,合並之后的數據不會寫入持久層 merge DELAT OF <db_table> WITH PARAMETERS('MEMORY_MERGE'='ON')
- Hard Merge 這是使用SQL語句觸發並且不設定任何條件的Merge 方式 ,但是只有成功從系統中獲得令牌之后,才能開始Merge
- Force Merge 和Hard merge類似,但無須取得令牌就可以Merge
- Critical Merge 這是為了保持系統穩定性能而設定的Merge 方式 : 設定場景:Auto Merge 關閉了,此時也沒有手動的Merge 被觸發,當Delta內存區域中數據增長到足以觸發一次Smart Mege 時,Critical Merge 會觸發一個Delta Mege 請求
3.Data merge的手動操作
HANA studio ,右擊數據表,選擇 "Merge..."
MERGE DELAT OF "HANA_TPC"."CUSTOMER" #直接合並 MERGE DELAT OF "HANA_TPC"."CUSTOMER" WITH PARAMETERS('SMART_MERGE'='ON') #啟動表的SMART MERGE MERGE DELAT OF "HANA_TPC"."CUSTOMER" PART <分區ID> #直接對表的某個分區進行合並,減少合並的范圍,加快合並進程,從而降低對系統資源的消耗
4.Merge 的相關設置
4.1 配置參數: index server -->mergedog
- mergedog active = yes 不要修改
- Auto Merge設置
check_interval = 60000 #每隔16.6小時執行一次
- Smart Merge設置
smar_merge_enabled = yes #開戶中smart Merge smart_merge_decision_func = MMS<1000 or DMS>1000 or DRC>0.1*MRC or DMR>0.1*MRC or DLS>5000 #DMS>1000 數據表的delta內存區域超過1000MB,如果向數據表寫入1GB大小的數據,而且這些數據是以insert only 方式寫入Delta內存區域,那么數據檢查超過1000MB,就會觸發Merge進程
#DMR>0.1*MRC 如果從Mainm內存區域刪除超過1/10的數據,那么系統就會觸發Merge 進程
# DLS>5000 如果Delta內存區域的日志超過5000MB,那么系統就會觸發Merge 進程 -
Merge Token 的設置:系統執行每個合並請求所需的令牌數據是由系統自動算的.如果當前系統無法計算出應該使用多少令牌數去執行某個合並請求,那么系統就返回一個默認值.
token_per_table=2 #不要修改
load_balance_func=1+LCC*(AHM/THM)*(100-CLA)/100 #系統可用Merge 令牌總數的配置參數 - Merge 並發進程配置
parallel_merge_threads=2 #設置進行Delta Merge 時能夠調用的CPU的處理內核的數量;更多的處理器會加速Delta merge 但過多會導致前端用戶的SQL無響應
4.2 Delta Merge 相關縮寫
縮寫 | 意義 |
描述 |
DMS | Delta Memory Size[MB] | delta內存區域的內存大小 |
TMD | table Merger Delay[sec] | 數據表Merge 延遲多少秒后才開始 |
MRC | Main row count[million] | Main內存區域有多少記錄行 |
DMR | Delete Main rows | Main內存區域刪除多少上行記錄 |
DLS | Data Log Size[MB] | Delta 內存區域中日志大小 |
DCC |
Delta Cell Count[million] |
Delta 內存區域Cell總數 |
DRC |
Delta Row count[million] |
Delta 內存區域中有多少行記錄 |
QDW |
Queuing Delay Wait[sec] |
排隊延遲多少秒 |
NAME |
Table name [string] |
數據表的名稱 |
SCHEMA |
Schema NAME[string] |
Schema 名稱 |
CLA |
CPU load average[percentage] |
CPU的平均負載率,如CLA<50,意味豐CPU負載率真小於50%就啟動Merge進程 |
LCC |
Logical CPU Count |
邏輯CPU胡單元數量 |
THM |
Total Heap Memory[MB] |
全部堆棧內存的大小 |
AHM | Available Heap Memory | 可用堆棧內存大小,以及能夠釋放胡內存 |
5.Delta Merge監控
所有的類型的Merger記錄都在M_DELTA_MERGE_STATISTICS中
6. Merge 的過程