powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / убрать ненужную сортировку после FULL OUTER JOIN
8 сообщений из 8, страница 1 из 1
убрать ненужную сортировку после FULL OUTER JOIN
    #35144710
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для постраничного показа хочу использовать ORDER BY, не принципиально в каком порядке, и LIMIT, OFFSET. При этом выборка идет по FULL OUTER JOIN двух таблиц по полю id. Насколько я понимаю, выдача Merge Full Join отсортирована по "общему id", и если указать ORDER BY по этому же "общему id", то в плане запроса Sort должен оказаться не нужным. Однако не получается. Что делать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table t1 as select generate_series( 1 , 1000000 , 2 ) as id;
create table t2 as select generate_series( 1 , 1000000 , 3 ) as id;

create index i1 on t1 ( id );
create index i2 on t2 ( id );

analyze t1;
analyze t2;

explain analyze
select id, t1.*, t2.*
from t1 natural full join t2
order by  1  limit  10  offset  10 ;

drop table t1;
drop table t2;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                                                                QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost= 44080 . 12 .. 44080 . 15  rows= 10  width= 8 ) (actual time= 6724 . 850 .. 6724 . 906  rows= 10  loops= 1 )
   ->  Sort  (cost= 44080 . 10 .. 45330 . 10  rows= 500000  width= 8 ) (actual time= 6724 . 806 .. 6724 . 845  rows= 20  loops= 1 )
         Sort Key: (COALESCE(t1.id, t2.id))
         Sort Method:  top-N heapsort  Memory: 25kB
         ->  Merge Full Join  (cost= 0 . 00 .. 30775 . 28  rows= 500000  width= 8 ) (actual time= 0 . 142 .. 5237 . 289  rows= 666667  loops= 1 )
               Merge Cond: (t1.id = t2.id)
               ->  Index Scan using i1 on t1  (cost= 0 . 00 .. 15212 . 30  rows= 500000  width= 4 ) (actual time= 0 . 079 .. 1188 . 601  rows= 500000  loops= 1 )
               ->  Index Scan using i2 on t2  (cost= 0 . 00 .. 10146 . 30  rows= 333334  width= 4 ) (actual time= 0 . 051 .. 793 . 635  rows= 333334  loops= 1 )
 Total runtime:  6724 . 977  ms
( 9  rows)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Limit  (cost= 0 . 62 .. 1 . 23  rows= 10  width= 8 ) (actual time= 0 . 262 .. 0 . 366  rows= 10  loops= 1 )
   ->  Merge Full Join  (cost= 0 . 00 .. 30775 . 28  rows= 500000  width= 8 ) (actual time= 0 . 156 .. 0 . 303  rows= 20  loops= 1 )
         Merge Cond: (t1.id = t2.id)
         ->  Index Scan using i1 on t1  (cost= 0 . 00 .. 15212 . 30  rows= 500000  width= 4 ) (actual time= 0 . 088 .. 0 . 120  rows= 15  loops= 1 )
         ->  Index Scan using i2 on t2  (cost= 0 . 00 .. 10146 . 30  rows= 333334  width= 4 ) (actual time= 0 . 056 .. 0 . 078  rows= 11  loops= 1 )
 Total runtime:  0 . 430  ms
( 6  rows)
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35146630
WW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WW
Гость
Merge join предполагает и требует на входе слияния уже отсортированные наборы. поэтому ИМХО никак не убрать. Или перейти на более медленный join.
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35147009
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WWMerge join предполагает и требует на входе слияния уже отсортированные наборы. поэтому ИМХО никак не убрать. Или перейти на более медленный join.на вход и так приходят упорядоченные наборы, по Index Scan, с этим проблем нет. проблема с выходом джоина: постгрес не понимает, что выход Merge Full Join упорядочен по "общему id", поэтому проводит сортировку выхода, хотя имхо можно обойтись без нее.

