Postgresql 11根据主表中具有外键关系的列对明细表进行分区

时间:2018-12-06 22:27:34

标签: postgresql postgresql-11

在版本11中对基于声明范围的分区的改进似乎确实可以在我的用例中使用,但是我不确定完全不知道外键如何与分区一起使用。

我有表Files -< Segments -< Entries,其中每个文件有数百个段,每个段有数百个条目,所以条目的大小约为文件大小的10,000倍。文件具有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中才有可能使用这种用例,因此我没有找到太多有关此用例的信息,并且希望能获得一些指导!谢谢!

1 个答案:

答案 0 :(得分:2)

我相信它是版本11的新功能。有一个文档,您可以从中获取以下信息:

“主键约束必须包含分区键列。尝试创建不包含分区列的主键约束会导致错误”

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