PostgreSQL修炼之道:从小工到专家(第2版)
上QQ阅读APP看书,第一时间看更新

1.1.1 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数据进行检索。