关于Postgresql 分区表的那些事

       最近一段时间做的项目DB用的都是postgresql, 相对于oracle来说已经够悲催了,更悲催的是使用了postgresql的分区表,哎呀妈呀,所以说老话说的好:没有最悲催只有更悲催!好了,废话不说,言归正传。

       Postgresql的分区表使用确实很麻烦。它没有像oracle一样将大量的细节屏蔽,对使用者透明。Postgrsql的分区表暴露了大量的技术细节,这些细节都需要程序员进行维护,但正因为这一点,我们可以了解到分区表的实现细节,也算有点补偿。

       Postgresql 分区表是通过一个概念: 继承 来实现的。以一个employer的表为例吧,将它做成分区表(以入职时间分区)。 首先需要一个父表: employer ,若干字表: employer_2010, employer_2011. 这两个字表是继承自父表的使用INHERITS关键字。所有字段都跟父表相同。 从这一点很棒但是悲催的是父表的约束是无法被继承的,这是什么意思呢? 我很悲催的告诉你: 所有字表的PK和index都要自己建立,明白了吗,自己建立!!,有多少分区就要建立多少次,悲催啊。好吧,这些我忍了,到了这一步细心的人可能要发问了,那记录的插入呢,如何自动选择正确的字表呢?比如说入职时间是2011年的记录要进入employer _2011字表。 我再次悲催的告诉你们,这个也好自己handle的。这个在postgresql中叫做一条RULE,在这里类似trigger,就是说一条记录来了我先check下它的入职时间这个字段,发现时2011年的那就插入字表employer _2011。这个是要程序员写的大哥啊。一个RULE类似于下面的代码:

CREATE RULE ruleName AS
            ON INSERT TO employer WHERE
            ( date_trunc( ''year'', time_stamp) = "2011")
            DO INSTEAD
            INSERT INTO employer_2011 VALUES (columnValue1,columnValue2...)

可怕吧!

       另外要说明的是分区时不能自己创建的,如刀2012年了,应该有一个employer_2012的字表,否则数据是差不进去的。这个貌似oracle也不能cover,但是在postgresql中药恐怖的多,想想吧,要自动增减分区你需要完成多少工作,看看这件提到的步骤吧,悲催的我居然还实现了这个功能!

       最后说说最近遇到的一个问题吧:我的程序alter了一个分区表,增加了一个字段,但是新增加的那个column一直不能插进去值,也不报错,但就是没有值。很叫人恼火,最后终于发现是RULE没有改,请注意上面标红的代码,VALUES后面的括号中是要列出所有的字段的,当我alert 表增加新的字段后,这个rule并没有自动的也添加新增的字段,就导致新加字段value进不去,牛逼吧,啥也不说了。 最后奉劝大家使用postgreql分区表须谨慎慎啊!!好了睡觉去啦!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PostgreSQL 支持分区表,它允许将表数据根据特定的条件拆分成多个子表,从而提高查询性能和管理数据。下面是一些关于 PostgreSQL 分区表的基本信息: 1. 分区表定义:在创建表时,可以使用 PARTITION BY 子句指定分区键。常见的分区键类型包括范围(range)、列表(list)和哈希(hash)。 2. 范围分区(Range partitioning):根据某个列的值范围进行分区,例如按时间范围、按数值范围等。可以使用 CREATE TABLE 语句的 PARTITION OF 子句定义每个分区。 3. 列表分区(List partitioning):根据某个列的值列表进行分区,例如按地区、按部门等。也可以使用 CREATE TABLE 语句的 PARTITION OF 子句定义每个分区。 4. 哈希分区(Hash partitioning):根据某个列的哈希值进行分区,通常用于数据平均分布的场景。使用 CREATE TABLE 语句的 PARTITION OF 子句定义每个分区。 5. 分区表管理:分区表可以通过 ALTER TABLE 添加或删除分区。还可以使用 EXCHANGE PARTITION 子句将数据从非分区表或已有分区中交换进入分区表。 6. 查询优化:PostgreSQL 的查询优化器会在执行查询时自动识别并只查询相关分区,从而提高查询性能。同时,可以通过查询约束来进一步减少查询的分区范围。 需要注意的是,分区表在数据库中的使用需要根据具体的业务需求和数据特点来决定,同时需要合理设计和规划分区键,以及考虑数据维护和查询优化等方面的因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值