powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как быстро удалить строки из таблицы?
9 сообщений из 9, страница 1 из 1
Как быстро удалить строки из таблицы?
    #39746676
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги.

Подскажите пожалуйста как можно ускорить запрос, удаляющий из таблицы t1 записи, отсутствующие в t2?


Вот такой запрос висит часами:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN 
DELETE FROM t1 WHERE client_id NOT IN (SELECT id FROM t2);



Delete on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
  ->  Seq Scan on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
        Filter: (NOT (SubPlan 1))
        SubPlan 1
          ->  Materialize  (cost=0.00..874514.25 rows=23079150 width=8)
                ->  Seq Scan on t2  (cost=0.00..668965.50 rows=23079150 width=8)




Возможно как-то по-другому реализовать удаление? Быстрее?
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746679
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий СлонДобрый день, коллеги.

Подскажите пожалуйста как можно ускорить запрос, удаляющий из таблицы t1 записи, отсутствующие в t2?


Вот такой запрос висит часами:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN 
DELETE FROM t1 WHERE client_id NOT IN (SELECT id FROM t2);



Delete on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
  ->  Seq Scan on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
        Filter: (NOT (SubPlan 1))
        SubPlan 1
          ->  Materialize  (cost=0.00..874514.25 rows=23079150 width=8)
                ->  Seq Scan on t2  (cost=0.00..668965.50 rows=23079150 width=8)




Возможно как-то по-другому реализовать удаление? Быстрее?

А много ли удаляется строк? На медленном диске удаление 13M строк вполне может часы занять.
Но более вероятный вариант - а на t1 нет никаких ссылающихся на нее FK из других таблиц?

Дополнительно - перепишите NOT IN на NOT EXISTS будет сразу быстрее все. NOT IN - очень медленная операция.

Обычно такие запросы анализируют путем - сделали select соответствующий delete, дальше если select быстро работает а delete очень медленно то FK или триггера.... если же сам select Тормозит то его и надо ускорять сначала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746701
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukСиний СлонДобрый день, коллеги.

Подскажите пожалуйста как можно ускорить запрос, удаляющий из таблицы t1 записи, отсутствующие в t2?


Вот такой запрос висит часами:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN 
DELETE FROM t1 WHERE client_id NOT IN (SELECT id FROM t2);



Delete on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
  ->  Seq Scan on t1  (cost=0.00..12225586133841.40 rows=13114596 width=6)
        Filter: (NOT (SubPlan 1))
        SubPlan 1
          ->  Materialize  (cost=0.00..874514.25 rows=23079150 width=8)
                ->  Seq Scan on t2  (cost=0.00..668965.50 rows=23079150 width=8)




Возможно как-то по-другому реализовать удаление? Быстрее?

А много ли удаляется строк? На медленном диске удаление 13M строк вполне может часы занять.
Но более вероятный вариант - а на t1 нет никаких ссылающихся на нее FK из других таблиц?

Дополнительно - перепишите NOT IN на NOT EXISTS будет сразу быстрее все. NOT IN - очень медленная операция.

Обычно такие запросы анализируют путем - сделали select соответствующий delete, дальше если select быстро работает а delete очень медленно то FK или триггера.... если же сам select Тормозит то его и надо ускорять сначала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru



удаляется немного, примерно 1% данных.
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746705
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим, спасибо за ответы.



Maxim BogukДополнительно - перепишите NOT IN на NOT EXISTS будет сразу быстрее все. NOT IN - очень медленная операция.



Не совсем понял как это сделать, как связать client_id и NOT EXISTS


так получается бессмыслица какая-то:
DELETE FROM t1 WHERE client_id NOT EXISTS (SELECT id FROM t2);

Извиняюсь заранее, не выспался, медленно соображаю ...
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746715
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий СлонМаксим, спасибо за ответы.



Maxim BogukДополнительно - перепишите NOT IN на NOT EXISTS будет сразу быстрее все. NOT IN - очень медленная операция.



Не совсем понял как это сделать, как связать client_id и NOT EXISTS


так получается бессмыслица какая-то:
DELETE FROM t1 WHERE client_id NOT EXISTS (SELECT id FROM t2);

Извиняюсь заранее, не выспался, медленно соображаю ...



Вроде дошло )

Надеюсь вы это имели ввиду:

Код: sql
1.
DELETE FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE id=client_id);
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746716
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в плане появился anti join

посмотрим на практике получится ли удалить таким запросом, очень надеюсь что да.
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746724
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий СлонВроде дошло )

Надеюсь вы это имели ввиду:

Код: sql
1.
DELETE FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE id=client_id);





Да.

PS: еще раз процитирую

Обычно такие запросы анализируют путем - сделали select соответствующий нужному вам delete, дальше если select быстро работает а delete очень медленно то FK или триггера.... если же сам select Тормозит то его и надо ускорять сначала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39746734
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukСиний СлонВроде дошло )

Надеюсь вы это имели ввиду:

Код: sql
1.
DELETE FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE id=client_id);





Да.

PS: еще раз процитирую

Обычно такие запросы анализируют путем - сделали select соответствующий нужному вам delete, дальше если select быстро работает а delete очень медленно то FK или триггера.... если же сам select Тормозит то его и надо ускорять сначала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru



Максим, замена на NOT EXIST ускорила запрос!!!

Запрос успешно выполнен без возвращаемых данных за 399658 мс.

Большое спасибо!
...
Рейтинг: 0 / 0
Как быстро удалить строки из таблицы?
    #39747278
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий Слон,
ускорить NOT IN без переписывания запроса можно - влив work_mem :)
Заранее узнать сколько именно нужно work_mem невозможно, только запустить и посмотреть. В простом explain к сожалению это не видно.
для информации https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как быстро удалить строки из таблицы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]