Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
Диам
Member

Откуда:
Сообщений: 1497
Собственно, вопрос в заголовке. Есть ли какая-нибудь разница для компилятора - пишу я
A LEFT JOIN B

или
B RIGHT JOIN A

?
21 авг 15, 14:32    [18051707]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А зачем нужена операция"<" если есть операция ">"?

Сообщение было отредактировано: 21 авг 15, 14:38
21 авг 15, 14:37    [18051738]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21241
Для компилятора - никакой. А вот на план выполнения теоретически это может и оказать влияние.
Не знаю, как с этим обстоит дело именно в MS SQL (если интересно - попробуйте покопать документацию поглубже), но на некоторых серверах БД (например, MySQL) при наличии хотя бы одного стороннего связывания фиксируется порядок сканирования таблиц.
21 авг 15, 14:42    [18051763]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Диам
Собственно, вопрос в заголовке. Есть ли какая-нибудь разница для компилятора - пишу я
A LEFT JOIN B

или
B RIGHT JOIN A

?


Понятно, что запрос с LEFT можно переписать на RIGHT и наоборот. За 10 лет я писал RIGHT JOIN наверное раза 2 всего. И это были какие-то хотропопые ситуации типа.


A LEFT JOIN B INNER JOIN C INNER JOIN D RIGHT JOIN E

где имела важность последовательность. И это всё равно можно было переписать , но было лень
21 авг 15, 14:52    [18051813]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
o-o
Guest
a_voronin
A LEFT JOIN B INNER JOIN C INNER JOIN D RIGHT JOIN E

в этой конструкции вы от какой таблицы собрались оставлять все строки?
если от A, то вы их уже теряете на inner join C
declare @a table (id int);
insert into @a values (1),(2),(3),(4);

declare @b table (id int);
insert into @b values (1),(2),(3),(5);

declare @c table (id int);
insert into @c values (1),(2),(5),(6);

declare @d table (id int);
insert into @d values (1),(2),(7),(8);

select *
from @a a left  join @b b on a.id = b.id
---
1	1
2	2
3	3
4	NULL

select *
from @a a left  join @b b on a.id = b.id
          inner join @c c on b.id = c.id;
---
1	1	1
2	2	2

select * 
from @a a left join @b b on a.id = b.id
          inner join @c c on b.id = c.id
          right join @d d on c.id = d.id;
---
1	1	1	1
2	2	2	2
NULL	NULL	NULL	7
NULL	NULL	NULL	8
21 авг 15, 15:25    [18052043]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
в этой конструкции вы от какой таблицы собрались оставлять все строки?
если от A, то вы их уже теряете на inner join C


Никто с этим не спорит и вы можете нацепить черный пояс с надписью "ВЛАДЕЮ ДЖОЙНАМИ".

Вопрос в том, в каком случае RIGHT JOIN может быть целесообразен . То есть без него не получиться или как минимум не красиво будет
21 авг 15, 16:08    [18052369]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
o-o
в этой конструкции вы от какой таблицы собрались оставлять все строки?
если от A, то вы их уже теряете на inner join C


Никто с этим не спорит и вы можете нацепить черный пояс с надписью "ВЛАДЕЮ ДЖОЙНАМИ".

Вопрос в том, в каком случае RIGHT JOIN может быть целесообразен . То есть без него не получиться или как минимум не красиво будет
Таких случаев не существует.
RIGHT JOIN абсолютно не нужен.
Но пусть будет. Для полноты и симметрии!
21 авг 15, 16:35    [18052526]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
o-o
Guest
a_voronin
Никто с этим не спорит и вы можете нацепить черный пояс с надписью "ВЛАДЕЮ ДЖОЙНАМИ".
Вопрос в том, в каком случае RIGHT JOIN может быть целесообразен . То есть без него не получиться или как минимум не красиво будет

лично я к ответу Гавриленко плюсую.
а пояс себе нацепите, надпись можете не менять, мы уже давно привыкли
21 авг 15, 16:37    [18052543]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Вот тут индус высказывает интересную мысль. Что мы с вами владеем языками, где текст пишется слева направо.

http://blog.sqlauthority.com/2010/11/28/sql-server-challenge-puzzle-why-does-right-join-exists/

Но есть языки, например иврит, где текст идёт справа налево. Так вот он намекает на то, что израильтянам будет удобней RIGHT JOIN.
21 авг 15, 17:11    [18052724]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
Вот тут индус высказывает интересную мысль. Что мы с вами владеем языками, где текст пишется слева направо.

