Имя: Пароль:
1C
1С v8
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" и "="
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший