Переместить строки из основной таблицы в дочернюю таблицу с ограничениями внешнего ключа - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть таблица с именем posts с ~ 10-метровыми строками, и она снижает производительность моих запросов, поэтому я подумывал оптимизировать ее, используя разбиение на дочерние таблицы, где каждая дочерняя таблица будет содержать записи за год.

В настоящее время у меня есть следующая стратегия:

  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_id и post_id, и мой запрос на удаление не будет выполнен, если строка в этой таблице ссылается на сообщение 2017 года.

Какие у меня варианты в этом сценарии?

1 Ответ

0 голосов
/ 05 ноября 2018

Вы не можете иметь внешние ключи, указывающие на секционированные таблицы.

Идет & ldquo; работа в процессе & rdquo; патч для этой функциональности, поэтому он может прийти в PostgreSQL v12.

Пока что вам нужно обойтись без ограничения внешнего ключа, если вы хотите создать раздел.

...