Конференция "Базы" » Порядок таблиц в left join [MSSQL]
 
  • Ega23 © (05.03.08 13:10) [0]
    Что-то не пойму никак..
    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)


    ?

    И так и так одинаково по времени получается...
  • b z (05.03.08 13:21) [1]
    Не мудрено ... а в чем вопрос?
  • Ega23 © (05.03.08 13:23) [2]
    пардон, очепятка

    Select ....
    from Table1 T1 left join Table2 on (t1.Fld=T2.Fld)


    или

    Select ....
    from Table2 T2 left join Table1 on (t2.Fld=T1.Fld)

  • Johnmen © (05.03.08 13:30) [3]
    Разница есть.
    Но при таких количествах записей, её заметить трудно. А порой и невозможно...
  • Ega23 © (05.03.08 13:36) [4]
    Хорошо. Table1 - 4.000.000
    Tabl2 - 50.000

    условие в where - Table2.Fld in (от 1 до 50 значений).
  • Johnmen © (05.03.08 13:48) [5]

    > Ega23 ©   (05.03.08 13:36) [4]

    Не понял, это про что?
  • Правильный_Вася (05.03.08 14:04) [6]
    у них разница в результирующем наборе, в первую очередь
  • stone (05.03.08 14:25) [7]

    > Ega23 ©   (05.03.08 13:10)  

    для оптимизации см. варианты джойна (loop, hash) также можно указать принудительный порядок джойна используя OPTION (FORCE ORDER)
  • Ega23 © (05.03.08 14:40) [8]

    > stone   (05.03.08 14:25) [7]


    Тёзка, спасибо!
  • DiamondShark © (07.03.08 15:17) [9]

    > Ega23 ©   (05.03.08 13:23) [2]

    А как лучше:
    3 - 8
    или
    8 - 3
    ?

    left join некоммутативная операция, поэтому, спрашивать "или" -- по меньшей мере, странно.
  • Anatoly Podgoretsky © (08.03.08 11:57) [10]
    Другое дело, если первое LEFT OUTER JOIN, а второе RIGHT OUTER JOIN, тогда можно было бы еще говорить, а так полная бессмыслица, результаты абсолютно разные. Ну или INNER JOIN
  • Правильный_Вася (09.03.08 18:15) [11]
    видимо, у него частный случай, когда что outer, что inner - дают одинаковый результат
    иначе бы уже заметил Правильный_Вася   (05.03.08 14:04) [6]
  • Anatoly Podgoretsky © (09.03.08 20:57) [12]
    Так может надо использовать INNER JOIN как самый производительный вариант?
  • Prohodil Mimo © (09.03.08 22:08) [13]
    Правильный_Вася   (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 .....

  • Правильный_Вася (10.03.08 16:04) [14]

    > Prohodil Mimo ©   (09.03.08 22:08) [13]

    ты хорошо подумал?
    а теперь проведи эксперимент
  • Prohodil Mimo © (11.03.08 16:11) [15]
    Правильный_Вася   (10.03.08 16:04) [14]
    а теперь проведи эксперимент


    Провёл.
    Получилось так, как я и говорил :о)
    Но если ещё подумать, то да, различия могут быть.
  • tesseract © (12.03.08 18:30) [16]

    > Так может надо использовать INNER JOIN как самый производительный
    > вариант?


    С чегой-то то он производительный ? Просто игнорирует несоотвествие с обоих сторон.


    > Prohodil Mimo ©   (09.03.08 22:08) [13]


    Зависит от данных и степени нормализации, при 3-ей нормализации всё одинаково.
    У меня реально на 1С-ке при SQL запросах результаты разных join разные, 2 недели репой бился.  

    ЗЫ: убил бы авторов парсера SQL от MS.
  • Правильный_Вася (13.03.08 11:04) [17]

    > Зависит от данных и степени нормализации, при 3-ей нормализации
    > всё одинаково.

    байки
    представь 2 таблицы, одна из которых ссылается на другую 1:N, при этом в ней есть ссылки не на все записи
    и попробуй
  • Prohodil Mimo © (13.03.08 23:08) [18]
    Правильный_Вася   (13.03.08 11:04) [17]
    вот только в этом случае и получится по разному. Но если каждая запись ссылатся на запись из другой таблицы, то оба запроса будут одинаковы.
  • Правильный_Вася (14.03.08 10:50) [19]

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

    тогда outer join и не нужен
    ведь он нужен для случаев отсутствия, чтоб null'ы подставить
 
Конференция "Базы" » Порядок таблиц в left join [MSSQL]
Есть новые Нет новых   [134432   +20][b:0][p:0.001]