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

Разъясните, пожалуйста, в как определяется порядок выполнения join-ов. Например, - есть два запроса:

1)
SELECT     ...
FROM         dbo.tblProd RIGHT OUTER JOIN
                      dbo.tblSalD ON dbo.tblSalD.Prod_id = dbo.tblProd.Prod_Id RIGHT OUTER JOIN
                      dbo.tblSalH ON dbo.tblSalH.Invoice_id = dbo.tblSalD.Invoice_id LEFT OUTER JOIN
                      dbo.tblOutLets ON dbo.tblOutLets.O_id = dbo.tblSalH.O_ID LEFT OUTER JOIN
                      dbo.tblCustomers ON dbo.tblCustomers.Cust_Id = dbo.tblSalH.Cust_id
WHERE     (DATEPART(year, dbo.tblSalH.Date) = 2014) AND (DATEPART(month, dbo.tblSalH.Date) = 10)

и
2)
SELECT     ...
FROM         dbo.tblSalH LEFT OUTER JOIN
                      dbo.tblSalD ON dbo.tblSalH.Invoice_id = dbo.tblSalD.Invoice_id LEFT OUTER JOIN
                      dbo.tblProd ON dbo.tblSalD.Prod_id = dbo.tblProd.Prod_Id LEFT OUTER JOIN
                      dbo.tblOutLets ON dbo.tblOutLets.O_id = dbo.tblSalH.O_ID LEFT OUTER JOIN
                      dbo.tblCustomers ON dbo.tblCustomers.Cust_Id = dbo.tblSalH.Cust_id
WHERE     (DATEPART(year, dbo.tblSalH.Date) = 2014) AND (DATEPART(month, dbo.tblSalH.Date) = 10)


Так вот, первый выполняется, второй нет (или очень долго)

. Вопрос почему, как определяется порядок соединения в подобных запросах?
13 ноя 14, 16:29    [16841458]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
user7777
как определяется порядок соединения в подобных запросах?

смотрите план...сиквел сам определяет порядок, если нет явного force order
13 ноя 14, 16:31    [16841478]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
Вопрос почему, как определяется порядок соединения в подобных запросах?

Оптимизатор выберает наилучший по его мнению план. Которому и следует.

И ваши запросы - они разные. Почему вы ждете от них одинакового времени выполнения ?
13 ноя 14, 16:31    [16841484]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
Knyazev Alexey,

а как знать что нужно писать так как в первом запросе, а не так как во втором?
13 ноя 14, 16:34    [16841499]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
Glory,

разные в смысле должны вернуть разные данные?
13 ноя 14, 16:35    [16841504]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
а как знать что нужно писать так как в первом запросе, а не так как во втором?

Надо писать запросы, которые возвращают нужный результат.
А не пытаться сделать время выполнения разных запросов одинаковым.
13 ноя 14, 16:36    [16841521]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
разные в смысле должны вернуть разные данные?

Вы не понимаете разницы между RIGHT и LEFT JOIN-ми ?
13 ноя 14, 16:37    [16841526]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
Glory,
понимаю, но не понимаю разницы между
tbl1 left join tbl2

и
tbl2 right join tbl1
13 ноя 14, 16:39    [16841544]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
user7777
Glory,
понимаю, но не понимаю разницы между
tbl1 left join tbl2


и
tbl2 right join tbl1


в вашем запросе не подобная инструкция
13 ноя 14, 16:46    [16841621]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
Glory,
понимаю, но не понимаю разницы между
tbl1 left join tbl2


и
tbl2 right join tbl1

Для такого примера разницы не будет
Но у вас то не 2 таблицы
13 ноя 14, 16:47    [16841624]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
вот я и прошу мне помочь понять , разъяснить ....
так как результат, по идее, должен быть одинаковым
13 ноя 14, 16:50    [16841659]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
user7777
вот я и прошу мне помочь понять , разъяснить ....
так как результат, по идее, должен быть одинаковым


по чьей идее?

сравните:

declare @t1 table ( id int, a char(2) )
declare @t2 table ( id int, b char(2) )
declare @t3 table ( id int, c char(2) )

insert into @t1
select 1, 'A1'
union all
select 2, 'A2'
union all
select 3, 'A3'

insert into @t2
select 1, 'B1'
union all
select 3, 'B3'

insert into @t3
select 2, 'C2'
union all
select 3, 'C3'


select t1.*, t2.*, t3.*  
  from @t1 t1
    left join @t2 t2 on t1.id = t2.id
    left join @t3 t3 on t2.id = t3.id

select t1.*, t2.*, t3.* 
  from @t2 t2
    right join @t1 t1 on t1.id = t2.id
    right join @t3 t3 on t2.id = t3.id
13 ноя 14, 16:51    [16841670]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
Knyazev Alexey,
спасибо за ответ...

но, вроде как, у меня так:

declare @t1 table ( id int, a char(2) )
declare @t2 table ( id int, b char(2) )
declare @t3 table ( id int, c char(2) )

insert into @t1
select 1, 'A1'
union all
select 2, 'A2'
union all
select 3, 'A3'

insert into @t2
select 1, 'B1'
union all
select 3, 'B3'

insert into @t3
select 2, 'C2'
union all
select 3, 'C3'


select t1.*, t2.*, t3.*  
  from @t1 t1
    left join @t2 t2 on t1.id = t2.id
    left join @t3 t3 on t2.id = t3.id

select t1.*, t2.*, t3.* 
  from @t3 t3
    right join @t2 t2 on t3.id = t2.id
    right join @t1 t1 on t1.id = t2.id
13 ноя 14, 17:03    [16841758]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
Knyazev Alexey,

сейчас еще раз проверю
13 ноя 14, 17:04    [16841768]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
user7777
Guest
что-то я действительно намутил не то, буду разбираться... всем спасибо за ответы
13 ноя 14, 17:09    [16841801]     Ответить | Цитировать Сообщить модератору
 Re: порядок выполнения join в одном запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
user7777
что-то я действительно намутил не то, буду разбираться... всем спасибо за ответы

Вы уберите WHERE (DATEPART(year, dbo.tblSalH.Date) = 2014) AND (DATEPART(month, dbo.tblSalH.Date) = 10) и сразу увидите, чем различаются результаты
13 ноя 14, 17:22    [16841892]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить