Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Избыточная сортировка при MERGE JOIN / 5 сообщений из 5, страница 1 из 1
29.04.2015, 12:21
    #38948426
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избыточная сортировка при MERGE JOIN
Решил тут посравнивать алгоритмы соединения 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
29.04.2015, 14:45
    #38948671
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избыточная сортировка при MERGE JOIN
Симонов ДенисПрав ли я что если потоки уже отсортированы то MERGE будет дешевле HASH?
скорее да, чем нет

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

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

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


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