powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL 8.2.6 Оптимизатор запросов
8 сообщений из 8, страница 1 из 1
PostgreSQL 8.2.6 Оптимизатор запросов
    #35701983
Leo.ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начну с того, что раньше все работало, но настал момент х и что-то случилось.
Проблема в следующем:
есть таблица persons (209854 строк) и person_joints (47467)
и есть запрос вида
Код: plaintext
1.
select subjects_id, subjects_id from persons where subjects_id not in (
   select subjects_id2 from person_joints where relations<> 2 )
И этот запрос теперь виснет (его окончания я так и не дождался).
Что же произошло, я так толком и не понял, но вот какие есть интересные особенности, которые могут навести вас на мысли.
Если переписать запрос так
Код: plaintext
1.
select subjects_id,subjects_id from persons ps where 
 exists (select subjects_id2 from person_joints pj where pj.relations<> 2  and ps.subjects_id= pj.subjects_id2)
то он выполняется 2 сек.
Еще интереснее следующие запросы
Код: plaintext
1.
select subjects_id, subjects_id from persons where subjects_id not in (
   select subjects_id2 from person_joints where relations<> 2  limit  25000 )
Код: plaintext
1.
select subjects_id, subjects_id from persons where subjects_id not in (
   select subjects_id2 from person_joints where relations<> 2  limit  26000 )
Первый запрос выполняется 1 сек, второй виснет и все тут.

В ранних версиях postgresql приведенный запрос (первый) действительно не работал, но в новых вроде это исправили, да и двумя днями раньше, повторюсь, все работало нормально.
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702035
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo.ka,

показываете explain analyze для запросов, а для зависающего (а скорее всего "долгоиграющего") просто explain.

ps: analyze делали?
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702078
Leo.ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
explain
select subjects_id,subjects_id from persons
where subjects_id not in (select subjects_id2
from person_joints where relations<> 2 )
Код: plaintext
1.
2.
3.
4.
5.
"Seq Scan on persons  (cost=1192.73..48207302.39 rows=105024 width=4)"
"  Filter: (NOT (subplan))"
"  SubPlan"
"    ->  Materialize  (cost=1192.73..1585.65 rows=26392 width=4)"
"          ->  Seq Scan on person_joints  (cost=0.00..1037.34 rows=26392 width=4)"
"                Filter: (relations <> 2)"

Код: plaintext
1.
2.
3.
explain analyze
select subjects_id,subjects_id from persons ps
where 
 exists (select subjects_id2 from person_joints pj where pj.relations<> 2  and ps.subjects_id= pj.subjects_id2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
"Seq Scan on persons ps  (cost=0.00..1748055.78 rows=105024 width=4) (actual time=0.041..939.106 rows=26125 loops=1)"
"  Filter: (subplan)"
"  SubPlan"
"    ->  Index Scan using pj1 on person_joints pj  (cost=0.00..8.28 rows=1 width=4) (actual time=0.003..0.003 rows=0 loops=209855)"
"          Index Cond: ($0 = subjects_id2)"
"          Filter: (relations <> 2)"
"Total runtime: 948.642 ms"

Код: plaintext
1.
2.
3.
explain analyze
select subjects_id,subjects_id from persons
where subjects_id not in (select subjects_id2
from person_joints where relations<> 2  limit  25000 )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
"Seq Scan on persons  (cost=1045.12..11411.74 rows=105024 width=4) (actual time=52.060..231.998 rows=184876 loops=1)"
"  Filter: (NOT (hashed subplan))"
"  SubPlan"
"    ->  Limit  (cost=0.00..982.62 rows=25000 width=4) (actual time=0.011..35.122 rows=25000 loops=1)"
"          ->  Seq Scan on person_joints  (cost=0.00..1037.34 rows=26392 width=4) (actual time=0.009..19.647 rows=25000 loops=1)"
"                Filter: (relations <> 2)"
"Total runtime: 290.191 ms"

Код: plaintext
1.
2.
3.
explain
select subjects_id,subjects_id from persons
where subjects_id not in (select subjects_id2
from person_joints where relations<> 2  limit  26280 )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
"Seq Scan on persons  (cost=1188.22..48060263.58 rows=105024 width=4)"
"  Filter: (NOT (subplan))"
"  SubPlan"
"    ->  Materialize  (cost=1188.22..1580.02 rows=26280 width=4)"
"          ->  Limit  (cost=0.00..1032.94 rows=26280 width=4)"
"                ->  Seq Scan on person_joints  (cost=0.00..1037.34 rows=26392 width=4)"
"                      Filter: (relations <> 2)"
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702481
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эквивалентный запрос будет с "... where not exists ..."

для чего искомый запрос возвращает так много строк, более ста тысяч?

можно попробовать запрос с outer join и having.
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702668
Leo.ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как переписать запрос я знаю, спасибо кстати что поправили.
Но просто выглядит забавно:
запрос
Код: plaintext
1.
2.
3.
explain analyze
select subjects_id,subjects_id from persons
where subjects_id not in (select subjects_id2
from person_joints where relations<> 2  limit  26214 )
выполняется и дает нам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
"Seq Scan on persons  (cost=1095.88..11465.16 rows=105052 width=4) (actual time=57.413..246.625 rows=183780 loops=1)"
"  Filter: (NOT (hashed subplan))"
"  SubPlan"
"    ->  Limit  (cost=0.00..1030.34 rows=26214 width=4) (actual time=0.011..38.243 rows=26214 loops=1)"
"          ->  Seq Scan on person_joints  (cost=0.00..1037.34 rows=26392 width=4) (actual time=0.009..21.405 rows=26214 loops=1)"
"                Filter: (relations <> 2)"
"Total runtime: 306.057 ms"


а запрос
Код: plaintext
1.
2.
3.
explain analyze
select subjects_id,subjects_id from persons
where subjects_id not in (select subjects_id2
from person_joints where relations<> 2  limit  26215 )
limit отличается на 1, уже не выполняется
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702701
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это так же забавно, как и то, что вода при нуле градусов существует в жидком и твердом состояниях. значит 26215 - фазовый переход между планами без materialize и с ним.
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35702720
Leo.ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, пожалуй, Вы правы. Вопрос, наверное, можно считать решеным.
...
Рейтинг: 0 / 0
PostgreSQL 8.2.6 Оптимизатор запросов
    #35711954
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нить, напишите разрабам PostgreSQL (на меня они уже не реагируют :-) ), чтобы ограничили возможность появления Materialize - как только он появляется в эксплейне, начинаются тормоза.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL 8.2.6 Оптимизатор запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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