我正在尝试找到管理 postgresql 分区表的最佳方法。我有两个分区表(每天一个分区,基于created_at
两个表上都存在的列),fridge_tagreading
并且fridge_tagantennareading
. 通过复合外键fridge_tagantennareading
进行引用。fridge_tagreading
(tag_reading_id, created_at)
我经常想删除旧分区。为此,我的想法是执行以下操作(例如删除日期为 2024 年 5 月 3 日的数据):
alter table fridge_tagantennareading detach partition fridge_tagantennareading_2024_may_03;
drop table fridge_tagantennareading_2024_may_03;
alter table fridge_tagreading detach partition fridge_tagreading_2024_may_03;
drop table fridge_tagreading_2024_may_03;
前两个查询很有魅力。然而,当运行第三个时,我达到了我的statement_timeout
(当前设置为 10 秒)。看起来检查引用表上的 fk 违规的查询花费了太多时间:
select fk."tag_reading_id", fk."created_at"
from "public"."fridge_tagantennareading" fk
join
"public"."fridge_tagreading_2024_may_03" pk
on (
pk."id" operator(pg_catalog. =) fk."tag_reading_id"
and pk."created_at" operator(pg_catalog. =) fk."created_at"
)
where
(
(pk.created_at is not null)
and (pk.created_at >= '2024-05-03 00:00:00+00'::timestamp with time zone)
and (pk.created_at < '2024-05-04 00:00:00+00'::timestamp with time zone)
)
and (fk."tag_reading_id" is not null and fk."created_at" is not null)
;
我的理解是这个查询花费了太多时间,因为 postgres 检查引用表中的所有分区。我很惊讶 postgres 不会“传播约束”,这将导致仅对引用表的良好分区进行查询(这会非常快)。
这是一个已知的限制吗?遇到这样的情况你会如何处理?到目前为止,我唯一的解决方法似乎是放弃外键约束......
谢谢