當離線導入大量數據或大量執行delete
、update
操作后,可能會由于數據文件的碎片化導致讀寫性能下降,此時需要執行壓縮(Compaction)操作。Compaction操作將多個數據文件合并成一個更大的數據文件,執行Compaction操作有助于重新組織數據存儲結構,提高讀寫效率。本文介紹在Hologres中如何進行Compaction操作。
背景信息
Hologres的數據寫入模型使用了與LSM-Tree類似的數據結構,數據都是以Append Only的方式寫入存儲的。這種數據結構可以將隨機寫變為順序寫,這是一種面向寫優化的數據結構,能夠有效提升寫入的吞吐量。寫入的數據文件需要通過Compaction合并成一個更大的數據文件。
Hologres中存在兩類Compaction操作:
Auto Compaction
Hologres的Auto Compaction是分層的。最多有五層,當單層文件超過五個時,會自動觸發Compaction,Compaction完成后的文件會放到下一層。例如Level 0的文件達到五個后,會自動觸發Compaction,將五個文件合并,合并后的文件默認最大為64 MB,如果文件大小超過64 MB后,會生成多個文件,合并后的文件會放到Level 1,示意圖如下所示:
Full Compaction
Auto Compaction只會發生在某層內部,不會跨層合并文件。Full Compaction會將所有層的所有文件進行合并,合并后每個文件默認的最大的大小為64 MB,合并后的文件會放到最后一層。
使用限制
僅Hologres V2.1及以上版本支持手動觸發Full Compaction,如果您的實例是V2.1以下版本,請您使用自助升級或加入實時數倉Hologres交流群申請升級實例,詳情請參見如何獲取更多的在線支持?
僅列存表和行列共存表可以主動觸發Full Compaction。
行列共存表執行Full Compaction之后,僅列存部分會執行Full Compaction。
使用說明
使用場景:
對于如下場景可以主動觸發Full Compaction,合并小文件,提升查詢效率:
離線導入大量數據后。
大量執行
delete
或者update
操作之后。
說明Full Compaction時會占用大量IO和CPU資源,請在寫入低峰期執行。一般執行會持續10分鐘以上。
命令語法:
SELECT hologres.hg_full_compact_table( '<schema_name.table_name>' [,'max_file_size_mb=<value>'] );
參數說明:
參數名稱
說明
是否必填
默認值
schema_name.table_name
需要執行Full Compaction操作的表名稱。
是
無
max_file_size_mb
(不推薦隨意更改)指定需要執行Full Compaction后生成文件的最大大小,取值必須是正整數,單位為
MB
。若調小此參數值,會導致數據文件變多,文件過多會導致查詢變慢。
否
64
使用示例:
對表
public.lineitem
執行Full Compaction操作:SELECT hologres.hg_full_compact_table( 'public.lineitem');
對表
public.lineitem
執行Full Compaction操作,指定合并后輸出的文件大小最大為256 MB:SELECT hologres.hg_full_compact_table( 'public.lineitem', 'max_file_size_mb=256' );