序言
本文是第二篇学习和研究Greenplum总结,并在社区中分享的文章。写本文的缘由,是来自于长时间对AO列存的困惑。为了能够进一步理解AO列存的内部原理,查询了相关文献以及对源码的阅读,同时做了实验验证。这里做了转载,把简书作为近期学习心得一个统一入口。感谢你的阅读,希望你能有所收获,并对文章提出建议。
原文链接:https://cn.greenplum.org/greenplum-ao-column-storage/
一、解析背景:
Greenplum AO列存,主要面向OLAP场景。表的列很多,分析其中少部分列,通过AO列存方式,大块的IO读,降低IO成本,提升分析速度。AO以前是appendonly,不支持update/delete,后来支持了,内部也改叫append optimized表。
二、AO列表存储设计
一张AO列存表主要涉及到表有pg_appendonly、pg_aoseg_<relid>、pg_aoblkdir_<relid>、pg_aovisimap_<relid>,这些表归属于pg_aoseg空间。
三、总结
1.AO列存优点分析速度快,对于OLAP场景,每次分析涉及的字段较少,采用GP的AO表的这个设计可以保证行级严格事务,这在列存数据库中不多见,这样的设计有利于高吞吐数据量的加载。同时通过块的方式提高数据的压缩比。
2.AO列存缺点每个列至少对应一个文件。例如集群有10个primary,10个mirror,一张有500列按天分区的列表,对应年的文件数>(10+10)*365*500=3650000。因而需要结合数据量和查询特征来设计合理的segment和分区的个数。 GP5、GP6存储空间占用大,如果表建索引,频繁的小批量加载数据会导致pg_aoblkdir_<relid>占用非常大的存储空间。GP7有brin索引可以考虑,索引文件会非常小,小到可以忽略不计。
本文介绍AO列存辅组表,以及相关设计进行解读,为更好的使用和理解AO列存表提供帮助,用户需要根据业务场景选择是否要采用AO列存。
’