t1_id INTEGE REFERENCES t1 (t1_id) ON DELETE CASCADE ON UPDATE CASCADE;
в одной из таблиц ON DELETE SET NULL;
Ну и значит в таблице
t1 ~ 2.5 млн записей t2 ~ 0.5 млн записей t3 - 10 записей t4 ~ 1 млн записей
теперь удаляем
DELETE FROM t1 WHERE id = 2919364;
запрос выполняется немерянное количество времени.
План показывает примерно такой:
QUERY PLAN ---------------------------------------------------------------------------------------- Delete on t1 (cost=0.00..8.59 rows=1 width=6) -> Index Scan using t1_pkey on t1 (cost=0.00..8.59 rows=1 width=6) Index Cond: (id = 2919364) (3 rows)
Памяти на инстансе мало. да. 1Гиг всего. Таблицы занимают примерно 2.5 Гиг.
Получается что добавление записей в эти таблицы (это таблицы с логами) работает без задержек. А удаление записей - примерно одна в три минуты. Причем удаление по PRIMARY KEY.
Вопрос что можно сделать/посмотреть/переделать, чтобы можно было нормально чистить логи в такой таблице?
Можно попробовать принцип "разделяй и властвуй" - воспользоваться разбиением дочерних таблиц (t2 и t4), например, по диапазонам значений их внешних ключей (t1 и t3), как рассказывается здесь: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html