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进程来回收空间。
一.进程结构
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进程来回收空间。
相关文章推荐
- Postgres 与Oracle对比(服务进程崩溃)
- DB2和 Oracle的并发控制(锁)比较
- oracle体系结构-进程结构 概述
- DB2和 Oracle的并发控制(锁)比较
- Oracle--数据库体系结构(物理结构、逻辑结构、内存结构及进程)
- DB2和 Oracle的并发控制(锁)的比较
- Oracle体系结构之-Oracle后台进程
- DBA_Oracle基本体系内存和进程结构(概念)
- 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
- oracle:Oracle查看和修改连接数(进程/会话/并发等等)
- oracle 控制结构
- 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
- Oracle Process Architecture - Oracle 进程结构篇1
- Oracle:PL/SQL--流程控制(三)——循环结构:loop、while-loop、for-loop
- DB2和Oracle的并发控制(锁)比较
- oracle物理结构(一)--控制文件
- Oracle体系结构:内存结构和进程结构
- Linux Shell多进程并发以及并发数控制
- Oracle结构-实例的进程结构
- oracle之物理数据库结构概述(数据文件、重做日志文件,控制文件等各种数据库文件)