http://blog.sqlauthority.com/2010/11/28/sql-server-challenge-puzzle-why-does-right-join-exists/

Но есть языки, например иврит, где текст идёт справа налево. Так вот он намекает на то, что израильтянам будет удобней RIGHT JOIN.
Традиционно китайцы писали сверху вниз справа налево.
Для них что предлагают?
21 авг 15, 17:55    [18053017]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
o-o
Guest
a_voronin
Но есть языки, например иврит, где текст идёт справа налево.

T-SQL не RTL,
хочешь-не хочешь, читать будешь слева направо.
привыкший читать наоборот сперва должен перестроиться и начать читать в непривычном направлении,
прочесть слева направо до right join, изменить направление, вычитать таблицы соединения, вернуться и продолжить чтение.
получаем полное ФРУ
+ ФРУ


[сегодня меня точно забанят]
21 авг 15, 17:58    [18053028]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
a_voronin
Но есть языки, например иврит


шаббат шалом
21 авг 15, 18:05    [18053049]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
нет o-o,

вам надо сосредоточиться и представить себя агентом Массада, который ковыряется в базе счетов, которую Массад украл у АНБ, которую АНБ украло у Саудовской Аравии, и где вы ищите финансовые потоки Алькаиды. Только тогда вас осенит, что такой писать запрос справа налево с RIGHT JOIN!!!

select * from @a a left join @b b on a.id = b.id left join @c c on b.id = c.id left join @d d on c.id = d.id;

select * from @d d right join @c c on c.id = d.id right join @b b on b.id = c.id right join @a a on a.id = b.id;
21 авг 15, 18:28    [18053121]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
o-o
Guest
RTL (правильная ссылка)
21 авг 15, 18:33    [18053132]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Диам,

С точки зрения смысла запроса, разницы между LEFT и RIGHT соединением может быть и нет, одно всегда можно выразить через другое. Может быть есть стилистическая разница, что хотел сказать автор, когда писал RIGHT JOIN. Это вопрос дискуссионный – не буду в эту дискуссию ввязываться. За себя скажу, что почти никогда не пользуюсь RIGHT JOIN.

Но вопрос был про компилятор (видимо, оптимизатор). Так вот, с точки зрения оптимизатора – разница есть.

Дело в том, что оптимизатор имеет дело с деревом операторов, которое получено после синтаксического разбора запроса. Если в запросе написано RIGHT JOIN, то дерево будет соответствующее.

use opt;
go
select
	*
from 
	t1
	right outer loop join t2 on t1.a = t2.b


Msg 8622, Level 16, State 1, Line 3
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.


Да, перестановки возможны, но каждая перестановка – это шаг оптимизации, который приближает к таймауту. Т.е. если бы ресурсы были бесконечные, то можно было бы сказать – для оптимизатора нет разницы. Но на практике, разница есть, т.к. число операций преобразования дерева операторов ограничено.

Какая вообще разница в порядке соединения таблиц?

Огромная!

Помимо того, что в результате правильного порядка можно на ранней стадии сильно уменьшить число строк, есть еще разница в операторах плана выполняющих соединений.

Nested Loops – просто не умеет выполнять правое соединение. Что видно, в примере выше.

Merge Join – может стать many-to-many и использовать tempdb, что будет медленно.

Hash Join – может использовать бОльшую таблицу для Build входа и перерасходовать память, а то и делать spill в tempdb.

Поэтому, оптимизатор имеет около сотни правил про перестановки соединений, замену LEFT на RIGHT и другие виды преобразований. Я говорил подробно про соединения на 24HOPPASS в этом году и на тему перестановк в том числе. Можете поискать, послушать, там с примерами, должно быть понятно.
21 авг 15, 20:16    [18053418]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
o-o
Guest
вот. теперь все на своих местах.
Америка всегда недолюбливала арабов.
пусть используют RIGHT JOIN, им не достанется NESTED LOOPS!
21 авг 15, 20:57    [18053496]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен Right JOIN, если можно пользоваться LEFT JOIN?  [new]
vba-dev
Member

Откуда:
Сообщений: 36
SomewhereSomehow, спасибо за подробные объяснения. Про замену одного другим-это и так ясно. А вот новые тонкости вы мне открыли :).
Было очень полезно.
21 авг 15, 23:23    [18053920]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить