5

版本 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 中甚至可以使用此用例,因此我没有找到太多有关它的信息,并且希望有任何指示!谢谢!

4

1 回答 1

7

相信是11版本的新特性。有一个文档可以从中得到以下信息:

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

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

于 2019-01-15T00:49:04.330 回答