Postgresql11在外键关系中基于主表中的列对明细表进行分区



版本11中对声明性基于范围的分区的改进似乎真的适用于我的用例,但我不完全确定外键是如何与分区一起工作的。

我有Files -< Segments -< Entries表,其中每个文件有数百个分段,每个分段有数百个条目,因此条目的大小是文件大小的10000倍。文件有一个CreationDate字段,客户将定义一个保留期,以便删除旧条目。所有这些都清楚地指向了基于日期的分区,因此可以更快地首先查询最新的条目,并且很容易删除旧条目。

我遇到的第一个问题是,当我试图创建Files表时,听起来我必须将createdDate作为主键的一部分,才能将其包含在RANGE分区中:

CREATE TABLE Files2
(
FileId BIGSERIAL PRIMARY KEY,
createdDate timestamp with time zone,
filepath character varying COLLATE pg_catalog."default" NOT NULL
) PARTITION BY RANGE (createdDate)
WITH (
OIDS = FALSE
)                                
TABLESPACE pg_default;
ERROR:  insufficient columns in PRIMARY KEY constraint definition
DETAIL:  PRIMARY KEY constraint on table "files2" lacks column "createddate" which is part of the partition key.

如果我从FileId的定义中删除"PRIMARY KEY",我不会得到错误,但这会影响子查找的效率吗?

我也不知道如何声明子表的分区。PARTITION BY RANGE (Files.createdDate)不起作用。

由于只有在版本11中,这个用例才有可能实现,所以我还没有找到太多关于它的信息,如果有任何指针,我将不胜感激!谢谢

我相信这是版本11的一个新特性。有一个文件,你可以从中获得以下信息:

"主键约束必须包括分区键列。试图创建不包含分区列的主键约束会导致错误">

https://h50146.www5.hpe.com/products/software/oe/linux/mainstream/support/lcc/pdf/PostgreSQL11NewFeaturesGAen20181022-1.pdf

相关内容

  • 没有找到相关文章

最新更新