使用具有重叠约束的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,不那么在意它们的重叠
答
我想你可以做到这一点。文档只是将分区的概念解释为表继承的私有案例。在你的应用程序中可以有不同的实现。例如,您可以制作分区,并决定在代码中插入哪个分区,而不使用分区本身的触发器。在这种情况下,数据库中的这些检查是一种安全措施。
非常有趣的问题。我不确定。约束排除可用于选择多个表满足约束条件的多个表,因此我同样不太清楚为什么应用此限制。但是,请注意,PostgreSQL将选择扫描所有存在重叠的分区。 –