|
sql query. join vs where | ☑ | ||
---|---|---|---|---|
0
Dionis Sergeevich
18.04.14
✎
00:07
|
Что лучше джойн или условие? Интерисует разница - как отработает на СУБД. Вот пример
select * from table1 as a left join table2 as b on a.id = b.table1id и select * from table1 as a, table2 as b where a.id = b.teble1id |
|||
1
_fvadim
18.04.14
✎
00:13
|
В общем случае результат твоих запросов будет разный.
Возможны случаи совпадения. Лучше то, что лучше подходит для конкретной задачи. |
|||
2
Dionis Sergeevich
18.04.14
✎
00:14
|
(1) Готов поспорить - результат будет одинаковый. Если использовать inner join то результаты будут отличаться
|
|||
3
_fvadim
18.04.14
✎
00:15
|
(2) давай :)
table2 не содержит записей, сравни результаты |
|||
4
Kookish
18.04.14
✎
00:17
|
Готов поспорить, что первый вариант - левое соединение, второй - внутреннее.
|
|||
5
ObjectRelation Model
18.04.14
✎
00:17
|
1. LEFT
2. INNER |
|||
6
Dionis Sergeevich
18.04.14
✎
00:19
|
(4) ну да, точно. Окей, считаем что в первом варианте iner join - для чистоты эксперимента. чтобы резултат был один. Меня интерисует технически как оно отработает и как и почему повлияет на быстродействие запроса
|
|||
7
Dionis Sergeevich
18.04.14
✎
00:23
|
(3) ну ок ок) да ты прав. результаты были бы равны если бы в первом варианте внутренний джойн использовали или во втором варианте написали or a.id = NULL
|
|||
8
Kookish
18.04.14
✎
00:27
|
А оно повлияет? Покажет только эксперимент.
От второго варианта как-то нафталином попахивает, да и не очевидно, что внутреннее соединение подразумевается. Чую, что join позже появился, со всеми своими вариантами. |
|||
9
ObjectRelation Model
18.04.14
✎
00:27
|
(6) разницы нет
|
|||
10
Dionis Sergeevich
18.04.14
✎
00:33
|
(9) естью Левое соединение - внешнее. Условие по точному соответствию - внутреннее. Чтобы запросы были одинаковыми нужно либо в первом сделать внутреннее соединение либо во втором условие через ИЛИ на отсутствие значения
|
|||
11
Dionis Sergeevich
18.04.14
✎
00:33
|
(9) или ты про быстродействие запросов? =)) и про то как субд их отработает
|
|||
12
ObjectRelation Model
18.04.14
✎
00:37
|
(10) ты читал поправку в (6)?
|
|||
13
Dionis Sergeevich
18.04.14
✎
00:38
|
(12) я ее писал. Сейчас почитаю -_-
|
|||
14
_fvadim
18.04.14
✎
00:50
|
Неспешное гугление привело меня к такому выводу - джойны придумали чтоб отделить условия соединения таблиц от условий накладываемых на выборку.
ЗЫ. Сходу не смог сообразить как реализовать left и right join без join, но уже придумал :) |
|||
15
Dionis Sergeevich
18.04.14
✎
00:51
|
(14) хех) а сообразишь как срез последних сделать не используя виртуальные таблицы? =)
|
|||
16
_fvadim
18.04.14
✎
00:53
|
(15) сообразю. на мисте уже несколько раз эта тема обсасывалась :)
|
|||
17
Dionis Sergeevich
18.04.14
✎
01:01
|
(16) а без мисты? в уме просто прикинуть. или на крайний случай в консоли запросов
|
|||
18
_fvadim
18.04.14
✎
01:43
|
Прикинул. Сделал в консоли :)
|
|||
19
Dionis Sergeevich
18.04.14
✎
01:51
|
(18) ну молодца. вон в моем профиле на ИС есть публикашка по РЛС - там есть кусочек о том как сделать срез последних без виртуальных таблиц ( в РЛС вируальные таблицы нельзя использовать) - можешь сравнить)
|
|||
20
Dionis Sergeevich
18.04.14
✎
02:41
|
Так с точки зрения быстродействия что будет лучше и почему? Больше интерисует "Почему" и что происходит внутри субдшки
|
|||
21
Wobland
18.04.14
✎
03:01
|
(5) а ничо, что в варианте два сначала будет произведение, а потом на него накладётся отбор?
|
|||
22
упс
18.04.14
✎
05:20
|
(20) скорее всего будет одинаково, оптимизатор во втором случае вместо кросс-джойна сделает внутреннее соединение.
Со стопроцентной вероятностью вам могут ответить только в MS, поскольку механизмы работы оптимизатора запросов нигде не публикуются. Т.е. нигде не написано, что from a, b where a.id = b.id превратится у него в a inner join b on a.id = b.id. Если памяти много, таблицы маленькие, процессор простаивает, он, теоретически, может вообще не заморачиваться и выполнить кросс-джойн, а из него отобрать. Чтобы посмотреть что будет в вашем конкретном случае - нажмите в SSMS кнопочку "include actual execution plan" и увидите что будет в первом запросе и во втором. |
|||
23
Эмбеддер
18.04.14
✎
06:23
|
(0) разницы в быстродействии ты не заметишь. по мне так пусть программист потратит время на написание правильного запроса, чем на мнимую оптимизацию неправильного запроса (ты же сразу написал разные соединение, в первом случае left, а во втором inner join)
|
|||
24
Sammo
18.04.14
✎
07:11
|
Зуб не дам, но насколько я помню второе - это устаревшая запись. Работать будет одинаково (с нюансами озвучеными выше), но рекомендуют использовать явный join
|
|||
25
Fragster
гуру
18.04.14
✎
08:59
|
(20) сравни планы запросов, скорее всего они будут одинаковыми для "inner" и "="
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |