使用主键约束将行从主表移动到子表

时间:2018-11-05 05:37:55

标签: postgresql performance optimization partitioning

我有一个名为posts的表,该表具有约10m行,这降低了我的查询性能,因此我在考虑使用对子表的分区来优化它,其中每个子表将包含一年的记录。

我目前有以下策略:

  1. 创建不受INHERIT约束的子表

    CREATE TABLE posts_2017 AS
    (SELECT * from posts where inserted_at < '2018-01-01 00:00:00');
    
  2. 随后通过以下方式创建继承关系

    ALTER TABLE posts_2017 inherit posts;
    
  3. 之后将CHECK约束添加到子表

现在效果很好,但现在如果我查询SELECT * from posts,我将获得2017年帖子的重复结果。我的下一步是使用另一个查询从主表中删除它们

DELETE FROM ONLY posts where inserted_at < '2018-01-01 00:00:00'

但是我遇到了另一个障碍,其中另一个表实际上具有引用这些2017年记录的外键。

例如,假设我有一个表users_posts仅包含user_idpost_id列,并且如果该表中的行引用了2017年帖子,则我的删除查询将失败。

在这种情况下,我有哪些选择?

1 个答案:

答案 0 :(得分:0)

您目前没有外键指向分区表。

此功能有a “work in progress” patch,因此它可能在PostgreSQL v12中出现。

就目前而言,如果要分区,则必须没有外键约束。