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

есть такой запрос

Код: sql
1.
2.
3.
select new_table4.ch,new_table4.d,sp.name from new_table4
left join sp on sp.id= new_table4.d
left join sp1 on sp1.id= new_table4.d



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

план такой

1 Hash Right Join (cost=194333.00..266699.08 rows=2344642 width=21) (actual time=4419.817..7104.994 rows=2000000 loops=1)
2 Hash Cond: (sp1.id = new_table4.d)
3 -> Seq Scan on sp1 (cost=0.00..22378.77 rows=1156777 width=4) (actual time=0.037..327.317 rows=2000000 loops=1)
4 -> Hash (cost=157614.00..157614.00 rows=2000000 width=21) (actual time=4417.960..4417.960 rows=2000000 loops=1)
5 Buckets: 65536 Batches: 32 Memory Usage: 3881kB
6 -> Hash Left Join (cost=65577.00..157614.00 rows=2000000 width=21) (actual time=992.284..3720.258 rows=2000000 loops=1)
7 Hash Cond: (new_table4.d = sp.id)
8 -> Seq Scan on new_table4 (cost=0.00..32739.00 rows=2000000 width=10) (actual time=0.066..533.539 rows=2000000 loops=1)
9 -> Hash (cost=30811.00..30811.00 rows=2000000 width=15) (actual time=986.225..986.225 rows=2000000 loops=1)
10 Buckets: 131072 Batches: 32 Memory Usage: 3968kB
11 -> Seq Scan on sp (cost=0.00..30811.00 rows=2000000 width=15) (actual time=0.413..482.464 rows=2000000 loops=1)



и второй запрос

Код: sql
1.
2.
3.
select new_table4.ch,new_table4.d,sp.name from new_table4
left join sp on sp.id= new_table4.d
left join sp1 on sp1.id= sp.id



тут тоже поля соединения наобум. но суть понятна

план такой


1 Hash Right Join (cost=131129.00..278583.00 rows=2000000 width=21) (actual time=1989.954..6917.499 rows=2000000 loops=1)
2 Hash Cond: (sp.id = new_table4.d)
3 -> Hash Left Join (cost=63624.00..151780.00 rows=2000000 width=15) (actual time=1052.084..3578.338 rows=2000000 loops=1)
4 Hash Cond: (sp.id = sp1.id)
5 -> Seq Scan on sp (cost=0.00..30811.00 rows=2000000 width=15) (actual time=0.093..461.636 rows=2000000 loops=1)
6 -> Hash (cost=30811.00..30811.00 rows=2000000 width=4) (actual time=1047.647..1047.647 rows=2000000 loops=1)
7 Buckets: 131072 Batches: 32 Memory Usage: 3232kB
8 -> Seq Scan on sp1 (cost=0.00..30811.00 rows=2000000 width=4) (actual time=0.072..540.079 rows=2000000 loops=1)
9 -> Hash (cost=32739.00..32739.00 rows=2000000 width=10) (actual time=937.181..937.181 rows=2000000 loops=1)
10 Buckets: 131072 Batches: 32 Memory Usage: 3727kB
11 -> Seq Scan on new_table4 (cost=0.00..32739.00 rows=2000000 width=10) (actual time=0.118..453.628 rows=2000000 loops=1)


собственно что хочу понять. как сервер внутри производит соединения

в первом случаем вроде как понятно. если упрощенно. читается new_table4 и джойнится к ней SP. а потом к результату джойнится sp1. Ну по крайней мере мой воспаленный мозг так понимает ). единственное слегка недопонимаю почему при втором join условие перевернуто


а по поводу второго запроса. мне представляется способ его выполнения вроде как такой же как и первого. сначала соединяем new_table4 c sp, а потом результат с sp1. Но план другой

может кто прокомментирует. чтоб мозг чуток вправить )
...
Рейтинг: 0 / 0
Вопрос по планам
    #39811804
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvЗдравствуйте.

есть такой запрос

Код: sql
1.
2.
3.
select new_table4.ch,new_table4.d,sp.name from new_table4
left join sp on sp.id= new_table4.d
left join sp1 on sp1.id= new_table4.d



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

план такой

