Postgres文档说表格分区中的条件不应重叠
确保约束保证两者之间没有重叠 不同分区中允许的关键值。
但我不明白为什么,因为必须插入数据的确切分区仍然由触发器决定,触发器可能知道重叠约束
我有以下情况,一个包含大量文本信息和update_date时间戳的表,此表按季度分区,所有新行或更新行都进入最新分区, 问题是杜松子酒三元组索引太慢,所以我想避免为当天构建三元组索引
主表上的当前触发器负责动态创建分区,我计划在当天添加新分区,这将与季度分区重叠,我想禁用当天的trigram索引分区(将数据合并回季度分区将是另一项维护任务)
我尝试使用重叠的update_date约束手动创建分区表,postgres没有抱怨,我甚至进行了搜索,并且两个表都在计划中使用,所以它似乎工作正常,但文档说约束不能重叠,为什么会这样?
如果我有适当的触发器和维护,创建具有重叠约束的分区是否安全?
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读取了年份和月份的分数,并不关心他们的重叠
答案 0 :(得分:0)
我想你可以做到。该文档只是将分区的概念解释为表继承的私有情况。您的应用程序中可以有不同的实现。例如,您可以创建分区并决定从代码中使用哪个分区而不使用db本身中的触发器。在这种情况下,db中的这些检查是一种安全措施。
答案 1 :(得分:0)
从PostgreSQL 11开始,有一个简单的答案:
它不会让您这样做。
create table tbl_partitioned (
part_id int primary key
) partition by range (part_id);
create table tbl_partition_1_to_5 partition of tbl_partitioned for values from (1) to (5);
create table tbl_partition_4_to_9 partition of tbl_partitioned for values from (4) to (9);
-- ERROR: partition "tbl_partition_4_to_9" would overlap partition "tbl_partition_1_to_5"