PostgreSQL系统概述_PG数据库内核分析学习笔记

PostgreSQL系统概述_PG数据库内核分析学习笔记

PG简介和发展历程

PG以一种先进的对象-关系数据库管理系统(ORDBMS), 它不仅支持关系数据库的各种功能, 而且还具备类, 继承等对象数据库的特征.
它是目前功能最强大, 特性最丰富的和结构最复杂的开源数据库管理系统, 其中有些特性甚至连商业数据库都不具备.

什么是对象数据库?

面向对象数据库系统(OODBS)支持定义和操作OODB,应满足两个标准:首先它是数据库系统,其次它也是面向对象系统。第一个标准即作为数据库系统应具备的能力(持久性、事务管理、并发控制、恢复、查询、版本管理、完整性、安全性)。第二个标准就是要求面向对象数据库充分支持完整的面向对象(OO)概念和控制机制。

面向对象数据库和关系数据库的区别?

以关系数据库为例,SQL语言是一种非过程化的面向集合的语言,它虽然用起来非常简单,但由于是解释实现,效率不如人意。因此许多应用仍然是由高级程序设计语言(如C)来实现的,但是高级程序设计语言是过程化的,而且是面向单个数据的,这使得SQL与它之间存在着不匹配,我们把它叫做“阻抗失配”。不论你是用嵌入式SQL,还是CLI,都需要化很多工夫去完成两种语言之间的相互转化。 但是关系数据库在数据库系统方面发展地非常完善,有强大的管理功能和可操纵性。另外,关系模型具有坚实的数学基础。
面向对象数据库的产生主要是为了解决“阻抗失配”,它强调高级程序设计语言与数据库的无缝连接。什么叫无缝连接,假设你 不用数据库,用C语言编了一个程序,你可以不需要(或基本不需要)任何改动就将它作用于数据库,即你可以用C语言透明访问数据库,就好象数据库根本不存在一样,所以也有人把面向对象数据库理解为语言的持久化。怎么样,听起来挺玄的吧,可是我们自己开发的数据库系统——OSCAR早就做到了这一点。 由于实现了无缝连接,使得面向对象数据库能够支持非常复杂的数据模型,从而特别适用于工程设计领域。打个比方,想象CAD中的一个复杂部件,它可能由成千上万个不同的零件组成,要是用关系模型中的表来表达,得用多少张表啊?而描述这种复杂的部件,正好是高级程序设计语言的强项。
此外,面向对象数据库还吸收了面向对象程序设计语言的思想,如支持类、方法、继承等概念。 面向对象数据库很好地解决了阻抗失配的问题,但它也有缺点。它的缺点正好是关系数据库的强项,由于模型较为复杂(而且缺乏数学基础),使得很多系统管理功能难以实现(如权限管理),也不具备SQL处理集合数据的强大能力。
另一方面,随着多媒体数据的大量出现和应用的日益复杂,关系数据库也在不断吸收面向对象数据库的优点,出现了现在所谓的对象关系型数据库(象ORACLE8i、DB2-5以上都是这种系统)。其主要改进包括支持自定义类型(UDT),方法,继承(目前仅DB2-6支持),和引用(使得对象间可以直接引用,想想原来的关系数据库需要靠连接来实现引用,性能真是惨不忍睹)。 总之,数据库系统发展的趋势是,面向对象数据库和关系数据库将不断融合。而对象关系数据库由于继承了上述两者的优点,已经成为目前数据库发展的主流。

Oracle和MySQL、PostgreSQL特性对比

Oracle与PostGreSQL的差异对比

PostgreSQL与MySQL比较

PostgreSQL简介及发展历程

PG的特性

PG是一种几乎可以运行在各种平台上的免费的开放源码的对象关系数据库管理系统, 拥有与企业级数据库相媲美的特性, 如完善的SQL标准支持, 多版本并发控制(MVCC), 时间点恢复(PITR), 表空间机制, 异步复制, 嵌套事务, 在线(online)/热备份, 一个复杂的查询优化器, 预写式(WAL)日志容错技术.
PG在管理大数据量方面有良好的可扩展性, 对并发用户管理具有自适应性.
现在已经出现具有管理超过4万亿字节数据能力的使用版本产品.

PG的应用

  1. Sony在线娱乐网站

Sony在线娱乐网站(SOE)经营着很多知名游戏, 因此其数据库需要快速处理大量的用户数据, 其原有数据库系统为几十个Oracle 9i RAC集群. SOE分析业务后发现, Oracle数据库过于昂贵, 且许可证限制过多, 缺乏灵活性, 最终SOE将其数据库系统转换为稳定, 可扩展, 高性能的使用PG技术的EnterpriseDB数据库.

Enterprise DB是提供基于PostgreSQL的企业级产品与服务厂商之一。

  1. Hi5社交网站

Hi5从2003发展开始已经成为世界上最大的社交网站之一, 有超过200个国家的八千万注册用户, 每个月用户访问量超过5600万, 是在Alexa全球排名前20的网站; Hi5拥有一个运行在几百万台服务器节点上的商业PG OLTP集群, 这也是世界上最大的PG集群, 运行着Hi5社交网络的所有服务, 包括用户数据, 配置信息, 图片, 评论等数据, 并提供高效的检索. 另外, FortiusOne, Florists’Transworld Delivery, NNT等公司都选择廉价而高效的PG作为其数据管理基础设施, 取得了良好的应用效果.

  1. PG的国内的应用情况(知乎回答)

