使用具有重叠约束的postgres表分区安全吗?

问题描述:

Postgres的文件说,在表分区的条件不应重叠使用具有重叠约束的postgres表分区安全吗?

确保约束保证有不同的分区里 键值之间没有重叠。

,但我不明白为什么,因为确切的分区数据已经被插入到仍然被触发决定,这可能是知道的重叠限制

我有以下的情况,与表大量的文本信息和update_date时间戳,这个表按季度分区,所有新的或更新的行进入最新的分区, 问题在于gin trigram索引太慢,所以我想避免构建trigram索引当前日期

当前在主表上触发负责创建parti我打算在当天添加新的分区,这将与四分区重叠,并且我想要禁用当前分区的trigram索引(将数据合并回四分区将是另一个维护任务)

我试过用重叠的update_date约束手动创建分区表,并且postgres没有抱怨,我甚至没有搜索,并且两个表都用在了这个计划中,所以它似乎工作得很好,但是文档说约束可以' t重叠,为什么呢?

如果我有适当的触发器和维护,是否可以安全地创建具有重叠约束的分区?

UPD:

CREATE TABLE master (text_value text, update_date timestamp); 

CREATE TABLE partition_year (
    CHECK (update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31') 
) INHERITS (master); 

CREATE TABLE partition_month (
    CHECK (update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01') 
) INHERITS (master); 

-- in production this would be handled by trigger 
insert into partition_year(text_value, update_date) values ('year', '2015-01-02'); 
insert into partition_month(text_value, update_date) values ('month', '2015-07-02'); 

-- this scans only year partition 
explain select * from master where update_date = '2015-01-02'; 

-- this scans both year and month partition 
explain select * from master where update_date = '2015-07-02'; 

这个例子表明,Postgres的同时读取年份和月份partititon,不那么在意它们的重叠

+1

非常有趣的问题。我不确定。约束排除可用于选择多个表满足约束条件的多个表,因此我同样不太清楚为什么应用此限制。但是,请注意,PostgreSQL将选择扫描所有存在重叠的分区。 –

我想你可以做到这一点。文档只是将分区的概念解释为表继承的私有案例。在你的应用程序中可以有不同的实现。例如,您可以制作分区,并决定在代码中插入哪个分区,而不使用分区本身的触发器。在这种情况下,数据库中的这些检查是一种安全措施。