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