powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Избыточная сортировка при MERGE JOIN
5 сообщений из 5, страница 1 из 1
Избыточная сортировка при MERGE JOIN
    #38948426
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил тут посравнивать алгоритмы соединения MERGE JOIN vs HASH JOIN. По идее MERGE JOIN должен иметь преимущество когда потоки уже отсортированы по полям соединения. Но как оказалось FB не умеет распознавать когда потоки уже отсортированы

Примеры в 2.5

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t1 as (
  select
    name as name,
    count(*) as cnt
  from horse
  group by 1
),
t2 as (
  select
    name_en as name_en,
    count(*) as cnt
  from horse
  group by 1
)
select count(*)
from t1 join t2 on t1.name = t2.name_en


Код: plaintext
PLAN MERGE (SORT (T2 HORSE ORDER HORSE_IDX_NAME_EN), SORT (T1 HORSE ORDER HORSE_IDX_NAME))

хорошо попытаемся вырубить навигацию по индексу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t1 as (
  select
    name || '' as name,
    count(*) as cnt
  from horse
  group by 1
),
t2 as (
  select
    name_en || '' as name_en,
    count(*) as cnt
  from horse
  group by 1
)
select count(*)
from t1 join t2 on t1.name = t2.name_en



Код: plaintext
PLAN MERGE (SORT (SORT (T2 HORSE NATURAL)), SORT (SORT (T1 HORSE NATURAL)))

как видим всегда происходит повторная сортировка, хотя она по идее уже не нужна. В тройке спровоцировать MERGE сейчас вообще не возможно даже явно указав план.

Прав ли я что если потоки уже отсортированы то MERGE будет дешевле HASH? Если да, то можно ли будет подкрутить оптимизатор в тройке, чтобы он распознавал когда потоки уже отсортированы и в этом случае применял MERGE, иначе делал HASH JOIN?

P.S. Не пытайтесь уловить смысл запроса он тут только в качестве демонстрации и практического применения не имеет.
...
Рейтинг: 0 / 0
Избыточная сортировка при MERGE JOIN
    #38948671
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПрав ли я что если потоки уже отсортированы то MERGE будет дешевле HASH?
скорее да, чем нет

Симонов ДенисЕсли да, то можно ли будет подкрутить оптимизатор в тройке, чтобы он распознавал когда потоки уже отсортированы и в этом случае применял MERGE, иначе делал HASH JOIN?
нельзя. Там проблема не только в оптимизаторе, но еще и в коде merge-джойнов.
...
Рейтинг: 0 / 0
Избыточная сортировка при MERGE JOIN
    #38948696
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrнельзя. Там проблема не только в оптимизаторе, но еще и в коде merge-джойнов.

В том смысле что туда сортировка потоков намертво вшита? Хотя бы явно указывать в плане что использовать MERGE или HASH будет?
...
Рейтинг: 0 / 0
Избыточная сортировка при MERGE JOIN
    #38948787
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там алгоритм требует внешней сортировки. Т.е. подкрутить под устранение лишней сортировки при плане SORT скорее всего получится (хотя в тройке не обещаю), но вот избежать повторной сортировки при плане ORDER в ближайшей перспективе не выйдет.
...
Рейтинг: 0 / 0
Избыточная сортировка при MERGE JOIN
    #38948797
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

если будет хотя бы первое, то уже хорошо. Ну что в тройке не обязательно будет это понятно. И так разработка подзатянулась, ну хоть на перспективу.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Избыточная сортировка при MERGE JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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