由于写操作只在增量存储区上进行,要将数据转换成使用内存少和读取性能好的格式就需要将它传输到主存储区。此过程即为增量合并操作Delta Merge Operation。合并过程如下图
1. 合并前,所有写操作在增1进行,读操作读取增1和主1的数据。
2. 合并过程中:
a) 所有写操作在增2进行
b) 读操作读取主1、增1和增2的数据
c) 增1内未提交的数据复制到增2
d) 增1内已提交的数据和主1内的数据合并进入主2
3. 合并完成后
a) 删除主1和增1
b) 主2的数据重新压缩并优化,如果需要还可以对记录排序并调整压缩参数。若压缩变动,立即重新载入数据
c) 主2数据持久化到磁盘
d) 删除增量日志
增量存储区只存在于内存中,不会写入磁盘。对增量区域进行的所有变动操作会形成增量日志(系统重启后,用于增量存储区的重建)。增量合并操作进行后会删除增量日志文件。
因为有双重缓冲,操作过程中表被锁定的时间很短(只在增1内未提交的数据复制到增2时以及最后主1和增1被替换时)。
注意,
合并操作需要的内存=当前主存储区+未来主存储区+当前增量存储区+附加内存。
若列存储表未被加载或部分加载,合并操作会完全加载表数据。
Delta Merge Operation操作代价较高的原因如下:
Ø 主存储区的数据被重新写入内存,消费CPU资源。当主1和主2并存时至少需要双倍的内存消耗
Ø 哪怕只是很少的更改,主存储区都要被持久化到磁盘,加重IO负担
以下操作部分减少增量合并对系统的影响
Ø 执行memory-only merges:只影响内存中的结构,不进行最后的持久化
Ø 表分区:将表分成多个分区,每个分区拥有独立的主存储和增量存储。增量合并操作只在分区层面进行操作,所以减少了合并和持久化的数据量。但也要注意分区的不好影响。