|
Вопрос по планам
|
|||
---|---|---|---|
#18+
Здравствуйте. есть такой запрос Код: sql 1. 2. 3.
те по сути к основной таблице джойнятся два справочника. условия одинаковые - просто забыл второе поле сделать ) план такой 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.
тут тоже поля соединения наобум. но суть понятна план такой 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. Но план другой может кто прокомментирует. чтоб мозг чуток вправить ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2019, 01:24 |
|
Вопрос по планам
|
|||
---|---|---|---|
#18+
SwvЗдравствуйте. есть такой запрос Код: sql 1. 2. 3.
те по сути к основной таблице джойнятся два справочника. условия одинаковые - просто забыл второе поле сделать ) план такой 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.
тут тоже поля соединения наобум. но суть понятна план такой 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 отсюда и более менее случайный план соединения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2019, 09:08 |
|
Вопрос по планам
|
|||
---|---|---|---|
#18+
Maxim BogukПри равных размерах таблиц - разницы в какой последовательности и как делать hash join - вообще никакой. У вас (скорее всего) некорректный модельный пример - таблицы справочники как правило заметно меньше чем new_table4 отсюда и более менее случайный план соединения. Согласен. Со справочниками перемудрил. Я ж правильно понимаю, что в принципе и первый и второй запросы в общем случае можно выполнить одинаково по логике обработки потоков. А именно сначала выбирает из ведущей таблицы, потом присоединяем sp. А потом к полученному потоку присоединяем sp1. Только в первом случае будет одно условие присоединения sp1, а во втором слегка другое ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2019, 17:04 |
|
Вопрос по планам
|
|||
---|---|---|---|
#18+
SwvЯ ж правильно понимаю, что в принципе и первый и второй запросы в общем случае можно выполнить одинаково по логике обработки потоков. А именно сначала выбирает из ведущей таблицы, потом присоединяем sp. А потом к полученному потоку присоединяем sp1. Только в первом случае будет одно условие присоединения sp1, а во втором слегка другое Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2019, 19:56 |
|
|
start [/forum/topic.php?fid=53&msg=39811932&tid=1995208]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 272ms |
total: | 405ms |
0 / 0 |