Имя: Пароль:
1C
 
соединение таблиц и условие ГДЕ
, ,
0 qeos
 
17.05.17
10:51
Возник тут у нас спор с коллегами на такую тему:

Я утверждал что условия в секции ГДЕ накладываются на результат соединения таблиц. Т.е. сначала таблицы соединяются левым или любым другим соединением, а уже на результат соединения накладывается условие.

Однако коллега утверждал иное и продемонстрировал это на примере:

ВЫБРАТЬ Т1.Рес1, Т2.Рес1
ИЗ РегистрСведений.хх КАК Т1
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хх КАК Т2
  ПО Т1.Изм1 = Т2.Изм1
    И Т1.Изм2 = т2.Изм2
ГДЕ
  Т2.Изм2 = "блабла"

в результате выполнения запроса профайлер показал что план запросов был такой:
две выборки с index seek с отбором P1 = "блабла"
и соединение nested loops этих двух таблиц

и вот получается что он прав.
но возможно, это частный случай?
если сравнивать с null Т2.Рес1, то мы видим обратную картину, т.е. сначала соединение таблиц, и уже в конце фильтр по null.

кто из нас прав-то? меня учили что ГДЕ накладывается на результат соединений...
1 Господин ПЖ
 
17.05.17
10:53
>но возможно, это частный случай?

это общий. п.э. все пихают "где" в условия соединения
2 qeos
 
17.05.17
10:55
(1) "п.э." это что?
3 Господин ПЖ
 
17.05.17
10:57
полиэстр
4 qeos
 
17.05.17
11:00
О_о
5 qeos
 
17.05.17
11:02
т.е. например сумма тоже пихнется в условия соединения?

ГДЕ
  Т1.Рес1 + Т2.Рес1 = 0
6 Одинесю
 
17.05.17
11:22
(2) поэтому
7 SanGvin
 
17.05.17
11:25
так отработало потому что соединение на равенство по полю отбора стоит.
8 AquaMan
 
17.05.17
11:29
В SQL запросе ГДЕ выполняется после соединения. Тут или 1С при трансляции изменило запрос, или оптимизатор догадался.
9 Vaflya
 
17.05.17
11:31
где выполняется после соединения, на результат
10 Vaflya
 
17.05.17
11:32
*накладывается на результат
11 ptiz
 
17.05.17
11:56
(0) "а уже на результат соединения накладывается условие." - с т.зр. логики - всё так, но с т.зр. оптимизатора sql - почему бы и раньше не наложить условие для ускорения.
12 zvial
 
17.05.17
13:54
(11) Да, именно тот случай
13 Лефмихалыч
 
17.05.17
14:38
(0) Неправы оба. Просто в данном случае СУБД построила запрос именно так. В другом случае она может выбрать другой план запроса, если, например, отбор "P1 = "блабла"" не будет иметь достаточной селективности.

Прав из вас двоих был бы тот, кто сказал, что в результате такого запроса ты всегда получишь внутреннее соединение.
А уж как именно СУБД его получит, - зависит от СУБД и конкретной ситуации.
14 Лефмихалыч
 
17.05.17
14:40
но сознательно вот так (0) для получения внутреннего соединения делают только польностью оформленные законченные мудаки.
Потому что это грабли для сопровождения - легко можно не заметить этой подковырки и долго не понимать, что происходит.
15 Fragster
 
гуру
17.05.17
14:44
если физический порядок выполнения не влияет на результат, то оптимизатор может переставлять операторы как угодно. в (0) вообще внутреннее соединение и какой-нибудь мерж/хэшмач может быть.
16 Лефмихалыч
 
17.05.17
14:46
(0) посмотри, что будет с планом запроса, если Т2.Изм2 будет булево и не индексировано, например