Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ускорить удаление / 12 сообщений из 12, страница 1 из 1
05.03.2019, 19:01
    #39782680
lr2
lr2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить удаление
Есть табличка, из нее надо удалить данные, которые отсутствуют в другой табличке.
Удаление идет очень медленно

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




Подскажите пожалуйста как можно ускорить данный запрос.
...
Рейтинг: 0 / 0
05.03.2019, 19:18
    #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
05.03.2019, 19:19
    #39782690
gav21
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить удаление
lr2,
или перепишите через NOT EXISTS
...
Рейтинг: 0 / 0
06.03.2019, 02:11
    #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
06.03.2019, 11:10
    #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
06.03.2019, 11:11
    #39782820
lr2
lr2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить удаление
Maxim Boguk
2)проверить что ВСЕ FK (foreign keys) ссылающиеся на t1 проиндексированы на foreign стороне (т.е. не на t1 а на таблицах которые на t1 ссылаются).

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

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

Ни разу не отработал.
...
Рейтинг: 0 / 0
06.03.2019, 11:19
    #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
06.03.2019, 15:07
    #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
06.03.2019, 15:52
    #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
06.03.2019, 16:31
    #39783093
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить удаление
Maxim BogukРолг Хупинпропущено...


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

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

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

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

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


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