У нас есть зрелое приложение базы данных Oracle (в производстве более 10 лет), и в течение этого времени мы использовали собственные сценарии, предназначенные для удаления старых данных, которые больше не нужны. Они работают, выпуская операторы удаления для соответствующих таблиц, в цикле с частыми коммитами, чтобы избежать перегрузки системы при вводе-выводе или использовании слишком большого пространства отмены.
Они работают нормально, по большей части. Они работают ежедневно, и для удаления данных из самых старых дней из системы требуется около часа. Основное беспокойство, которое у меня возникает, - это влияние на таблицы и индексы, которое может иметь это удаление, и тот факт, что, хотя они и не загружают систему слишком сильно, удаление данных за один день за такой короткий промежуток времени приводит к потере производительности. из буфера кэша экземпляров, в результате чего последующие запросы будут выполняться несколько медленнее в течение следующих нескольких часов, поскольку кэш постепенно восстанавливается.
В течение многих лет мы рассматривали лучшие методы. В прошлом я слышал, что люди использовали многораздельные таблицы для управления пожатием старых данных - например, один месяц на раздел и ежемесячное удаление самого старого раздела. Основным недостатком этого подхода является то, что наши правила сбора урожая выходят за рамки «удалить месяц X». Пользователи могут указать, как долго данные должны оставаться в системе, основываясь на значениях ключей (например, в таблице счетов-фактур учетная запись foo может быть удалена через 3 месяца, но может потребоваться, чтобы строка учетной записи оставалась в течение 2 лет).
Существует также проблема ссылочной целостности; В документации Oracle говорится об использовании разделов для очистки данных, главным образом в контексте хранилищ данных, где таблицы, как правило, являются гиперкубами. Наш подход ближе к концу OLTP, и данные за месяц X обычно имеют связь с данными за месяц Y. Создание правильных ключей разделения для этих таблиц было бы в лучшем случае щекотливым.
Что касается выбросов в кэш, я немного прочитал о настройке выделенных буферных кешей, но похоже, что это больше для каждой таблицы, а не для пользователя или транзакции. Чтобы сохранить кеш, мне бы очень хотелось, чтобы задание пожинало плоды, чтобы в любой момент времени в кеше хранились только данные одной транзакции, поскольку нет необходимости хранить данные после их удаления.
Мы застряли с использованием удалений в обозримом будущем, или есть другие, более умные способы борьбы с пожинанием?