我有一个名为posts
的表,该表具有约10m行,这降低了我的查询性能,因此我在考虑使用对子表的分区来优化它,其中每个子表将包含一年的记录。
我目前有以下策略:
创建不受INHERIT
约束的子表
CREATE TABLE posts_2017 AS
(SELECT * from posts where inserted_at < '2018-01-01 00:00:00');
随后通过以下方式创建继承关系
ALTER TABLE posts_2017 inherit posts;
之后将CHECK
约束添加到子表
现在效果很好,但现在如果我查询SELECT * from posts
,我将获得2017年帖子的重复结果。我的下一步是使用另一个查询从主表中删除它们
DELETE FROM ONLY posts where inserted_at < '2018-01-01 00:00:00'
但是我遇到了另一个障碍,其中另一个表实际上具有引用这些2017年记录的外键。
例如,假设我有一个表users_posts
仅包含user_id
和post_id
列,并且如果该表中的行引用了2017年帖子,则我的删除查询将失败。
在这种情况下,我有哪些选择?
答案 0 :(得分:0)