我有两个超过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在分区级上连接,通常会执行得更好。