powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Соединение таблиц JOIN или WHERE ?
16 сообщений из 16, страница 1 из 1
Соединение таблиц JOIN или WHERE ?
    #32663759
Виталя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вообщем по совету Мимопроходящего, помещаю свой вопрос в эту тему..

Допустим есть у меня 2 таблицы А и B соединенные по какому - то полю (пусть индекс создан) A.id = B.id_A. И хочу я запрос составить, как будет корректней написать
select ...
from A
left join B on A.id = B.id_A

или

select ...
from A,B
where A.id = B.id_A

Я всегда думала что правильно - 1-й в-т - ну типа для каждой записи A ищется соотв. по условию запись из В, и таким образом формируется результат, а второй - не правильно - там вначале формируются все варианты А на В, а затем из этой громадины перемноженной отбираются те записи, для которых выполняется условие where A.id = B.id_A.

Но что-то последнее время довольно часто натыкаюсь на второй вариант, может на самом деле он выполняется аналогично первому,или тут есть какая-то заморочка на тип БД в которой запрос пишется, или на наличие/отсутствие индекса...

Я послушала бы чье-то мнение по этому поводу ...
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32663762
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запросы неэквивалентны.
У тебя там LEFT JOIN .
А это совсем не то же самое, что where A.id = B.id_A
Отличие OUTER от INNER JOIN 'а знаешь?
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32663771
Виталя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отличие то я понимаю,
where A.id=B.id_A , будет по рез. исполнения эквивалентно inner, но тут как бы 2 подвопроса
1. Так же он будет выполняться (where экв. inner join ?) (я думала что inner выполняется так - для кажд. записи A находим все соотв. по условию записи в B, а те для которых не нашли убираем)
2.Сущ. ли конструкция where экв. left join по рез. віполнения (возможно какие-то условные обозначения типа "*="
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32663776
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталяотличие то я понимаю,
where A.id=B.id_A , будет по рез. исполнения эквивалентно inner, но тут как бы 2 подвопроса
1. Так же он будет выполняться (where экв. inner join ?)В простейшем случае - да.
Виталя2.Сущ. ли конструкция where экв. left join по рез. выполнения (возможно какие-то условные обозначения типа "*="Это у Oracle есть.
Приблизительным смысловым эквивалентом (для ограниченный случаев) будет конструкция:

Код: plaintext
1.
2.
3.
4.
select A.*,
       (select B.Field1
         from B
         where A.id = B.id_A)
from A
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32663787
Виталя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня очень смущают слова "в простейшем случае" и "приблизительно".

Ведь говорить о том что процесс
1. Вначале "перемножим" A(10 000 записей) на B(10 000 записей) (получим 100 000 000 записей), а затем выберем по условию того же inner нужные (5 000).

и

процесс
2. "Пройдя" по A(10000) прикрепляем записи из B по условию, и выкидывая из A, те записи для которых не нашли.

эквивалентны даже приблизительно - неверно - во втором случае временно хранить 100 000 000 записей не нужно...
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32663837
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталя
1. Вначале "перемножим" A(10 000 записей) на B(10 000 записей) (получим 100 000 000 записей), а затем выберем по условию того же inner нужные (5 000).

Такого никогда не произойдет. Для понятности процесса можно (и нужно) представить INNER JOIN как вложенные циклы, где необходимые условия проверяются на каждом уровне вложенности.

Добавлю также, что JOIN выполняется в процессе фетча, т.е. новые записи будет вычитываться из таблиц и объединяться по мере надобности. JOIN (без сортировки) никогда не приводит к формированию какого-либо промежуточного буфера.
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664427
Виталя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Замечательно - что при использовании JOIN "перемножения" не произойдет, но я вообще-то спрашивала произойдет ли оно при использовании связки по where ? или where будет обрабатываться так же как и inner join ?
меня интересует сам процесс формирования результата, а не результат...
что более верно where или join ?
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664538
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой вариант для нахождения ответа на ваш вопрос: посмотрите статистику выполнения запросов, если разницы нет, то... значит нет ёё.

А корректнее, некоректнее... Всё равно перенос логики работы с версии на версии даже одной СУБД не происходит идеально гладко, а уж тем более с одного сервера на другой. Короче - если нет разницы - зачем платить больше?

Ну... может быть если только выбран какой-либо определенный стиль написания SQL clause в команде
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664761
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВиталяЗамечательно - что при использовании JOIN "перемножения" не произойдет, но я вообще-то спрашивала произойдет ли оно при использовании связки по where ? или where будет обрабатываться так же как и inner join ?
меня интересует сам процесс формирования результата, а не результат...
что более верно where или join ?

INNER JOIN полностью эквивалентен неявному джойну (твой WHERE) как по процессу, так и по результату. LEFT JOIN - вещь немного другая и отличается результатом, хотя процесс и там точно такой же.
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664878
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
INNER JOIN полностью эквивалентен неявному джойну (твой WHERE) как по процессу, так и по результату.
Насчет результата согласен, а по процессу вопросик:
В запросе
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t1
inner join t2  t_2 on t1.id = t2.id
Табличка t1 будет натуралом читаться, а t2 по индексу.

А если "перевернуть" запрос
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t2
inner join t1  t_2 on t1.id = t2.id
То соответственно t2 натуралом пойдет, а t1 по индексу.

В неявном join-e оптимизатор сам выберет, какую таблицу как читать. Как он это сделает? Уж не исходя ли из порядка перечисления таблиц во from?

Ну и как это при большем количестве таблиц выглядеть будет?

И еще вопрос.
Я частенько при помощи join-ов неявно планами рулю. Вот интересно, в двойке в этом отношении изменения будут?
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664918
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ неявном join-e оптимизатор сам выберет, какую таблицу как читать. Как он это сделает? Уж не исходя ли из порядка перечисления таблиц во from?
оптимизатору пофиг, в каком порядке ты таблицы укажешь. он постарается начать объединение с самой маленькой таблицы.
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664952
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда такие сведения?
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664968
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ частенько при помощи join-ов неявно планами рулю. Вот интересно, в двойке в этом отношении изменения будут?
ты лучше расскажи, как тебе удалось добиться влиять на оптимизатор? я вот сколько чего не меняю местами - он всё равно по своему делает. вообщем-то так и должно быть - на то он и оптимизатор.
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32664990
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛентяйНасчет результата согласен, а по процессу вопросик:
В запросе
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t1
inner join t2  t_2 on t1.id = t2.id
Табличка t1 будет натуралом читаться, а t2 по индексу.

А если "перевернуть" запрос
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t2
inner join t1  t_2 on t1.id = t2.id
То соответственно t2 натуралом пойдет, а t1 по индексу.

Чушь. Оба раза план будет одинаковым. То, что ты говоришь, будет при LEFT JOIN, что, впрочем, вполне понятно.

ЛентяйВ неявном join-e оптимизатор сам выберет, какую таблицу как читать. Как он это сделает? Уж не исходя ли из порядка перечисления таблиц во from?

Никак нет. Исходя из стоимости выполнения запроса, определяемой статистикой, размером таблиц и используемыми индексами.

ЛентяйНу и как это при большем количестве таблиц выглядеть будет?

Точно так же - порядок выберет оптимизатор.

ЛентяйЯ частенько при помощи join-ов неявно планами рулю. Вот интересно, в двойке в этом отношении изменения будут?

Гонишь ведь ;-) Рулить планами можно только путем LEFT vs INNER. Но тут можно огрести на ORDER BY.
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32665099
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
Чушь. Оба раза план будет одинаковым. То, что ты говоришь, будет при LEFT JOIN, что, впрочем, вполне понятно.
Вот планы для запросов для FB 1.5 4481 под XP :
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t1
inner join t2  t_2 on t1.id = t2.id
Код: plaintext
1.
2.
3.
4.
5.
План
PLAN JOIN (T1 NATURAL,T_2 INDEX (PK_T2))

Адаптированный план
PLAN JOIN (T1 NATURAL,T_2 INDEX (PK_T2))

Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t2
inner join t1  t_2 on t1.id = t2.id
Код: plaintext
1.
2.
3.
4.
5.
План
PLAN JOIN (T2 NATURAL,T_2 INDEX (PK_T1))

Адаптированный план
PLAN JOIN (T2 NATURAL,T_2 INDEX (PK_T1))


dimitr
ЛентяйВ неявном join-e оптимизатор сам выберет, какую таблицу как читать. Как он это сделает? Уж не исходя ли из порядка перечисления таблиц во from?

Никак нет. Исходя из стоимости выполнения запроса, определяемой статистикой, размером таблиц и используемыми индексами.
А вот для неявных join-ов
Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t1, t2
where t1.id = t2.id
Код: plaintext
1.
2.
3.
4.
5.
План
PLAN JOIN (T1 NATURAL,T_2 INDEX (PK_T2))

Адаптированный план
PLAN JOIN (T1 NATURAL,T_2 INDEX (PK_T2))

Код: plaintext
1.
2.
3.
select t1.id, t1.kol, t2.id, t2.kol
from t2, t1
where t1.id = t2.id
Код: plaintext
1.
2.
3.
4.
5.
План
PLAN JOIN (T2 NATURAL,T_2 INDEX (PK_T1))

Адаптированный план
PLAN JOIN (T2 NATURAL,T_2 INDEX (PK_T1))

Может такие результаты потому что таблички тестовые и в них данных мало?


ЛентяйЯ частенько при помощи join-ов неявно планами рулю. Вот интересно, в двойке в этом отношении изменения будут?

Гонишь ведь ;-) Рулить планами можно только путем LEFT vs INNER. Но тут можно огрести на ORDER BY.
По поводу явных join я с left всегда планами рулил, а в какой-то момент показалось что это и с inner работает...
Кроме того помогает SP первой поставить, а к ней таблички join-ом ...
А по поводу order by это я в курсе...
...
Рейтинг: 0 / 0
Соединение таблиц JOIN или WHERE ?
    #32665145
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛентяйМожет такие результаты потому что таблички тестовые и в них данных мало?

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


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