@Filex
Начинающий разработчик.

Как быстро удалить большое количество строк в postgresql?

У меня есть таблица на 2 млн позиций. Есть список из id (200 тыс. шт.) которые надо удалить.
Простым запросом "DELETE FROM table WHERE id = ?" в цикле (из java) удаляется примерно 90 позиций в минуту.
Как можно ускорить данную операцию?
  • Вопрос задан
  • 5749 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Безопасный подход для больших таблиц:
create unlogged table list_for_delete (id int);
insert into list_for_delete values ....

with to_rm as (
    select id from list_for_delete limit 10000
), rm as (
    delete from list_for_delete where id in (select id from to_rm)
)
delete from tablename  where id in (select id from to_rm);

vacuum analyze tablename;
drop table list_for_delete ;

cte с delete повторять пока не будет affeted rows = 0. Смотреть на лаг репликации, добавлять задержки между запросами и увеличивать/уменьшать размер пачки в зависимости от влияния на прод.
vacuum в конце, можно после половины пройтись дополнительно. С таким-то объёмом можно руками вакуум вообще не делать и оставить автовакууму. А для таблиц побольше при массовом изменении имеет смысл.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
x67
@x67
Вы каждый раз вызываете запрос на удаление одной строки? Тогда 90 запросов еще хороший результат, такими методами ни один вражеский дудос не страшен, своего хватит.
Используйте другие условия (например формализуйте те условия, по которым вы получили ваш список удаляемых id) или создайте временную таблицу с нужными id, после чего используйте 1 запрос:
DELETE FROM table WHERE id IN (select id from dellisttable)

где dellisttable - временная таблица, в которой хранится список удаляемых id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы