powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / join+left join оптимизатор 2.5
6 сообщений из 6, страница 1 из 1
join+left join оптимизатор 2.5
    #38413320
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, коллеги.

Есть, если очень схематично, вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
select * 
from s
join d on d.id=s.id join dd on d.id=dd.id
left join t on s.id=t.id
left join v on s.id= v.id
where dd.aa=:param


работает мгновенно.
Если сделать вот такой копипаст:
Код: sql
1.
2.
3.
4.
5.
6.
select * 
from s
left join t on s.id=t.id
left join v on s.id= v.id
join d on d.id=s.id join dd on d.id=dd.id
where dd.aa=:param

то оптимизатору сносит башню, "мгновенно" легким движением руки становится "тормозом". Обычно стараюсь избегать конструкций типа сначала лефт, потом иннер,но тут уж очень сильно бросилась в глаза "декларативность" языка SQL. под псевдонимом v прячется довольно витиеватся вьюшка, может она виновата?

СтОит пытаться сделать тесткэйз?
У меня в голове со времен царя гороха сидит, что так делать не надо, а вот почему уже не помню, вроде бы известная "особенность реализации".
...
Рейтинг: 0 / 0
join+left join оптимизатор 2.5
    #38413325
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

насколько я в курсе, left/right join выполняются последовательно, в порядке их перечисления (в отличие от целиком явного или неявного inner join), поэтому располагать таблицы в таком джойне надо от меньшей к большей (по размеру). Так что в данном случае от перестановки мест слагаемых результат хоть и не меняется, но вот последовательность действий может быть тяжелой для сервера.
...
Рейтинг: 0 / 0
join+left join оптимизатор 2.5
    #38413355
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

замечал такое за оптимизатором не один раз. Поэтому взял за правило сначала располагать inner join, и только потом left join. right join не пользуюсь вообще всегда привожу к left join.

Хотя по идее оптимизатор мог бы догадаться переставить порядок соединения таблиц если это возможно.

P.S. Надо бы вечерком на тройке глянуть может это уже изменили.
...
Рейтинг: 0 / 0
join+left join оптимизатор 2.5
    #38413580
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в тройке тоже самое

Код: sql
1.
2.
3.
4.
select count(*)
from horse
inner join color on horse.code_color = color.code_color
left join breed on horse.code_breed = breed.code_breed



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
План
PLAN JOIN (JOIN (COLOR NATURAL, HORSE INDEX (FK_HORSE_REF_COLOR)), BREED INDEX (PK_BREED))

------ Performance info ------
Prepare time = 0ms
Execute time = 1s 654ms
Avg fetch time = 1 654,00 ms
Current memory = 138 278 320
Max memory = 138 565 344
Memory buffers = 8 192
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 2 056 353

Код: sql
1.
2.
3.
4.
select count(*)
from horse
left join breed on horse.code_breed = breed.code_breed
inner join color on horse.code_color = color.code_color



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
План
PLAN JOIN (JOIN (HORSE NATURAL, BREED INDEX (PK_BREED)), COLOR INDEX (PK_COLOR))

------ Performance info ------
Prepare time = 0ms
Execute time = 2s 668ms
Avg fetch time = 2 668,00 ms
Current memory = 138 278 112
Max memory = 138 565 344
Memory buffers = 8 192
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 3 432 225
...
Рейтинг: 0 / 0
join+left join оптимизатор 2.5
    #38413588
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

тикет на эту тему уже есть CORE-1239
...
Рейтинг: 0 / 0
join+left join оптимизатор 2.5
    #38414155
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистикет на эту тему уже естьЗначит память мне не изменила насчет известности, только вот точно вспомнить не смог. :)
Ну что ж будем ходить по проторенной тропке, сначала иннеры, потом лефты.
Этот запрос довольно изощренно формируется с клиента динамически, кусок:
Код: sql
1.
2.
3.
from s
left join t on s.id=t.id
left join v on s.id= v.id

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


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