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

Код: sql
1.
2.
DELETE FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2 WHERE id2=t1.id)




Подскажите пожалуйста как можно ускорить данный запрос.
...
Рейтинг: 0 / 0
ускорить удаление
    #39782689
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2,

добавьте work_mem, при достаточном work_mem постгрес сможет построить хэш таблицу и выполнить запрос, при недостаче - будут бесконечно долгие вложенные циклы
https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
...
Рейтинг: 0 / 0
ускорить удаление
    #39782690
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2,
или перепишите через NOT EXISTS
...
Рейтинг: 0 / 0
ускорить удаление
    #39782753
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2Есть табличка, из нее надо удалить данные, которые отсутствуют в другой табличке.
Удаление идет очень медленно

Код: sql
1.
2.
DELETE FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2 WHERE id2=t1.id)




Подскажите пожалуйста как можно ускорить данный запрос.

1)переделать на not exists
2)проверить что ВСЕ FK (foreign keys) ссылающиеся на t1 проиндексированы на foreign стороне (т.е. не на t1 а на таблицах которые на t1 ссылаются).

3 - очень медленно это качественный показатель... размеры таблиц в количестве записей скажите и сколько у вас запрос отрабатывал (если отрабатывает вообще конечно).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
ускорить удаление
    #39782819
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguklr2Есть табличка, из нее надо удалить данные, которые отсутствуют в другой табличке.
Удаление идет очень медленно

Код: sql
1.
2.
SELECT *  FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2)




Подскажите пожалуйста как можно ускорить данный запрос.

1)переделать на not exists
2)проверить что ВСЕ FK (foreign keys) ссылающиеся на t1 проиндексированы на foreign стороне (т.е. не на t1 а на таблицах которые на t1 ссылаются).

3 - очень медленно это качественный показатель... размеры таблиц в количестве записей скажите и сколько у вас запрос отрабатывал (если отрабатывает вообще конечно).

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




1) Посмотрите, правильно ли такой передел?

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



Выполнился быстро (5 мин), но проверить не получается правильно ли удалил, т.к. запрос

Код: sql
1.
2.
SELECT *  FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2)



выполняется бесконечно.



Сам запрос, как оказалось, написал я неверно.

Он вот такого вида должен был быть:

Код: sql
1.
2.
SELECT *  FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2)



Это я как раз пытался с ексистс переделать и условие в скобках добавил.
...
Рейтинг: 0 / 0
ускорить удаление
    #39782820
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguk
2)проверить что ВСЕ FK (foreign keys) ссылающиеся на t1 проиндексированы на foreign стороне (т.е. не на t1 а на таблицах которые на t1 ссылаются).

Индексы есть.

3 - очень медленно это качественный показатель... размеры таблиц в количестве записей скажите и сколько у вас запрос отрабатывал (если отрабатывает вообще конечно).

Ни разу не отработал.
...
Рейтинг: 0 / 0
ускорить удаление
    #39782827
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2,

авторВыполнился быстро (5 мин), но проверить не получается правильно ли удалил, т.к. запрос

SELECT * FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2)


Так зачем вы через not in проверяете когда надо через not exists.
Много много раз писали что NOT IN использовать не надо в запросах.

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

авторВыполнился быстро (5 мин), но проверить не получается правильно ли удалил, т.к. запрос

SELECT * FROM t1
WHERE t1.id NOT IN (SELECT id2 FROM t2)


Так зачем вы через not in проверяете когда надо через not exists.
Много много раз писали что Not exists использовать не надо в запросах.


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

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

пропущено...


Так зачем вы через not in проверяете когда надо через not exists.
Много много раз писали что Not exists использовать не надо в запросах.


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

противоречивое утверждение, так как надо?

Надо больше мне кофе по утрам пить.
Кроме случая запросов вида NOT IN (1,2,3) - во всех остальных случаях без исключений NOT EXISTS будет не хуже чем NOT IN а в большинстве случаев будет сильно лучше.
...
Рейтинг: 0 / 0
ускорить удаление
    #39783093
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупинпропущено...


противоречивое утверждение, так как надо?

Надо больше мне кофе по утрам пить.
Кроме случая запросов вида NOT IN (1,2,3) - во всех остальных случаях без исключений NOT EXISTS будет не хуже чем NOT IN а в большинстве случаев будет сильно лучше.

лайкнул
причем, практически так же можно утверждать и в случае SQL Server.
...
Рейтинг: 0 / 0
ускорить удаление
    #39783583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukво всех остальных случаях без исключений NOT EXISTS будет не хуже чем NOT IN а в большинстве случаев будет сильно лучше.
Если не считать одной мелочи, что они по-разному будут работать с NULL.
...
Рейтинг: 0 / 0
ускорить удаление
    #39783722
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMaxim Bogukво всех остальных случаях без исключений NOT EXISTS будет не хуже чем NOT IN а в большинстве случаев будет сильно лучше.
Если не считать одной мелочи, что они по-разному будут работать с NULL.

Есть одно но - поведение NOT IN с NULL оно а)бредовое б)неожиданное.
И то как NOT IN будет себя с NULL вести - большинству авторов запросов будет ну очень неожиданным.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ускорить удаление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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