PostgreSQL与oracle或InnoDB的多版本实现最大的差别在于最新版本和汗青版本是否分别存储,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分别了数据,索引本身没有分隔。
PostgreSQL的首要上风在于:
1. PostgreSQL没有回滚段,而oracle与innodb有回滚段,oracle与Innodb都有回滚段。对于oracle与Innodb来说,回滚段是很是首要的,回滚段破坏,会导致数据丧失,甚至数据库无法启动的严重题目。另因为PostgreSQL没有回滚段,旧数据都是记录在本来的文件中,所以当数据库异常crash后,恢复时,不会象oracle与Innodb数据库那样进行那么错杂的恢复,因为oracle与Innodb恢复时同步须要redo和undo。所以PostgreSQL数据库在呈现异常crash后,数据库起不来的几率要比oracle和mysql小一些。
2. 因为旧的数据是直接记录在数据文件中,而不是回滚段中,所以不会象oracle那样经常报ora-01555错误。
3. 回滚可以很快完成,因为回滚并不删除数据,而oracle与Innodb,回滚时很错杂,在事务回滚时必须清理该事务所进行的批改,插入的记录要删除,更新的记录要更新回来(见row_undo函数),同时回滚的过程也会再次产生多量的redo日记。
4. WAL日记要比oracle和Innodb简单,对于oracle不仅须要记录数据文件的变更,还要记录回滚段的变更。
PostgreSQL的多版本的首要劣势在于:
1、最新版本和汗青版本不分别存储,导致清理老旧版本须要作更多的扫描,价搏斗劲大,但一般的数据库都有岑岭期,若是我们公道安排VACUUM,这也不是很大的题目,并且在PostgreSQL9.0中VACUUM进一步被加强了。
2、因为索引中完全没有版本信息,不克不及实现Coverage index scan,即查询只扫描索引,直接从索引中返回所需的属性,还须要接见表。而oracle与Innodb则可以;
过程模式与线程模式的对比
PostgreSQL和oracle是过程模式,MySQL是线程模式。
过程模式对多CPU哄骗率斗劲高。
过程模式共享数据须要用到共享内存,而线程模式数据本身就是在过程空间内都是共享的,不合线程接见只须要把握好线程之间的同步。
线程模式对资料消费斗劲少。
所以MySQL能支撑远比oracle多的更多的连接。
对于PostgreSQL的来说,若是不应用连接池软件,也存在这个题目,但PostgreSQL中有优良的连接池软件软件,如pgbouncer和pgpool,所以经由过程连接池也可以支撑很多的连接。
堆表与索引组织表的的对比
Oracle支撑堆表,也支撑索引组织表
PostgreSQL只支撑堆表,不支撑索引组织表
Innodb只支撑索引组织表
索引组织表的上风:
表内的数据就是按索引的体式格式组织,数据是有序的,若是数据都是按主键来接见,那么接见数据斗劲快。而堆表,按主键接见数据时,是须要先按主键索引找到数据的物理地位。
索引组织表的劣势:
索引组织表中上再加其它的索引时,其它的索引记录的数据地位不再是物理地位,而是主键值,所以对于索引组织表来说,主键的值不克不及太大,不然占用的空间斗劲大。
对于索引组织表来说,若是每次在中心插入数据,可能会导致索引割据,索引割据会大大降落插入的机能。所以对于应用innodb来说,我们一般最好让主键是一个无意义的序列,如许插入每次都产生在最后,以避免这个题目。
因为索引组织表是按一个索引树,一般它接见数据块必须按数据块之间的关系进行接见,而不是按物理块的接见数据的,所以当做全表扫描时要比堆表慢很多,这可能在OLTP中不明显,但在数据仓库的应用中可能是一个题目。
PostgreSQL9.0中的特点功能:
PostgreSQL中的Hot Standby功能
也就是standby在应用日记同步时,还可以供给只读办事,这对做读写分别很有效。这个功能是oracle11g才有的功能。
PostgreSQL异步提交(Asynchronous Commit)的功能:
这个功能oracle中也是到oracle11g R2才有的功能。因为在很多应用处景中,当宕机时是容许丧失少量数据的,这个功能在如许的场景中就希罕合适。在PostgreSQL9.0中把synchronous_commit设置为false就打开了这个功能。须要重视的是,固然设置为了异步提交,当主机宕机时,PostgreSQL只会丧失少量数据,异步提交并不会导致数据破坏而数据库起不来的景象。MySQL中没有据说过有这个功能。
PostgreSQL中索引的特点功能:
PostgreSQL中可以有项目组索引,也就是只能表中的项目组数据做索引,create index 可以带where 前提。同时PostgreSQL中的索引可以反向扫描,所以在PostgreSQL中可以不必建专门的降序索引了。
--转自