postgresql 已分区表上的主键和FK约束

y4ekin9u  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(1)|浏览(162)

我有两个表,有超过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,而不是在hole表上?查询运行缓慢。
查询运行缓慢。

yr9zkbsy

yr9zkbsy1#

我不能评论你运行缓慢的查询,因为你没有包括查询,也没有他们的EXPLAIN (ANALYZE, BUFFERS)输出。
但我有几个建议给你:

  • 不要在(guid, dt)上定义主键。相反,为每个分区单独在guid上定义主键。这更接近您实际想要的:guid上的全局唯一约束。
  • 不要定义指向已分区表的外键,因为它们会阻止您分离被引用表的分区。相反,应在相应的分区之间定义外键约束。
  • 如果您计划在公共分区键guid上进行连接,请将enable_partitionwise_join设置为on,以便PostgreSQL在分区级别上进行连接,这通常会执行得更好。

相关问题