PostgreSQL数据库是功能强大的开源数据库,它支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。PostgreSQL数据库提供了丰富的接口,可以很方便地扩展它的功能,如可以在GiST框架下实现自己的索引类型,支持使用C语言写自定义函数、触发器,也支持使用流行的编程语言写自定义函数。PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python、PL/Java、PL/Tcl等。
本节对PostgreSQL的发展历史、优势特点和现状等进行介绍,让读者对PostgreSQL数据库有一个初步的认识。
·前身Ingres:PostgreSQL的前身是加利福尼亚大学伯克利分校于1977年开始的Ingres项目。这个项目由著名的数据库科学家Michael Stonebraker领导。在1982年,Michael Stonebraker离开伯克利,并把Ingres商业化,使之成为Relational Technologies公司的一个产品,后来Relational Tecchnologies被Computer Associates(CA)收购。Ingres是一个非关系型数据库。
·伯克利的Postgres项目:20世纪80年代,数据库系统中的一个主要问题是数据关系维护。1985年,Michael Stonebraker回到伯克利后,为了解决Ingres中的数据关系维护问题,启动了一个“后Ingres”(post-Ingres)项目,这就是Postgres的开端。Postgres项目由美国国防高级研究计划局(DARPA)、陆军研究办公室(ARO)、国家科学基金会(NSF)以及ESL公司共同赞助。从1986年开始,Michael Stonebraker教授发表了一系列论文,探讨了新的数据库的结构设计和扩展设计。第一个“演示性”系统在1987年便可使用了,并且在1988年的数据管理国际会议(ACM-SIGMOD)上展示,在1989年6月发布了版本1以提供给一些外部的用户使用。由于源代码维护的时间日益增加,占用了太多本应该用于数据库研究的时间,为了减少支持的负担,伯克利的Postgres项目在发布版本4.2后正式终止。
·Postgres95:1994年,来自中国香港的两名伯克利研究生Andrew Yu和Jolly Chen向Postgres中增加了SQL语言的解释器,并将Postgres改名为Postgres95,随后将其源代码发布到互联网上供大家使用,于是Postgres95成为一个开放源码的原伯克利Postgres代码的继承者。
·PostgreSQL6.X:到了1996年,显然“Postgres95”这个名字已经“经不起时间的考验”,于是又起了一个新名字——PostgreSQL,此名为Postgres与SQL的缩写,即增加了SQL功能的Postgres的意思。同时版本号也重新从6.0开始,也就是说,重新使用伯克利Postgres项目的版本顺序。
·PostgreSQL7.1:PostgreSQL 7.1是继6.5版本之后的又一个巨大的变化。它首先引入了预写式日志的功能,这样,事务就拥有了完善的日志机制,可以提供更好的性能,还可以实现更优良的备份和灾难恢复的能力(比如联机热备份和宕机后的自动恢复等)。其次是不再限制文本类型的数据段长度,这在很大程度上解决了PostgreSQL大对象的问题。
·PostgreSQL8.X:该版本可以在Windows下运行,它具有一些新特性,比如事务保存点功能、改变字段的类型、表空间、即时恢复(该功能允许对服务器进行连续的备份。既可以恢复到失败那个点,也可以恢复到以前的任意事务)等。此外,也开始支持Perl服务器端编程语言。
·PostgreSQL9.X:进入9.X版本,也标志着PostgreSQL进入了黄金发展阶段。PostgreSQL9.0于2010年9月20日发布,它大大增强了复制(replication)的功能,比如增加了流复制(stream replicaction)和HOT standby功能。从9.0版本开始,用户可以很方便地搭建主从数据库。此版本也提供了大版本的命令行升级工具pg_upgrade,可以方便地从低版本的数据库升级到9.0版本。PostgreSQL9.1发布于2011年9月12日,在该版本中增加了同步复制(synchronous replication)功能;增加了对外部表的支持;提供了外部模块框架和CREATE EXTENSION的SQL命令,可以更方便地创建外部扩展模块来扩展PostgreSQL数据库的功能;提供了不记录WAL日志表(unlogged tables)的功能,这在某些情况下可以大大提高性能;可以在插入、更新、删除中使用次查询(WITH语句),解决了原先PostgreSQL数据库不能实现Oracle中MERGE INTO语句的问题。PostgreSQL9.2发布于2012年9月10日,增加了级联复制的功能;实现了从备库做全量备份的功能;实现了原先Oracle和SQL Server中的覆盖索引查询功能(即只用在索引中查询数据,不必查数据行);增加了JSON数据类型,向SQL/NoSQL混合型数据库迈出了关键的一步。2013年9月9日,PostgreSQL9.3版本发布了,增加了物化视图的功能;为JSON类型增加了更多的处理函数的操作符;增加了可更新外部表的功能;增加了postgres_fdw模块,通过此外部表模块可以访问其他PostgreSQL服务器上的表;增加了事件触发器(Oracle系统触发器的功能),增强了数据库的审计功能。2014年12月18日发布了PostgreSQL9.4版本,增加了JSONB数据类型(Binary JSON的功能),提高了JSON的性能;刷新物化视图时不再阻塞读;WAL日志中开始增加逻辑读的功能,为后续版本中的逻辑复制打下了基础;提供了与Oracle类似的ALTER SYSTEM命令,方便修改数据库的配置参数。2016年1月7日发布了PostgreSQL9.5版本,增加了块范围索引(即BRIN索引),一种类似于Oracle ExaData一体机中存储索引的功能,在某些情况下它因使用占用空间很小的BRIN索引而大大提升了SQL的性能;增加了表的行级安全的特性,可以控制一个用户只能看见或更新一张表的部分行;多CPU机器性能得到了进一步的提升。2016年9月29日发布了PostgreSQL9.6版本,增加了并行计算的功能,全表扫描、JOIN查询、聚合操作可以利用多CPU进行并行计算;流复制中可以允许有多个同步的Standby数据库(之前的版本只允许有一个),实现了Standby数据库把日志重做完成后事务才返回的完全同步模式。
·PostgreSQL10.X:10.X版本实现了实用的发布和订阅方式的逻辑复制,让PostgreSQL数据库可以高效实现更灵活的复制功能,如双活功能,以前这些功能都需要通过第三方软件来实现;原先版本的Hash索引不能进行流复制,限制了Hash索引的使用,现在没有这个限制了;并行查询的功能得到了很大的提升,如支持并行的B-Tree扫描、Bitmap Heap扫描、并行的Merge JOIN、不相关的并行子查询等;增加了多列统计信息,让多列查询的执行计划更准确;直接支持通过CREATE TABLE语句创建分区表,不需要用继承的语法创建分区表,大大简化了分区表的创建;在客户端的连接串中支持写多个数据库服务器的地址,连接串中提供了属性target_session_attrs,用于探测后端数据库是主库还是只读备库,以便实现高可用和读写分离的方案。
·PostgreSQL11.X:增加了对just-in-time (JIT)编译的支持,使SQL中的表达式执行效率提高;并行方面的性能得到了较大的增强,如支持并行创建索引、并行Hash JOIN、并行CREATE TABLE AS等;存储过程中支持嵌入式事务,加强了对存储过程的支持,在存储过程中可以支持事务的操作,且对分区表进行了增强,如支持了哈希分区表,支持对分区键的更新等。此外,分区表的主键、外键、索引也得到了增强。
·PostgreSQL12.X:大大增强了往分区表里插入和复制数据的性能,对于有很多分区表的查询,其性能也得到了很大的提升;对B-Tree索引的性能进行了优化;对JSON数据类型开始支持SQL/JSON Path语言,可以更方便地对JSON数据进行检索。
PostgreSQL数据库具有以下优势:
·PostgreSQL数据库是目前功能最强大的开源数据库,它是最接近工业标准SQL92的查询语言,至少实现了SQL:2011标准中要求的179项主要功能中的160项(注:目前没有哪个数据库管理系统能完全实现SQL:2011标准中的所有主要功能)。
·稳定可靠:PostgreSQL是唯一能做到数据零丢失的开源数据库。目前有报道称国内外有部分银行使用PostgreSQL数据库。
·开源省钱:PostgreSQL数据库是开源的、免费的,而且使用的是类BSD协议,在使用和二次开发上基本没有限制。
·支持广泛:PostgreSQL数据库支持大量的主流开发语言,包括C、C++、Perl、Python、Java、Tcl以及PHP等。
·PostgreSQL社区活跃:PostgreSQL基本上每3个月推出一个补丁版本,这意味着已知的Bug很快会被修复,有应用场景的需求也会及时得到响应。
PostgreSQL目前在国外很流行,特别是近几年,使用PostgreSQL数据库的公司越来越多。
日本电报电话公司(NTT)大量使用PostgreSQL替代Oracle数据库,并且在PostgreSQL之上二次开发了Postgres-XC,Postgres-XC是对使用者完全兼容PostgreSQL接口的share-nothing架构的数据库集群。
亚信科技(AsiaInfo)在Postgres-XC的基础上开发了AntDB数据库,AntDB是一款面向金融、电信、政务、安全、能源等行业的分布式事务型关系数据库产品。它具备集群自动高可用、秒级在线扩缩容、异地容灾、SQL语句级自定义分片、分布式事务和MVCC等功能,且具有强大的Oracle兼容性。AntDB完全兼容PostgreSQL数据库。
腾讯在PosgreSQL-XC基础上开发了TBase分布式数据库。相较于Postgres-XC,其稳定性得到了较大提高,同时TBase通过在内核中创造性地引入GROUP概念,提出了双Key分布策略,有效地解决了数据倾斜的问题;它根据数据的时间戳,将数据分为冷数据和热数据,分别存储于不同的存储设备中,有效地解决了存储成本的问题。
网络电话公司Skype也大量使用了PostgreSQL,并贡献了如下与PostgreSQL数据库配套的开源软件。
·PL/Proxy:PostgreSQL中的数据水平拆分软件。
·pgQ:使用PostgreSQL的消息队列软件。
·Londiste:用C语言实现的在PostgreSQL数据库之间进行逻辑同步的软件。
全球最大的CRM软件服务提供商Salesforce也开始使用PostgreSQL,并招募了PostgreSQL内核开发者Tom lane。
著名的图片分享网站Instagram也大量使用了PostgreSQL。
2012年,美国联邦机构全面转向PostgreSQL阵营;法国也正积极推动政府机构采用PostgreSQL数据库来取代商业数据库。
在国内,越来越多的公司开始使用PostgreSQL,如斯凯网络的后台数据库使用的基本都是PostgreSQL数据库,去哪儿网(qunar.com)和平安科技也大量地使用了PostgreSQL数据库。
主流的云服务提供商如亚马逊、阿里云、腾讯云、华为云也都提供了PostgreSQL的云数据库服务。
更多关于PostgreSQL数据库的现状信息可见PostgreSQL官方网站( http://www.postgresql.org/ )。