У меня очень большая база данных (по крайней мере, для меня) - более 1000000 записей, и мне нужно удалить все записи с меткой времени ниже, чем что-то. Как например:
DELETE FROM table WHERE TS < 2020-01-01;
Проблема, с которой я столкнулся, заключается в том, что после завершения транзакции, если она вообще завершается, база данных не отвечает и не может использоваться. Как я могу удалить столько записей без вышеупомянутой проблемы?
Я новичок в этом, на данный момент я работал только с базами данных, в которых было 1000-10000 строк, и команда, которую я использовал для удаления записей, не вызывала проблем.
select * from table
или что-то еще, что сканирует большую часть таблицы? Это может означать, что вы запускаете совместную сборку мусора, что означает, что транзакция, выполняющая сканирование таблицы, требует затрат на очистку мусора после удаления. - person Mark Rotteveel   schedule 18.02.2021DELETE
, затем выполнить резервное копирование и восстановление, а после этого следующее удаление и снова резервное копирование и восстановление? - person T0ny1234   schedule 18.02.2021RECREATE
более эффективным? - person Gordon Linoff   schedule 19.02.2021RECREATE
выполняетDROP
иCREATE
, что означает, что любые зависимости (например, внешние ключи к таблице) заблокируют удаление, вы потеряете все индексы в таблице и любые привилегии на таблица, присвоенная другим объектам (пользователям и т. д.). Кроме того, если таблица используется (например, подготовленным оператором), ее также нельзя отбросить. - person Mark Rotteveel   schedule 19.02.2021GCPolicy
наbackground
- это простейшее решение (но есть некоторые компромиссы, потому что я считаю, что он не будет собирать мусор сразу послеcombined
илиcooperative
, что означает некоторое снижение производительности из-за более длинные цепочки версий. - person Mark Rotteveel   schedule 19.02.2021