postgresql继承方式实现分区

在postgresql中,分区是通过继承的方式来实现的,每个分区实际上都是一个独立的表。数据更新可通过trigger或者规则rule来实现。

对数据表进行分区的一个简单原则就是,当表的大小超过了数据库服务器的物理内存大小时使用分区。

需要注意的几个点:

1、分区表并不能完全的继承父表的所有属性,比如唯一约束、主键、外键。而检查约束与非空约束是可以继承的。

2、修改父表的结构,子表结构同时被修改。

3、reindex、vacuum命令不会影响到子表。

4、不要在父表上定义检查约束,除非你想约束所有分区。

5、不要在父表上创建索引和或唯一约束,因为没有任何意义。应该在每个分区上分别创建。


分区的一些好处:

1、便于管理,如按月分区,若想删除历史数据,可以直接删除对应分区。避免delete大量数据时导致vacuum超载。

2、可以提升某些查询的性能。比如查询的数据正好在某一个或少数几个分区中时,使用率较高的分区表的索引可能会完全缓存到内存中,这样查询效率会很高。

       所以合理的分区方案,能够为应用带来较高的性能提升。

3、查询或更新一个分区的大部分记录时,连续扫描这个分区而不是使用索引离散的访问整个表,可以获得巨大的性能提升。

4、对于不常用的历史数据,可以利用表空间 技术移动到便宜一些的慢速存储介质上。

触发器与规则创建分区的比对:

1、在批量插入的情况下,规则的效率更高,因为只有一次开销。

2、copy方式插入数据,是不会触发规则的,因此需要直接将数据copy到分区表。copy可以触发触发器,但是效率会比直接copy低,因为for each row的触发器只能一条一       条记录的insert,入库性能自然就低了。

对于分区表的一个重要查询优化技巧:

打开约束排除(constraint_exclusioon)。同时在每个分区上创建合适的约束(check)。

比如,按月分区的表,每个分区约束只能插入当月的数据,那么在查询的时候,会将where子句的过滤条件与check进行比对,只能的跳过不需要扫描的分区。查询性能自 然提高。

你可能感兴趣的:(postgresql)