[转帖]PostgreSQL 昨天,今天和明天
PostgreSQL 昨天,今天和明天
http://www.postgres.cn/v2/news/viewone/1/52
原作者:何伟平(laser) 创作时间:2005-01-15 11:44:24+08 采编:doudou586
发布时间:2014-01-15 11:39:30
欢迎大家踊跃投稿,投稿信箱:press@postgres.cn
评论:3 浏览:30049
目录 |
PostgreSQL 简介
摘要
PostgreSQL 是一种非常先进的对象-关系型数据库管理系统(ORDBMS),目前功能最强大,特性最丰富和最先进的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。本文是PostgreSQL长期用户何伟平(Laser/BITBIRD)的文章“PostgreSQL的昨天、今天和明天”的当前版本。
版本
本文是作者何伟平(Laser/BitBIRD)在经过了十余年的 PostgreSQL 研究与应用之后的又一次重大改版:版本 3.0。这个版本反应了自5年前版本 2.0以来的变化与更新。
前言
今天,Richard Stallman (RMS)自 1985 年 10 月发起的自由软件运动已经有超过了 20 年的历史了,如果说最初 RMS 的愿望是创造一个可自由获取的操作系统的话,那么到今天,自由软件的发展已经远远超过当年 RMS 的目标,并且和整个计算机软件业的发展过程一样,自由软件用户对自由软件的基础需求也经历了由基础工具(编译器、编辑器)到基础平台(操作系统)再到基础应用软件(图形界面、数据库、办公软件、图形处理软件)的过程;甚至超越了传统软件的贡献,在向更高层次的联网系统(WebOS),和联网应用(WebDB,WebApplication)发展。
- 八卦:笔者认为正是自由软件带来的“成本革命”,才令 WebOS、WebDB、Web 应用成为可能,这些庞大公共软件设施在昂贵的商业软件时代是根本不可能想像的。类似的相关文章见拙作告别PC时代,迎来网络时代。
PostgreSQL 是在这个发展过程中,最重要的基础链条之一:数据库系统的一个典型代表。
“PostgreSQL 是一种特性非常齐全的自由软件的对象-关系性数据库管理系统(ORDBMS),它的很多特性正是当今许多商业数据库的前身” --摘自 PostgreSQL 手册。
历史
Ingres和Postgres
谈到 PostgreSQL,我们得谈谈 Berkeley,也就是中文“加州大学伯克利分校”这所大学。伯克利(BSD)对计算机科学的贡献巨大,尤其是在操作系统领域,各种BSD系统以及Bill Joy的TCP实现在整个计算机科学的发展史上熠熠生辉,光芒闪耀。它们的光辉是如此耀眼,以至于让人几乎无法看到伯克利在其它计算机科学的分支上的成就,而 PostgreSQL 正是其中之一。
PostgreSQL 的前身是 BSD 的始于 1977 年的 Ingres 项目,这个项目是 Michael Stonebraker 教授领导的,在 1982 年,Michael Stonebraker 离开伯克利商业化了 Ingres,成为 Relational Technologies 公司的一个产品,后来 Relational Tecchnologies 被 Computer Associates(CA)收购。Ingres 是一个非关系型的数据库(数据关系需要由用户有意识地维护),在 1985 年,Michael Stonebraker 回到伯克利开始一个后-Ingres(post-Ingres)的项目,目的是解决 Ingres 中,同时也是 1980 年代的数据库系统中的主要问题:数据关系维护的问题。这就是 Postgres 的开端。
从1986年开始,Michael Stonebraker 教授发表了一系列论文,探讨了新的数据库的结构设计和扩展设计,然后在 1988 年有了一个原型设计,1989年6月发布了版本 1,1990年6月发布了版本 2,1991年发布了版本 3。在版本 3 里改进了规则系统,增加了多存储系统支持以及改进了查询引擎。在 1993年,用户开始暴涨,并且特性需求急剧增加;在做了一些代码清理、发布了版本 4 之后,Postgres 项目正式终止。而随后 Michael Stonebraker 教授再次去创业,成立 Illustra 公司提供 Postgres 的商业支持,后来 Illustra 在 1997 年被 Informix 收购,而 Michael 教授成为 Informix 的 CTO;再后来 Informix 在 2001 年被 IBM 收购。
- 八卦:看Michael Stonebreaker教授的经历,感觉在 US 这个教授的确是“进可创业,退可教书”的好职业。不过Michael教授对数据库、对人类的贡献有目共睹,无需指摘太多。
- 后记:Michael Stonebreaker教授目前回到了教育岗位,在MIT从事数据库研究,后面对流数据库(Stream database)和列数据(Column database)都有颇多论文并且也相应地创建了一些商业支持公司,是一个很有求知欲和创业欲的教授。
Postgres95
Postgres 并没有因为 Postgres 项目的终止而停止发展,而是仍然在各种场合被人们所使用,在1994年,两名伯克利的研究生在做研究生课题的时候,向 Postgres 里增加了现代的 SQL 语言的支持。这里需要解释一下:E.F Code 的关系模型提出之后,对这个模型的实现有非常多的变种,相互之间并不兼容,比如Postgres用的是 QUEL/Postquel 语言,而 SQL 自身作为语言,一直到1992年才形成真正的国际标准(还是草案),当时称为 SQL2,但是人们常称为 SQL92。两位研究生是来自中国香港的 Andrew Yu 和 Jolly Chen 用 bison 和 flex 工具的组合,把Postgres 的Postquel查询语言替换成了 SQL92,然后将Postgres改名为 Postgres95。
- 八卦:笔者自己还和 Andrew Yu 有一面之缘,曾问起 Postgres95 起名原因,Andrew 同志回复的大致的意思的确是因为受了 MS 当年著名的 win95 的命名的影响。
PostgreSQL
Andrew Yu 和 Jolly Chen 最大的贡献在于,完成了 Postgres95 之后,将其发布到了互联网上,随后的 1996 年,加拿大的 Hub.Org Networking Services的 Marc Fournier(一名 FreeBSD 黑客)提供了第一个非大学的开发服务器平台,然后 Bruce Momjian(美国)和 Vadim B. Mikheev(俄国)开始修改以及稳定伯克利发布的代码,并于1996年8月发布了第一个开源版本。
随后,这些黑客把项目名称改变为 PostgreSQL,以对应 SQL 的支持,并且把 PostgreSQL 的版本号重新放到了原先 Postgres 项目的顺序中去,从 6.0 开 始(Postgres 本身到4.2,Postgres95 算5.0)。自 1996 年 8 月到现在的 2008 年,到今年北京奥运会开始的时候,PostgreSQL 项目将已经有 12 年的历史,而 Postgres 的年龄也会超过23岁,已经进入成熟的青年期。
目前,PostgreSQL 的稳定版本到了 8.3.1,在RDBMS的各种特性方面,已经接近于“无可指摘”的境界了。而目前 PostgreSQL 的开发是围绕在更易用的 SQL 语言扩展、SQL 标准的兼容(比如SQL2003、XML/Xquery的支持)、扩展工具、外围工具等方面。
- 八卦:在软件的使用过程中,感觉软件如人一样:随着年龄的增长而成熟,一个软件的青春期是10余年的时候,会迎来软件的一次繁荣,而成熟期是第二个10年左右,迎来软件的第二次繁荣;然后进入壮年期和盛年期,就是第三和第四个10年左右;一般软件在经历四十余年之后肯定会进化成更高层次的某种动物。在这个过程中,每个十年都会有一些关键的转折点,如果没能顺利通过转折点,估计就会消失。PostgreSQL 的竞争对手之一 MySQL 正处于青春期变化的过程,值得观察。
PostgreSQL读法
PostgreSQL 的读法:Post-gres-Q-L,因为大多自由软件开发人员把 SQL 念做:S-Q-L,而不是 IBM 常说的(squel)。类似的 MySQL 的官方读音也是:My-S-Q-L,而不是 My-see-quel。
特点
PostgreSQL 的特点可以说是如数家珍,称其为最先进的开源软件数据库当之无愧。一些当前主流数据库的特性对比可以在本站的主要关系型数据库系统对比一文中找到,就 PostgreSQL 而言,其主要特点有下面的不完全列表:
函数/存储过程
SQL 语言因为是“集合思维(Thinking in Set)”,基于集合理论进行数据的处理,所以自身没有循环和分支的定义,因此在某些需要精确控制的过程类场合显得有些过于庞大,所以 PostgreSQL 还提供了非常丰富的过程类语言的支持:
- 内置的 plpgsql,一种很类似 Oracle 的 Plsql的语言。
- 脚本语言支持的有:PL/Lua,PL/LOLCODE,PL/Perl,plPHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl 和 PL/Scheme。
- 编译语言有 C、C++ 和 JAVA。
- 统计语言 PL/R。
索引
PostgreSQL 支持用户定义的索引访问方法,并且内置了 B-tree,哈希和 GiST索引。PostgreSQL 里的索引有下面几个特点:
- 可以从后向前扫描,这样在 ORDER BY field DESC 的时候就不用单独创建索引文件了。
- 可以创建表达式索引,这样就可以对字段的某个表达式或者函数的计算值进行索引,而不只是对字段值。
- 部分索引,就是只对一部分数据进行索引,在 CREATE INDEX 语句中可以有 WHERE 子句。
触发器
触发器是 SQL 查询的动作触发的事件。比如,一个 INSERT 查询可能激活一个检查输入值是否有效的触发器。大多数触发器都只是对 INSERT 或者 UPDATE 查询有效。
PostgreSQL 完全支持触发器,可以附着在表上,但是不能在视图上。不过视图可以有规则。多个触发器是按照字母顺序触发的。并且我们还可以用其他过程语言书写触发器函数,不仅仅 PL/PgSQL。
并发管理/MVCC
PostgreSQL 的并发管理使用的是一种叫做 MVCC(多版本并发机制)的东西,这个机制实际上就是现在在众多所谓的编程语言里头极其火爆的“Lock Free”的东西。其本质是通过类似科幻世界的时空穿梭的原理,给予每个用户一个自己的“时空”,然后通过原子的“时空”控制,控制时间基线,并以此控制并发更改的可见区域,从而实现近乎无锁的并发,而同时还能在很大程度上保证数据库的 ACID 特性。
规则/RULE
规则允许我们对一个到来的查询生成的查询树进行改写。这个功能的一个用途是实现可更新的视图。
数据类型
PostgreSQL 支持非常广泛的数据类型,包括:
- 任意精度的数值类型
- 无限长度的文本类型
- 几何原语
- IPv4和IPv6类型
- CIDR块和MAC地址
- 数组
而且,用户还可以创建自己的类型,并且可以利用 GiST 框架把这些类型做成完全可索引的。比如来自 PostGIS 的地理信息系统(GIS)的数据类型。
用户定义对象
因为PostgreSQL使用一种基于系统表的可扩展的结构设计(感谢 Michael Stonebraker和所有黑客们!),PostgreSQL内部的几乎所有对象都可以用户定义,包括:
- 索引
- 操作符(内部操作符可以被覆盖)
- 聚集函数
- 域
- 类型转换
- 编码转换
继承
PostgreSQL 的表是可以相互继承的。一个表可以有父表,父表的结构变化也会导致子表的结构变化,而对子表的插入和数据更新等也会反映到父表中。
其它特性与扩展
PostgreSQL 还支持大量其他的特性,比如:
- 完整性约束,包括外键,字段约束和行检查
- 视图,不过还没实现可更新视图,但是可以用规则系统实现这个目标
- 全联接,内联接和外联接and outer (left and right) joins
- 子查询
- 事务
- 支持 SQL:2003 标准的大部分特性
- 通过 SSL 加密的连接
- 二进制和文本大对象存储
- 在线备份
- 域
- 表空间
- 保存点
- 即时恢复
- 两阶段提交
- TOAST(The Oversized-Attribute Storage Technique)用于透明地在独立的地方保存大的数据库属性,还会自动压缩
- 正则表达式
此外 PostgreSQL 还有大量的附加模块和扩展版本,比如:
- GPL 的用于处理 GIS 对象的 PostGIS
- 使用 PostGIS 的pgRouting 实现的最短路径算法
- 多种不同的主从/主主复制方案
- Slony-I
- pgcluster
- Mammoth replicator
- Bucardo
人物
对 PostgreSQL 做出巨大贡献的人物很多,这里只能摘其一二而为之。
首先是伯克利,作为一个学院,好象不应该进入人物的范畴,但是如果没有 BSD 的优良的学术环境,创造出这样优秀的科学技术成果是不可能的。
然后是 Michael Stonebraker 教授,正是这位学究的开明才能让这样优秀的科技成果走向了公众,并且。
接下来有我们的同胞,Andrew Yu 和 Jolly Chen,他们为 PostgreSQL 走向现代做出了巨大的贡献。
最后是现在正在辛勤耕耘的黑客们,这些黑客以他们执着的精神和高超的技术,为 PostgreSQL的日益完善做出了不可磨灭的贡 献。 黑客总共有数十人之多,我只好把核心成员挑出来介绍一下,而对于贡献了更多代码的其他重要黑客,只好暂且委屈他们一 阵子了,如果有机会,我还会进一步介绍他们。
目前主要贡献者
Tom Lane
- 一位卡耐基梅隆大学(CMU)的电子工程学 ph.D(博士),是 PostgreSQL 的非常重要开发人员,其足迹遍部PostgreSQL 的每一个角落, 可以说对 PostgreSQL 的性能和稳定性以及特性的取舍有极其重要的贡献,在开始参加 PostgreSQL 项目之前,他已经有了十余年的自由软件开发经验, 可以说是老牌的自由软件程序员;
Jan Wieck
- 一位来自德国的黑客,有十余年的数据库开发经验,原先曾经为 SAP 等大型软件厂商工作,后来加入 PostgreSQL 的开发;他也是喜欢大项目, 不过兴趣是用户端的特性,比如外键,一些过程语言比如 pl/pgsql 等,7.1 版本中的 CLOB(文本大对象)的部分也是他的作品。
Bruce Monjian
- 来自美国,是一些文档和项目协调,以及许多完整性约束和 SQL 语法的标准等,比如 OUTER JOIN,同时维护 TODO 列表和 FAQ。
Marc Fournier
- 加拿大黑客,主要的协调人,维护站点,邮件列表,以及发布版本等。
Peter Eisentraut
- 德国/瑞典黑客,主要负责文档编写、完善,认证和权限管理,制作脚本和一些管理配置接口的制定,以及客户端交互工具 psql 等, 其作用日益突出,可以说在 7.2 版本的开发过程中是不可或缺的人物。
另外还有大量来自欧洲,澳洲和亚洲(日本)等地的黑客。实际上,有越来越多的黑客的作用变得日益重要,在邮递列表中每天都 有来自不同黑客的 各种各样的补丁程序。所以,自由软件的特点就是,只要愿意,任何人都可以对它有足够的影响。也就是说, 我们命运是真正掌握在自己手里的。
历史名人
下面是些曾经给 PostgreSQL 做过巨大贡献,但是目前已经退出 PostgreSQL 的活跃开发的黑客:
Thmas Lockhart
- 一位毕业于加洲理工学院的美国黑客,主要负责文档和若干种数据类型(尤其是与时间相关的类型),SQL 语法的标准一致性,时间类型,以及完整性约束等。
Vadim Mikheev
- 一位来自俄国的黑客,其特点是专干大项目,比如 V6.3 里面的子查询,V6.5里面的多版本并行控制,以及 7.1 里面的预写式日志系统等, 可以说是 PostgreSQL 的开拓者;
展望
就目前而言, PostgreSQL 的前景非常好,目前的稳定版本是 7.3,这个版本在 7.2 版本的基础上再次做了大量的改进和提 高。
7.1 是继 6.5 之后的又一个巨大的变化,她首先引入了预写式日志的功能。这样,事务就拥有了完善的日志机制,可以提供更 好的性能, 以及还可以实现更优良的备份和灾难恢复的能力(比如联机热备份和宕机后的自动恢复)。其次是对文本类型的数据 段的长度不再限制, 从而很大程度上解决了 PostgreSQL 的大对象的问题。尤其在如今的 web 应用盛行的环境下,这个功能 几乎立即将 PostgreSQL 摆到了 可以与其他所有类型的数据库竞争的地位。而且在 SQL 标准上又有进一步的提高,比如 OUTER JOIN 的支持等等。
7.2 版本在 7.1 的基础上改进了原来的数据库定期清理工作中排它锁的过程,使数据库维护不再影响数据库的正常使用,同时 增强了查询优化的智能, 使数据库对索引的使用更加准确;同时还消除了每个安装节点的免维护事务次数的限制;国际化;以及 还有大量其他方面的增强。
7.3 版本在 7.2 版本的基础上,继续增强了许多特性,包括可返回结果集的用户函数,模式(schema)的支持,准备好的查 询规划,DROP COLUMN 的支持, 以及vacuum的优化,更好的查询计划器,更好的权限管理系统等。7.3 版本在许多现实项 目中得到了充分的证明和大量的应用。标志着 PostgreSQL 正式成为主流数据库产品之一。
在未来的 7.4 版本中,我们有望可以看到索引空间的重复利用,优化了的 IN 子句(大家不用为 IN 恶劣的性能发愁了),新的 前后端协议,更优的聚集函数。 甚至还可能提供 windows 的本机移植版本和具有相当的热备份功能的 PITR (即时恢复)和很 多人期待已久的表空间的功能。可以说 7.4 将是一个完全胜任 7x24 应用需求的真正的高端数据库,一个具有开拓企业级应用的 数据库。我们有什么理由不欢呼呢?
后记
作为一种数据库管理系统,PostgreSQL 并不象 Linux 与某些商业操作系统相比那样,得到迅速广泛的承认,这一点是可以理解 的,Tom Lan 曾经有一段话说得实在: “首先,商业数据库系统不象某些商业操作系统那样实在太烂,相反,商业数据库系统的 质量还是非常高的,与之相比,PostgreSQL 仍然有一定差距”但同时他也相信 “我们已经达到商业级的数据库系统的质 量......”
的确,自由软件的发展具有跳跃性,因为开发者大多是利用空余时间进行开发,当开发者云集的时候,新的东西可能一下子就增加 上去;而如果在自由软件运动的低潮时, 因为缺少开发人员,所以可能会有一长段时间的沉寂,而后又会随着社会的发展而出现 新的活动。也就是一种螺旋的上升。
因而,我们在面对自由软件的时候,一定要有一点:要相信自己和依靠自己,因为自由软件的发展的确需要每一个爱好者充分发挥 自己的聪明才智, 同时,也只有自由软件给你提供了这样的机会——依靠自己的力量改变自己的命运。最后,也只有这样,自由 软件之光才能真正照耀我们的世界。
附录
参考资料
历史
http://www.daemonnews.org/199907/devhistory.html
http://www.postgresql.org/osdn/history.pdf
http://www.postgresql.org/osdn/tour.pdf
特性
http://www.postgresql.org/idocs/
http://www.pgsqldb.com/pgsqldoc-7.2c/index.html
注释:
本文中黑客一词源于英文 Hacker,是指那些计算机尖子,对计算机及全人类都有贡献的创造者, 不是一般媒体上的“黑客” 概念,那是指 Cracker,也就是破坏者。
作者:何伟平 laser(at)pgsqldb(dot)com
注:如要转载请注明作者和出处 www.pgsqldb.org
[转帖]PostgreSQL 昨天,今天和明天的更多相关文章
- [转帖]PostgreSQL 参数调整(性能优化)
PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...
- js获取日期:昨天今天和明天、后天
<html> <head> <meta http-equiv="Content-Type" content="textml; charset ...
- js获取日期实例之昨天今天和明天、后天
本文介绍了js获取日期的方法,可以获取前天.昨天.今天.明天.后天. 代码: <html> <head> <meta http-equiv="Content-T ...
- js获取日期:昨天今天和明天、后天 [转贴记录]
<html> <head> <meta http-equiv="Content-Type" content="textml; charset ...
- ios 对日期的处理(包括计算昨天时间、明天时间)
NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是不可改变的. 如 ...
- js获取昨天今天和明天
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/30028299 <html> &l ...
- [转帖]PostgreSQL与MySQL比较 From 2010年
PostgreSQL与MySQL比较 [复制链接] http://bbs.chinaunix.net/thread-1688208-1-1.html osdba 稍有积蓄 好友 博客 消息 论坛徽章 ...
- [转帖]PostgreSQL的时间/日期函数使用
PostgreSQL的时间/日期函数使用 https://www.cnblogs.com/mchina/archive/2013/04/15/3010418.html 这个博客的 文章目录比上一个好十 ...
- [转帖]Postgresql的csv日志设置
Postgresql的csv日志设置 2012年06月16日 09:27:00 weixin_34406796 阅读数 24 原文链接:https://my.oschina.net/Kenyon/ ...
随机推荐
- LibreOJ #115. 无源汇有上下界可行流
二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...
- AWS API Gateway Swagger定义
导出Swagger接口定义文件 在AWS API Gateway界面上,可以导出swagger接口定义文件. 而后利用Node js swagger-ui 依赖,生成swagger接口地址 Cloud ...
- ros topic 命令
#查看topic频率rostopic hz /xxx_imu_driver/imu #查看topic信息rostopic info /xxx_imu_driver/imu #查看topic数据rost ...
- matplot 绘制折线图
#coding=utf-8 import matplotlib.pyplot as pltx_data = ['2011','2012','2013','2014','2015','2016','20 ...
- windows2008服务器设置系统启动时程序自动运行
设置windows服务器启动时自动运行程序,而且不需要用户登录,就可以启动 首先准备好,程序的启动脚本文件或运行文件,如:start.bat 通过系统计划任务实现 1.开始----管理工具-----任 ...
- [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...
- bzoj2406 矩阵
我们不妨想一想,这道题目又有\(abs\)又有\(Max\)不是很好算对吧. 所以我们二分答案,考虑怎么\(check\). 对于一个点,显然它能够取的范围是\([l,r]\),接着是对于一行一列都有 ...
- 基于golang的websocket通信实现
代码: https://gitee.com/knox_xzk/websocket
- IIS URL Rewriting and ASP.NET Routing
IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...
- ThinkPhp5 mongodb 使用自定义objectID出错解决
在Tp5中使用mongodb 使用自定义ObjectId时报错:Cannot use object of type MongoDB\\BSON\\ObjectID as array 查询源码发现在to ...