背景
列存优势
1、列存没有行存1666列的限制
2、列存的大量记录数扫描比行存节约资源
3、列存压缩比高,节约空间
4、列存的大量数据计算可以使用向量化执行,效率高
行存优势
1、行存查询多列时快
2、行存DML效率高
简单来说,行存适合OLTP业务,列存适合OLAP业务。
如果业务是混合负载,既有高并发SQL,又有实时分析业务怎么办?
Oracle的做法:
in memory column store,实际上是两份存储,一份在磁盘(行存),一份在内存中使用列存。
根据SQL,优化器选择扫描列存还是行存。(通常看planNODE中数据扫描的行选择性,输出的行数,输出的列数等)
Oracle in memory column store是两份存储的思路。
PostgreSQL如何应对混合业务场景呢?
当前PG已经有了SMP并行执行的优化器功能,丰富的聚合函数,窗口函数等,已经有很好的OLAP处理能力。如果能在数据存储组织形式上支持到位,势必会给OLAP的能力带来更大的质的飞跃,以更好的适合OLTP OLAP混合业务场景。
一些PG 混合存储的资料
1、PG roadmap
https://www.postgresql.org/developer/roadmap/
https://wiki.postgresql.org/wiki/PostgreSQL11_Roadmap
里面有提到postgres pro, fujsut 都有计划要开发列存储或者读、写优化索引。
2、PostgreSQL 12 可能会开放storage pluggable API,以支持列存组织形式表。
https://commitfest.postgresql.org/22/1283/
3、ROS, WOS
读优化和写优化存储,适合TP AP混合业务
4、citus开发的PG支持向量化执行的代码,在使用列存储时,AP查询的性能有巨大的提升。
https://github.com/citusdata/postgres_vectorization_test
5、《Extending PostgreSQL with Column Store Indexes》
6、cstore, citusdata(已被微软收购),开源的列存储FDW插件
https://www.citusdata.com/blog/2014/04/03/columnar-store-for-analytics/
7、2ndquadrant 公司的PG列存开发计划
https://blog.2ndquadrant.com/column-store-plans/
8、PG 列存储开发计划讨论wiki
https://wiki.postgresql.org/wiki/ColumnOrientedSTorage
9、《Column-Stores vs. Row-Stores: How Different Are They Really?
10、custom scan provide接口,pg_strom插件使用csp接口实现了gpu加速,其中GPU加速支持数据加载到GPU缓存、或者文件中以列形式组织,加速AP请求的SQL。(这种为非实时维护的数据组织形式,而是读时组织的形式)
http://heterodb.github.io/pg-strom/
11、In-Memory Columnar Store extension for PostgreSQL,PG的内存列存表插件
https://github.com/knizhnik/imcs
12、vops,PG的瓦片式存储(不改变现有HEAP存储接口),以及向量化执行组合的插件。
https://github.com/postgrespro/vops/blob/master/vops.html
《PostgreSQL VOPS 向量计算 + DBLINK异步并行 - 单实例 10亿 聚合计算跑进2秒》
《PostgreSQL 向量化执行插件(瓦片式实现-vops) 10x提速OLAP》
PostgreSQL 列存, 混合存储, 列存索引, 向量化存储, 混合索引 - OLTP OLAP OLXP HTAP 混合负载优化
根据以上资料,可以总结出得到一个结论:
一份数据,多种组织形式存储。不同的组织形式存储适合于不同的业务,不同的数据组织形式存储,有不同的数据扫描方法,根据SQL的统计信息,PLAN等信息判断选择采用什么样的组织形式的数据访问。
而恰好PG的可扩展性,非常适合于扩展出一份数据,多份存储的功能。
1、AM扩展接口,用于索引的扩展,例如当前PG以及支持了9种索引接口(btree, hash, gin, gist, spgist, brin, bloom, rum, zombodb)。
2、plugable storage接口。PG 12可能会发布这个新功能。
1 优化思路
1、写优化
2、读优化
2 数据组织形式
1、表组织形式
多份表的组织形式(多个数据副本),例如以HEAP存储为主(DML, OLTP业务),以列存储为辅(OLAP业务),数据落HEAP存储后返回,以保障SQL的响应速度,后台异步的合并到列存储。
不同的组织形式存储适合于不同的业务,不同的数据组织形式存储,有不同的数据扫描方法,根据SQL的统计信息,PLAN等信息判断选择采用什么样的组织形式的数据访问。
主,辅形式类似GIN索引的思路,fast update 方法,使用pending list区域,降低GIN索引引入的写RT升高,导致数据写入吞吐下降的问题。
2、索引组织形式
数据存储格式为一份(行存储,OLTP),增加一种索引接口(列组织形式(OLAP业务)),例如叫做VCI。
当有OLAP业务需求是,创建VCI索引,优化器根据SQL请求,决定使用VCI索引,还是TP型的索引。
3、分区表混合组织
不同的分区使用不同的组织形式。
例如,这种情况适合不同时间区间有不同的访问需求的场景。比如1个月以前的数据,大多数适合都是AP型的请求,1个月内的数据基本上是高并发的OLTP请求。可以针对不同的分区,采用不同的数据组织形式存储。
4、分区索引混合组织
不同的分区使用不同的索引组织形式。
类似分区表混合组织。
3 实现思路
1、扩展AM,即数据使用行存,索引使用列存储。扩展列存索引接口。
2、扩展存储接口,一份数据,多份表存储的形式。不同的表存储形式,可以有自己独立的索引体系。优化器根据SQL请求,选择不同的数据存储形式,进行访问,以适合OLTP OLAP的混合请求。
参考
《Greenplum 优化CASE - 对齐JOIN字段类型,使用数组代替字符串,降低字符串处理开销,列存降低扫描开销》
《PostgreSQL GPU 加速(HeteroDB pg_strom) (GPU计算, GPU-DIO-Nvme SSD, 列存, GPU内存缓存)》
《PostgreSQL 如何让 列存(外部列存) 并行起来》
[《[未完待续] PostgreSQL ORC fdw - 列存插件》](https://github.com/digoal/blog/blob/master/201710/20171001_05.md)
《Greenplum 行存、列存,堆表、AO表性能对比 - 阿里云HDB for PostgreSQL最佳实践》
《Greenplum 列存储加字段现象 - AO列存储未使用相对偏移》
《Greenplum 行存、列存,堆表、AO表的原理和选择》
《Greenplum 列存表(AO表)的膨胀、垃圾检查与空间收缩(含修改分布键)》
《列存优化(shard,大小块,归整,块级索引,bitmap scan) - (大量数据实时读写)任意列搜索》
《PostgreSQL 10.0 preview 功能增强 - OLAP增强 向量聚集索引(列存储扩展)》
《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》
《Greenplum 最佳实践 - 行存与列存的选择以及转换方法》
《PostgreSQL 列存储引擎 susql (志铭奉献)》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.