![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Порядок таблиц в left join [MSSQL]
Ega23 © (2008-03-05 13:10:00)Что-то не пойму никак..
Table1, 30000 записей
Table2, 300 записей.
Select ....
from Table1 T1 left join Table2 on (t1.Fld=T2.Fld)
или
Select ....
from Table1 T1 left join Table2 on (t1.Fld=T2.Fld)
?
И так и так одинаково по времени получается...
Prohodil Mimo (2008-03-14 18:00:00) [1]Кщд (14.03.08 10:51) [20]
и вообще, я то тут при чём?
Prohodil Mimo (2008-03-14 18:00:00) [2]Кщд (14.03.08 10:51) [20]
для каждого случая свой вид объединения.
речь то шла об left join, а тестировалось на том, что под руку попалось.
Кщд (2008-03-14 10:51:00) [3]>Prohodil Mimo © (13.03.08 23:08) [18]
Вы используете для таких таблиц внешнее объединение?
зачем?
Правильный_Вася (2008-03-14 10:50:00) [4]
> Но если каждая запись ссылатся на запись из другой таблицы,
> то оба запроса будут одинаковы.
тогда outerjoin и не нужен
ведь он нужен для случаев отсутствия, чтоб null'ы подставить
Prohodil Mimo (2008-03-13 23:08:00) [5]Правильный_Вася (13.03.08 11:04) [17]
вот только в этом случае и получится по разному. Но если каждая запись ссылатся на запись из другой таблицы, то оба запроса будут одинаковы.
Правильный_Вася (2008-03-13 11:04:00) [6]
> Зависит от данных и степени нормализации, при 3-ей нормализации
> всё одинаково.
байки
представь 2 таблицы, одна из которых ссылается на другую 1:N, при этом в ней есть ссылки не на все записи
и попробуй
tesseract (2008-03-12 18:30:00) [7]
> Так может надо использовать INNER JOIN как самый производительный
> вариант?
С чегой-то то он производительный ? Просто игнорирует несоотвествие с обоих сторон.
> Prohodil Mimo © (09.03.08 22:08) [13]
Зависит от данных и степени нормализации, при 3-ей нормализации всё одинаково.
У меня реально на 1С-ке при SQL запросах результаты разных join разные, 2 недели репой бился.
ЗЫ: убил бы авторов парсера SQL от MS.
Prohodil Mimo (2008-03-11 16:11:00) [8]Правильный_Вася (10.03.08 16:04) [14]
а теперь проведи эксперимент
Провёл.
Получилось так, как я и говорил :о)
Но если ещё подумать, то да, различия могут быть.
Правильный_Вася (2008-03-10 16:04:00) [9]
> Prohodil Mimo © (09.03.08 22:08) [13]
ты хорошо подумал?
а теперь проведи эксперимент
Prohodil Mimo (2008-03-09 22:08:00) [10]Правильный_Вася (09.03.08 18:15) [11]
ну так у него и есть одинаковый результат.
отличия были бы, если бы после
Select ....
from Table1 T1 left join Table2 on (t1.Fld=T2.Fld)
или
Select ....
from Table2 T2 left join Table1 on (t2.Fld=T1.Fld)
былоWHERE .....
Anatoly Podgoretsky (2008-03-09 20:57:00) [11]Так может надо использовать INNER JOIN как самый производительный вариант?
Правильный_Вася (2008-03-09 18:15:00) [12]видимо, у него частный случай, когда что outer, что inner - дают одинаковый результат
иначе бы уже заметил Правильный_Вася (05.03.08 14:04) [6]
Anatoly Podgoretsky (2008-03-08 11:57:00) [13]Другое дело, если первое LEFT OUTER JOIN, а второе RIGHT OUTER JOIN, тогда можно было бы еще говорить, а так полная бессмыслица, результаты абсолютно разные. Ну или INNER JOIN
DiamondShark (2008-03-07 15:17:00) [14]
> Ega23 © (05.03.08 13:23) [2]
А как лучше:
3 - 8
или
8 - 3
?
left join некоммутативная операция, поэтому, спрашивать "или" -- по меньшей мере, странно.
Ega23 (2008-03-05 14:40:00) [15]
> stone (05.03.08 14:25) [7]
Тёзка, спасибо!
stone (2008-03-05 14:25:00) [16]
> Ega23 © (05.03.08 13:10)
для оптимизации см. варианты джойна (loop, hash) также можно указать принудительный порядок джойна используя OPTION (FORCE ORDER)
Правильный_Вася (2008-03-05 14:04:00) [17]у них разница в результирующем наборе, в первую очередь
Johnmen (2008-03-05 13:48:00) [18]
> Ega23 © (05.03.08 13:36) [4]
Не понял, это про что?
Ega23 (2008-03-05 13:36:00) [19]Хорошо. Table1 - 4.000.000
Tabl2 - 50.000
условие в where - Table2.Fld in (от 1 до 50 значений).
Johnmen (2008-03-05 13:30:00) [20]Разница есть.
Но при таких количествах записей, её заметить трудно. А порой и невозможно...