您的位置:首页 > 数据库 > Oracle

Postgres 与Oracle对比(进程结构与并发控制)

2008-09-25 12:52 393 查看
Postgres 与Oracle对比(进程结构与并发控制)

一.进程结构

Postgres中主要有以下几种进程:

postmaster, postgres, vacuum, bgwriter, pgarch, walwriter, pgstat

(1)postmaster
负责在启动数据库的时候创建共享内存并初始化各种内部数据结构,如锁表,数据库缓冲区等,该进程在数据库中只有一个。
在数据库启动以后负责监听用户请求,创建postgres进程来为用户服务。这一点与Oracle的TNS listener进程类似。

(2)postgres
负责执行用户发出的所有SQL语句,该进程在数据库中可能有多个, Oracle中叫shadow process。

(3)vacuum
负责清除数据库中无用的历史数据(已经被删除或更新的记录)。
更新优化器的统计信息,确保产生可以接受的查询计划,该进程在数据库可能有多个,
Oracle无此种类型进程。

(4)bgwriter
负责将数据缓冲区中已被更新的数据库写入数据库物理数据文件中, Oracle中对应的进程叫DBWR, 该进程在数据库中只有一个。

(5)pgarch
负责将系统产生的redo log复制到其他外部存储介质中, Oracle中对应的进程叫Archiver,该进程在数据库中只有一个。

(6)walwriter
负责将系统产生的redo log 写到redo log 文件中(在pg_xlog目录下), Oracle中对应的进程叫LGWR,该进程在数据库中只有一个。

(7)pgstat
负责收集数据库运行中的统计信息,如一个表上面进行了多少次插入与更新操作,该进程在数据库中只有一个, Oracle无此种类型进程。

二.并发控制

Postgres用的是多版本并发控制机制(Multiversion concurrency control, Concurrency Control in Distributed Database Systems by Philip Bernstein and Nathan Goodman,1981),如果有兴趣,可以区看原始论文,Oracle使用的也是多版本并发控制机制。它的特点在于读操作在数据库中不会产生锁,按Oracle的说法就是读不影响写,写不影响读。只有在两个或多个事务试图同时更新同一条记录时才会有等待出现。

Postgres的实现与Oracle 是不同的,数据库当前数据与历史数据位于同样存储结构中,事务通过每条记录的tmin于tmax系统属性来判断当前记录是否对自己可见,当一条记录被删除或更新时,不会立即从数据库中被除去,因为可能有正在运行的事务需要它,以后系统会通过vacuum进程来回收这些记录占有的存储空间。

Oracle数据库中只存储数据库的当前数据,当一个事务需要读取历史数据时,通过将undo 表空间的undo记录应用到当前数据上,恢复出历史数据。

Oracle的并发控制机制与Postgres的最大不同在于,Oracle数据库的历史数据是通过Undo表空间中的数据计算出来的,清除Undo表空间中的数据就除去了历史数据,所以它不要vacuum进程来回收空间。而Postgres则没有计算这个步骤,历史数据就直接存储在数据库中,但它需要一个vacuum进程来回收空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息