总的份额现在还不算非常大,不过上升挺快的。第一,因为授权友善,代码质量高,现在很多高校都用PostgreSQL为原型做数据库工程的研究项目。第二,现在的云主机厂商越来越多的提供PostgreSQL数据源。第三,PostgreSQL比MySQL易用性好多了。这个居然还有人觉得MySQL占优势……我就说一句,我从2000年入行到现在,西方哪个流行的数据库我没用过?第四,企业自己维护的PostgreSQL数据库越来越多,因为基础运维环境在不断发展,现在像我们这种创业企业用PostgreSQL比以前方便多了。PostgreSQL可以一站式实现几乎所有的数据库服务需求,这对于新创企业是非常有诱惑力的。第五,大企业的OLAP需求,越来越多的在用PG,前年鹅厂的同行介绍他们有一个70PB的PostgreSQL集群,现在的规模肯定更大多了。阿里、百度、华为这几年对这个领域投入都在上升。第六,Greenplum开源,在今年会对PostgreSQL的发展有很大推动,这是业界非常有名的分布式数据库集群技术,基于PostgreSQL。

PG代码结构

初始化部分(Initialization)

bootstrap:用于支持Bootstrap运行模式, 该模式主要用来创建初始的模板数据库. 和系统表相关。
main:主程序模块, 它负责将控制权转到Postmaster进程. 即传递参数到后台的pg进程。
postmaster:监听用户请求的守护进程, 并控制Postgres进程的启动和终止. 即, 控制pg服务开关,创建共享内存,循环等待连接并分配服务。
libpq:C/C++的库函数, 处理与客户端间的通信, 几乎所有的模块都依赖它.即, 与子进程通讯相关的库。

查询部分(Main Query Flow)

tcop:traffic cop(交警),Postgres服务进程的主要处理部分, 它调用Parser, Optimizer, Executor, 和 Commands中的函数来执行客户端提交的查询. 即分配请求到对应模块如解析器、优化器、执行器和命令行功能。
parser:编译器, 将SQL查询转化为内部查询树. 即把sql语句转化成查询执行树。
rewrite:查询重写, 根据规则系统对查询进行重写. 即规则和视图支持部分。
optimizer:优化器, 根据查询树创建最优化的查询路径和查询计划. 即优化查询路径生成计划。
optimizer_path:生成所有可能的路径,检查表连接顺序,where条件限制,优化表的统计信息,对于可执行的计划评估开销。
optimizer_geqo:遗传(或者是祖传?)查询优化器评估的路径对于要连接的表,当表的数量很少时会给很优化的结果,表太大就直接给一个一般的,可以通过参数控制是否使用这个功能。
optimizer_plan:拿着“optimizer_path”的结果输出最小开销的路径。
optimizer_prep:处理特殊的查询计划。
optimizer_util:优化支持部分。
executor:执行复杂的计划包括,增删改查。算子举例:堆扫描、索引扫描、排序、连接、聚合、分组、去重等。

指令支持(Command Support)

commands:响应指令,以及简单的功能如vacuum、create table直接在元数据(catalog)上面做了。
catalog:元数据,直接操作系统表和目录,如索引、表、存储过程、操作符等。
access:大量的数据访问函数,如索引访问、堆访问、和事务日志。
access_common:通用访问方法。
access_gin:索引相关访问。
access_gist:搜索树相关访问。
access_hash:哈希相关访问方法。
access_heap:存储数据行。
access_index:被索引类型使用。
access_nbtree:Lehman和Yao的B树管理算法。
access_spgist:空间分片的全局特征信息相关访问。(GiST)
access_transam:事务管理,如日志读写。(BEGIN/ABORT/COMMIT)
nodes:关于SQL查询的创建或者操作叫做节点,节点一般都有类型和特殊的数据结构,节点间经常被放在链表里。
storage:管理大量存储系统,提供统一后台访问。
storage_buffer:共享缓存管理。
storage_file:文件管理。
storage_freespace:剩余空间映射表。
storage_ipc:信号量和共享内存。
storage_large_object:超大对象。
storage_lmgr:锁管理。
storage_page:页管理。
storage_smgr:磁盘和存储设备管理。
utils:工具类。
utils_adt:包含所有PG中内建数据类型(如bool、char、date)。
utils_cache:因为PG支持很多随意数据类型,后台系统需要查询一个系统表关于这些随意类型时会先走这个缓存。
utils_error:错误反馈,从后端反馈到前端去。
utils_fmgr:函数管理,处理动态绑定的函数调用,和系统表中定义的函数调用。
utils_hash:哈希函数管理,被缓存和内存管理器使用以做快速查询动态数据存储结构。
utils_init:大量初始化。
utils_mb:单字节和多字节的编码。
utils_misc:冗余的东西(官方叫miscellaneous stuff)
utils_mmgr:内存管理(PG进程本地)。
utils_resowner:资源拥有者追溯。
utils_sort:排序工具,如对元祖排序。
utils_time:事务时间,与mvcc有关,判断一个元祖是过期了还是未提交。

基础支持(Support Facilities)

include:引用的文件。
lib:支持的库,有二插堆,布隆过滤器。
port:兼容性部分。
regex:正则表达式。
snowball:语法库,雪球是一个语法库,各国语言的规范都有。
replication:通过日志迁移支持流式备份。
tsearch:文本查询库用于支持全文查询。

参考

<PG数据库内核分析> 1 PostSQL系统概述
小麦带你看postgres(代码模块结构)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章