PostgreSQL和oracle表分区对比

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE        PostgreSQL 是开源数据库,完全免费, oracle 是有强大厂商支持和维护的数据库,把这两个的表分区特性放在一起对比,似乎有些勉强。但对于我们多了解一些特性,在实际开发中可以更好地进行理性选择和快速入手。

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEPostgreSQL   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE说明
 概念   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE把逻辑上的一个大表分割成物理上的几块 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上)   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE在概念上,两者是一致的。分区表对外部用户可以说是透明的,都是单个数据表的形态呈现,可以不用了解具体的存储方式。
 作用   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE提高性能 增加系统的可用性   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE表分区的作用对两者来说基本是一样的,都是为了性能上的优化,提高可用性。
 原理 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE基于表继承的特性来进行分区实现,有父表和子表。 Pgsql的分区表其实是一个个的真实的数据表,在pg_tables中可以查询到分区的数据表名字。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE只有一个大表存在。每个分区都属于这个大表,但每个分区都是单独的segment,如果查询限制了分区键值,那么查询只落在特定的segment,可以减少数据的访问   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle没有继承的概念,分区表的实现是由oracle自身的存储机制实现的,不需要过多的数据表定义。
 使用时机   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE大表的数据量很大,并有明显的可分区字段。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE1、表的大小超过2GB 2、表中包含历史数据,新的数据被增加到新的分区中。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE在单表的数据量大,并不是所有的数据都是热点数据时,可考虑分区表。但不能一概而论,需要对具体的应用进行仔细分析,并不是说用了分区表性能就能够得到提升。
 创建方式   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE分区类型有范围分区、列表分区等。较常用的是范围分区。在创建分区表时比较复杂,需要经过:

1、  创建父表;

2、  创建子表,用父表上继承,用关键字INHERITS

3、  给子表增加约束check

4、  基于分区键值创建索引;

定义一个规则,把对主表的修改重定向到适当的分区表。
  Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE分区类型较多,有范围分区、列表分区、散列分区、复合分区等,最常用的是范围分区。在创建分区表时,比较简单: create table时,就直接创建为分区表create table xx() partition by range(sysdate)   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle的分区表创建很简单,只要把表直接建为分区表就ok,减少了很多工作量。在这一方面oracle完胜。
 索引   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEPgsql的分区数据表是一个个独立存在的表,需要为每一个分区子表建立索引,所以一个逻辑上的大表会有很多索引。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE分区表可使用的索引类型较多,在范围分区的前提下,性能比较好的是局部前缀索引。针对数据表建立此索引,用一个语句就可以搞定,新建的分区表都会自动应用索引,一劳永逸。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle分区表的索引应用方式简单,在创建时建立一次就ok。其实,这都是因为分区机制的不同,pgsql的分区表其实是一个个的单独的数据表。
 DML   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE需要设定SET constraint_exclusion = on;才可以是DML操作对使用者透明。并,在进行copy命令时,需要指明要copy到哪个分区子表中。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEDML操作对使用者来说是透明的,只要操作的过滤条件中包含分区键值,就可以直接定位到具体的分区表。也可以显式的写明从哪个分区表中进行操作。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE对DML操作来说,oracle是完全透明的,自动定位到了分区表,减少了使用人员的参与。
  Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE已有表转化为分区表   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE数据库不提供自动转换的机制   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle可以用在线重定义的方式进行转换。不过,既然要转换为分区表,可预计原表的数据量是比较大的,在转换时需要时间很长,对在线设备来说,也不是很合适。   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEOracle自身的方式优势不明显。这两种数据库都可以用原表导出,再导入到分区表的方式进行,从实际运行来看,所用时间可以接受。
  Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE存储策略   Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE都可以在存储过程中,对分区表进行动态创建和管理,提高了分区表的可用性。在存储过程写好后,后期都不需要经常维护。

总结,数据库的表分区特性优点很多,比如:
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 1 、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

5将很少用的数据可以移动到便宜的、慢一些地存储介质上。

这两种数据库的分区表都具有这些优点。

对比来说,Oracle的分区创建和管理更加方便,很多工作是由oracle的内部机制来实现的。postgreSQL的分区表其实是一个个实际存在的数据表,分区的创建和管理都需要我们用语言来控制,增加了应用人员的工作量。

但,由于oracle自身的“侵占式”硬盘存储,对过期数据进行清除时,即便是drop分区表,也不能直接释放硬盘空间,属于“占了就占了”,这个管理起来就比较麻烦,除非对每个分区表都建立各个独立的tablespace,放在独立的物理文件上,删除过期分区表时,可以同时drop tablespace including contents。而postgreSQLtruncate 分区表时,可以直接释放硬盘,会看到硬盘使用率下降了,这一点对硬盘资源紧张时,就非常好了。

两种数据库的分区表使用,各有利弊,但总的来说,比较偏向postgreSQL,毕竟硬盘有限。而且,oracle收费。

Ps,在数据量很大时,任何关系型数据库都有性能上的瓶颈,不属于我们这两种数据库分区表对比的范围了。


转载于:http://blog.itpub.net/9521459/viewspace-759634/

你可能感兴趣的:(PostgreSQL和oracle表分区对比)