diff --git "a/content/zh/docs/SQLReference/HTAP\350\241\214\345\210\227\350\236\215\345\220\210\347\263\273\347\273\237\345\207\275\346\225\260.md" "b/content/zh/docs/SQLReference/HTAP\350\241\214\345\210\227\350\236\215\345\220\210\347\263\273\347\273\237\345\207\275\346\225\260.md" index c15ce3cefa8cdfeaa64606922f8bb23f8637d27b..a9cab25d8e36fee866a6eddc5c77ced0385c1905 100644 --- "a/content/zh/docs/SQLReference/HTAP\350\241\214\345\210\227\350\236\215\345\220\210\347\263\273\347\273\237\345\207\275\346\225\260.md" +++ "b/content/zh/docs/SQLReference/HTAP\350\241\214\345\210\227\350\236\215\345\220\210\347\263\273\347\273\237\345\207\275\346\225\260.md" @@ -74,7 +74,15 @@ - 注:数据由CU和delta组成,CU可能在内存或者硬盘中,delta仅保留在内存中。新数据修改会优先存储在delta中暂存,满足条件后迁移至CU。 + 注: + + 由于列存数据无法直接更新(列存数据作为整块内存,即时更新会造成大面积的内存拷贝和性能下降,同时HTAP功能需要针对列存rowid和行存ctid映射,即时更新会破坏映射关系),数据修改无法直接应用至列存缓存。所以修改操作会优先存储在增量表中,等到满足条件后重新构建列存缓存。 + 针对数据修改,具体实现逻辑为: + 1. 修改操作会记录至delta增量表,具体记录数据为行存的行id和修改时的事务id。此处由于记录的是操作记录,所以增删改操作都会增加内存使用。 + 2. 满足条件后触发vacuum,后台vacuum会根据frozenxid重新构建CU,并且删除增量表中小于frozenxid的记录。 + + 表现为数据更新/插入/删除时delta占用内存增加,vacuum后delta内存占用减少并且CU更新。 + 此处由于vacuum是基于Frozenxid的重新构建,只会将小于frozenxid的操作更新,该操作存在一定延迟,且延迟不可控。延迟由frozenxid的推进时间为准。 例如: