gpt4 book ai didi

postgresql - 使用具有重叠约束的 postgres 表分区是否安全?

转载 作者:行者123 更新时间:2023-11-29 11:20:03 28 4
gpt4 key购买 nike

Postgres 文档说表分区中的条件不应重叠

Ensure that the constraints guarantee that there is no overlap between the key values permitted in different partitions.

但我不明白为什么,因为数据必须插入的确切分区仍然由触发器决定,触发器可能知道重叠约束

我有以下情况,一个表有很多文本信息和 update_date 时间戳,这个表是按季度分区的,所有新的或更新的行都进入最新的分区,问题是gin trigram index太慢了,所以我想避免构建当天的trigram index

目前主表上的触发器负责动态创建分区,我打算为当天添加新分区,这将与四分之一分区重叠,我想禁用当天分区的三元索引(将数据合并回四分之一分区将是另一项维护任务)

我已经尝试使用重叠的 update_date 约束手动创建分区表并且 postgres 没有提示,我什至进行了搜索并且两个表都在计划中使用,所以它似乎工作得很好,但文档说约束可以'不重叠,这是为什么?

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

更新:

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 读取年和月的分区并且不太关心它们的重叠

最佳答案

从 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"

这是 complete dbfiddle .

关于postgresql - 使用具有重叠约束的 postgres 表分区是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553966/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com