数仓实践丨从CU入手优化HStore表

💡 原文中文,约4200字,阅读约需10分钟。
📝

内容提要

本文介绍了华为云的GaussDB(DWS)存储引擎HStore的优化方法,包括解决小CU问题和提升数据聚簇性。这些方法能够显著提升HStore表的性能。

🔎

延伸解读

小CU合并的并发处理机制

小CU合并通过将小CU数据重新插入delta表并标记删除来实现,但新插入的记录会申请新的ctid,导致与DML操作冲突。当DML操作遇到小CU合并时,采用等待重试的方式;而compact操作遇到DML冲突时则直接跳过,因为删除和更新操作仍会标记删除数据,放弃合并此条数据不影响最终结果。这种机制保证了合并期间对实时入库性能影响极小,推荐阈值下upsert性能劣化仅1%。

提升数据聚簇性的收益与代价

通过异步排序将多个CU的数据按partial cluster key重新排序生成新CU,可显著提升CU的聚簇性,使min/max范围更集中,从而提高粗过滤效率。但排序过程中会对所有参与排序的CU加CU级锁,阻塞部分DML操作,因此不建议在业务高峰期使用。粗过滤效率的提升程度与原本的数据特征有关,需结合实际数据评估。

小CU问题的业务相关性

小CU问题主要由实时表入库量小、缓慢变化维表频繁更新以及频繁upsert/update/delete导致。一个CU中剩余多少条数据算作小CU与业务强相关,因此小CU阈值应可通过GUC参数调节。解决小CU问题能有效改善查询性能劣化和空间膨胀,并最终提升实时入库性能。

❓

Q&A

HStore表是什么?它有什么特点?

HStore是GaussDB(DWS)的一种存储引擎,同时拥有处理传统TP场景的事务能力和强大的数据分析能力。它利用delta表存储update/delete/insert等操作信息,依赖后台autovacuum做merge操作将数据写入主表。技术特点包括:完整的事务一致性、全面的功能支持、查询性能好、入库快、高压缩。

小CU问题是怎么产生的?

小CU问题产生的原因主要有:1. 实时表入库量不大,不定期入库,merge时可能产生小CU;2. 缓慢变化维表长期运行后产生大量小CU;3. 频繁upsert、update、delete等更新后,CU中大部分数据被标记删除,导致小IO和cudesc表膨胀。

小CU问题会对系统造成哪些影响?

小CU问题的影响包括:存储利用率过低,因为CUDesc不会因为CU变小而变小;引发大量小IO;粗过滤效率降低,因为CU中数据太少导致数据范围小;降低压缩率,因为压缩以CU为单位,CU过小会导致压缩表现达不到预期。

如何解决小CU问题?

解决小CU问题的方法包括小CU合并和0CU清理。小CU合并是将小CU数据重新插入到delta表后标记删除,依赖delta表的自动merge攒够后再产生完整的新CU;0CU清理是直接从CUDESC表中将0CU记录删除。小CU阈值可以使用GUC参数调节。

如何提升HStore表的数据聚簇性?

通过将HStore中多个CU的数据根据partial cluster key进行排序,生成新的CU再重新写入,新CU的数据会有更高的聚集性,即CU的min,max会在一个较小的区间内。异步排序时的并发处理与小CU合并类似。

提升数据聚簇性有什么效果和注意事项?

经过测试,排序后的CU聚簇性极大提升,粗过滤效率的提升与原本的数据特征有关。但是排序过程中会对所有参与排序的CU加CU级锁,此过程会阻塞部分DML操作,因此不建议在业务高峰期使用此功能。

🏷️

标签

➡️

继续阅读