У меня есть таблица pgsql, которая становится довольно большой. Я хотел бы повернуть его с помощью задания cron - данные используются только для создания отчетов, и через неделю или две они не требуются.
Правильный способ сделать это - настроить разбиение таблицы.
http://www.postgresql.org/docs/8.2/static/ddl-partitioning.html
Вы устанавливаете ограничение проверки для столбца, а затем используете правило, основанное на этой проверке, для направления строк, вставленных в родительскую таблицу, в одну из нескольких дочерних таблиц. В вашем случае я бы предложил еженедельное разбиение. Если вы хотите разрешить пользователям запрашивать один раздел, вы просто назовете разделы логически, скажем, 2009_week_32 или 2009_august_week_1, и попросите их выдавать запросы к соответствующей таблице.
Если вы хотите, чтобы они запрашивали несколько таблиц вместе, вы настраиваете представление, которое выполняет объединение выбора для нескольких таблиц, и пользователи запрашивают представление.
Если вы хотите удалить данные, которые больше не требуются, вы просто изменяете таблицу, чтобы изменить правило, и удалите таблицу, содержащую старые данные.
Это немного больше, чем ответ disabledleopard, но этот метод довольно распространен для других движков баз данных. Обратной стороной простого использования «удалить где» в столбце отметки времени является то, что для больших таблиц это может занять очень много времени и что данные записываются в журнал. Truncate разработан, чтобы обойти проблему написания журнала, но вы не можете указать предложение where. Удаление таблицы происходит очень быстро, поскольку вы не имеете дело с отдельными строками.
Вам понадобится какое-то обслуживание, чтобы установить правила для будущих дат. Некоторые люди пишут это ежемесячно (просто проверьте за 5 дней до конца месяца, существует ли раздел следующего месяца, а если нет, создайте его и выполните магию изменения таблицы, чтобы изменить правила), в то время как другие просто устанавливают правила на несколько месяцев или лет заранее и выполняйте работы по техническому обслуживанию вручную каждый квартал / год по мере необходимости.
Я думал, что нужно изменить схему этой таблицы, чтобы записать метку времени, в которую были вставлены данные.
ALTER TABLE blah ADD COLUMN entry_time timestamp DEFAULT current_timestamp;
таким образом, не нужно менять то, что в настоящее время создает таблицу.
Тогда cron может быть просто этой командой (должен работать с postgres 8.x, но у меня нет запущенного сервера, чтобы подтвердить, извините)
psql -c "DELETE FROM blah WHERE entry_time < (current_timestamp - interval '14 days') RETURNING *;" > deletelog.$( date "+%Y%m%d").log
Изменить: я забыл упомянуть, что бит «ВОЗВРАЩЕНИЕ *» заставляет psql возвращать полную информацию обо всех удаленных строках, а также обычное «N строк удалено», поэтому этот журнал можно использовать с небольшой магией awk для повторной вставки данных, если они удалены преждевременно. Кроме того, всегда полезно вести журналы аудита для автоматического удаления.