分区表上的主键和FK约束



我有两个超过1000万行的表。

create table TBL1 (
GUID       UUID                 not null default gen_random_uuid(),
DT         DATE                 not null,
...
constraint tbl1_pk primary key (GUID, DT)
)
partition by RANGE (dt);
create table TBL2 (
GUID       UUID                 not null default gen_random_uuid(),
DT         DATE                 not null,
TBL1_GUID  UUID                 not null,
...
constraint tbl2_pk primary key (GUID, DT)
)
PARTITION BY RANGE (dt);
alter table TBL2
add constraint FK_TBL2__TBL1 foreign key (DT, TBL1_GUID)
references TBL1 (DT, GUID)
on delete restrict on update restrict;

每个表按月有24个分区。

主键中的顺序列重要吗?外键中的顺序列重要吗?我是否需要为每个分区创建fk,而不是在每个表上创建fk ?查询运行缓慢

查询运行缓慢

我不能评论你运行缓慢的查询,因为你没有包括查询和它们的EXPLAIN (ANALYZE, BUFFERS)输出。

但我有几个建议给你:

  • 不要在(guid, dt)上定义主键。相反,只在guid上为每个分区定义一个主键。这更接近于您实际想要的:guid上的全局唯一约束。

  • 不要定义指向分区表的外键,因为它们会阻止您卸载所引用表的分区。相反,在相应的分区之间定义外键约束。

  • 如果你计划在公共分区键guid上连接,将enable_partitionwise_join设置为on,这样PostgreSQL在分区级上连接,通常会执行得更好。

相关内容

  • 没有找到相关文章

最新更新