1 Hash Right Join (cost=194333.00..266699.08 rows=2344642 width=21) (actual time=4419.817..7104.994 rows=2000000 loops=1)
2 Hash Cond: (sp1.id = new_table4.d)
3 -> Seq Scan on sp1 (cost=0.00..22378.77 rows=1156777 width=4) (actual time=0.037..327.317 rows=2000000 loops=1)
4 -> Hash (cost=157614.00..157614.00 rows=2000000 width=21) (actual time=4417.960..4417.960 rows=2000000 loops=1)
5 Buckets: 65536 Batches: 32 Memory Usage: 3881kB
6 -> Hash Left Join (cost=65577.00..157614.00 rows=2000000 width=21) (actual time=992.284..3720.258 rows=2000000 loops=1)
7 Hash Cond: (new_table4.d = sp.id)
8 -> Seq Scan on new_table4 (cost=0.00..32739.00 rows=2000000 width=10) (actual time=0.066..533.539 rows=2000000 loops=1)
9 -> Hash (cost=30811.00..30811.00 rows=2000000 width=15) (actual time=986.225..986.225 rows=2000000 loops=1)
10 Buckets: 131072 Batches: 32 Memory Usage: 3968kB
11 -> Seq Scan on sp (cost=0.00..30811.00 rows=2000000 width=15) (actual time=0.413..482.464 rows=2000000 loops=1)



и второй запрос

Код: sql
1.
2.
3.
select new_table4.ch,new_table4.d,sp.name from new_table4
left join sp on sp.id= new_table4.d
left join sp1 on sp1.id= sp.id



тут тоже поля соединения наобум. но суть понятна

план такой


1 Hash Right Join (cost=131129.00..278583.00 rows=2000000 width=21) (actual time=1989.954..6917.499 rows=2000000 loops=1)
2 Hash Cond: (sp.id = new_table4.d)
3 -> Hash Left Join (cost=63624.00..151780.00 rows=2000000 width=15) (actual time=1052.084..3578.338 rows=2000000 loops=1)
4 Hash Cond: (sp.id = sp1.id)
5 -> Seq Scan on sp (cost=0.00..30811.00 rows=2000000 width=15) (actual time=0.093..461.636 rows=2000000 loops=1)
6 -> Hash (cost=30811.00..30811.00 rows=2000000 width=4) (actual time=1047.647..1047.647 rows=2000000 loops=1)
7 Buckets: 131072 Batches: 32 Memory Usage: 3232kB
8 -> Seq Scan on sp1 (cost=0.00..30811.00 rows=2000000 width=4) (actual time=0.072..540.079 rows=2000000 loops=1)
9 -> Hash (cost=32739.00..32739.00 rows=2000000 width=10) (actual time=937.181..937.181 rows=2000000 loops=1)
10 Buckets: 131072 Batches: 32 Memory Usage: 3727kB
11 -> Seq Scan on new_table4 (cost=0.00..32739.00 rows=2000000 width=10) (actual time=0.118..453.628 rows=2000000 loops=1)


собственно что хочу понять. как сервер внутри производит соединения

в первом случаем вроде как понятно. если упрощенно. читается new_table4 и джойнится к ней SP. а потом к результату джойнится sp1. Ну по крайней мере мой воспаленный мозг так понимает ). единственное слегка недопонимаю почему при втором join условие перевернуто


а по поводу второго запроса. мне представляется способ его выполнения вроде как такой же как и первого. сначала соединяем new_table4 c sp, а потом результат с sp1. Но план другой

может кто прокомментирует. чтоб мозг чуток вправить )

При равных размерах таблиц - разницы в какой последовательности и как делать hash join - вообще никакой.
У вас (скорее всего) некорректный модельный пример - таблицы справочники как правило заметно меньше чем new_table4 отсюда и более менее случайный план соединения.
...
Рейтинг: 0 / 0
Вопрос по планам
    #39811894
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukПри равных размерах таблиц - разницы в какой последовательности и как делать hash join - вообще никакой.
У вас (скорее всего) некорректный модельный пример - таблицы справочники как правило заметно меньше чем new_table4 отсюда и более менее случайный план соединения.

Согласен. Со справочниками перемудрил.

Я ж правильно понимаю, что в принципе и первый и второй запросы в общем случае можно выполнить одинаково по логике обработки потоков.
А именно сначала выбирает из ведущей таблицы, потом присоединяем sp. А потом к полученному потоку присоединяем sp1. Только в первом случае будет одно условие присоединения sp1, а во втором слегка другое
...
Рейтинг: 0 / 0
Вопрос по планам
    #39811932
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvЯ ж правильно понимаю, что в принципе и первый и второй запросы в общем случае можно выполнить одинаково по логике обработки потоков.
А именно сначала выбирает из ведущей таблицы, потом присоединяем sp. А потом к полученному потоку присоединяем sp1. Только в первом случае будет одно условие присоединения sp1, а во втором слегка другое

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


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