нарыл в сорцах :-( src/backend/optimizer/path/pathkeys.c * EXCEPTION: in a FULL or RIGHT join, we cannot treat the result as
* having the outer path's path keys, because null lefthand rows may be
* inserted at random points. It must be treated as unsorted.
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35148382
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat WWMerge join предполагает и требует на входе слияния уже отсортированные наборы. поэтому ИМХО никак не убрать. Или перейти на более медленный join.на вход и так приходят упорядоченные наборы, по Index Scan, с этим проблем нет. проблема с выходом джоина: постгрес не понимает, что выход Merge Full Join упорядочен по "общему id", поэтому проводит сортировку выхода, хотя имхо можно обойтись без нее.

нарыл в сорцах :-( src/backend/optimizer/path/pathkeys.c * EXCEPTION: in a FULL or RIGHT join, we cannot treat the result as
* having the outer path's path keys, because null lefthand rows may be
* inserted at random points. It must be treated as unsorted.ну, поленились.
а реализовать руками? (в ф-ии)

кажется должно получится 2 вложенных FOR LOOP-а по индексно сортированным наборам. Нет?
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35148871
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat WWMerge join предполагает и требует на входе слияния уже отсортированные наборы. поэтому ИМХО никак не убрать. Или перейти на более медленный join.на вход и так приходят упорядоченные наборы, по Index Scan, с этим проблем нет. проблема с выходом джоина: постгрес не понимает, что выход Merge Full Join упорядочен по "общему id", поэтому проводит сортировку выхода, хотя имхо можно обойтись без нее.

нарыл в сорцах :-( src/backend/optimizer/path/pathkeys.c * EXCEPTION: in a FULL or RIGHT join, we cannot treat the result as
* having the outer path's path keys, because null lefthand rows may be
* inserted at random points. It must be treated as unsorted.
Это случайно не то, что Васм беспокоит.
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35150337
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321ну, поленились.
а реализовать руками? (в ф-ии)

кажется должно получится 2 вложенных FOR LOOP-а по индексно сортированным наборам. Нет?не-е-ет. функцию писать моя очередь лениться.

два вложенных FOR LOOP-а - это наверное получился бы аналог Nested Loop. а вот если открыть два курсора, бежать по ним поэлементно сравнивая значения, возвращая наружу меньшее, то это наверное получится Merge Join. но писать такую функцию, да еще и заморачиваться с limit, offset - лень.

сейчас просто убрал из запроса ORDER BY. все работает ок, вот только если постгрес когда-нибудь научиться делать FULL JOIN иначе чем через Merge, сортировка может слететь.

Andrey Daeron Это случайно не то, что Васм беспокоит.кажется, нет. если я правильно понимаю, они это уже реализовали, по крайней мере в ./src/backend/executor/nodeMergejoin.c я не заметил никакого "final merge", но наоборот в описании алгоритма есть работа с маркерами: "mark inner position", "restore inner position to mark".
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35150389
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatдва вложенных FOR LOOP-а - это наверное получился бы аналог Nested Loop.да я уж подумал было, что соврал слегка. внутренний цикл будет, если не ошибаюсь, всегда по наново открытой выборке. (т.к. вход (возврат) боковой в уже открытый FOR...LOOP ,кажется, не предусмотрен)
LeXa NalBatа вот если открыть два курсора, бежать по ним поэлементно сравнивая значения, возвращая наружу меньшее, то это наверное получится Merge Join.да ,похоже.
И, похоже, может не получиться быстро - про скорость бега вдоль курсоров тут по соседству не очень то радостно обсуждается. Хотя - надо пробовать.
...
Рейтинг: 0 / 0
убрать ненужную сортировку после FULL OUTER JOIN
    #35157783
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
резюме такое :-( "it might be time to put in some more work, if we really care about improving this "

http://archives.postgresql.org/pgsql-general/2008-02/msg01272.php
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / убрать ненужную сортировку после FULL OUTER JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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