#java #postgresql #jdbc
Вопрос:
Мне нужно удалить исторические данные (старше определенных timestamp
) из таблиц Postgres, аналогично TTL в NoSQL
базе данных, такой как MongoDB. Подобная функция TTL
не является «из коробки», предоставляемой базами данных SQL, такими как Postgres. При этом я хотел бы разделить записи на небольшие пакеты, чтобы не выполнять более длительные запросы на удаление.
Это задание по очистке будет выполняться в лямбда-функции AWS на базе Java, которая будет выполняться ежедневно. Каков наилучший подход для достижения этой цели с помощью JDBC?
Комментарии:
1. Как вы думаете, почему вам нужно удалять пакеты? Если вы выполняете это ежедневно, я бы предположил, что вы не удаляете столько строк (не более миллионов), поэтому я не вижу причин не делать этого в одном операторе УДАЛЕНИЯ. Если у вас есть «постоянный TTL», то, возможно, разделение может быть лучшим вариантом. Затем вы удаляете только старые разделы, что составляет (миллисекунды).
2. За один день накапливается слишком много данных, и задействовано несколько таких таблиц, поэтому всегда безопаснее удалять их пакетами, так как задание получит блокировку таблицы.
3. УДАЛЕНИЕ не приведет к «блокировке таблицы». Это не будет мешать операторам SELECT, UPDATE или INSERT (до тех пор, пока они не попытаются манипулировать удаляемыми строками). И сколько стоит » слишком много данных «? миллиарды строк? Сотни миллионов? И если вы удаляете данные из нескольких таблиц, все равно все должно быть в одной транзакции, чтобы обеспечить согласованность
4. @a_horse_with_no_name.
DELETE
действительно получает блокировку таблицы, просто не очень сильную. См.Раздел Блокировки таблиц .5. @AdrianKlaver: Я знаю, но ничего, что могло бы помешать регулярным заявлениям DML.