PostgreSQL 列存, 混合存储, 列存索引, 向量化存储, 混合索引 - OLTP OLAP OLXP HTAP 混合负载应用

背景

列存优势

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混合业务

https://www.postgresql.org/message-id/flat/CAJrrPGfaC7WC9NK6PTTy6YN-NN%2BhCy8xOLAh2doYhVg5d6HsAA%40mail.gmail.com

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内存缓存)》

《Greenplum 海量数据,大宽表 行存 VS 列存》

《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热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

上一篇:LAMP的解释


下一篇:3. Git与TortoiseGit基本操作