由于TeleDB的MVCC实现机制原因,表数据的历史版本是保存在当前数据文件中的,通过VACUUM标识和回收一定时间之前的历史版本。对于增、删、改频率很高的表,由于VACUUM回收需要一定的时间,且回收与长事务有关,长事务会导致VACUUM不能及时标识回收历史版本,而频繁的新增、更新操作会写更多的新的页(数据块),导致表数据文件不断膨胀。
表膨胀会带来一些性能影响,如占用了更多的空间,全表扫描时需要扫描更多的的页(数据块)、更耗I/O、更耗时、索引扫描效率也会降低;VACUUM FREEZE时因需要全表扫描,同样效率更低。这和Oracle数据库频繁增、删、改导致的高水位表现一样。
应对表膨胀的建议有几点:
- 定期清理长事务,避免因长事务导致VACUUM回收失效。
- 大事务尽量拆成小事务。
- 设置合理的AUTOVACUUM,尽量能及时回收空间。
- 配置更好的硬件资源,提高SQL执行效率,提升VACUUM回收效率。
- 定期监测表膨胀情况,必要时在维护窗口、业务低峰期进行手动回收,或重建表。
- 用其它方案代替高频增删改的表,例如加入缓存层,高频操作在缓存层实时操作,然后定时同步到数据库。
- 评估是否可以设计为分区表,通过定期清理历史分区的方式加快数据回收。