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

Откуда: From Russia
Сообщений: 146
Всем привет,
Внутри сложного навороченного запроса с десятком джойнов наблюдается странное поведение сиквела, которое я не могу понять.
Значит идут два подряд inner join на табличку-словарь, в которой всего 180 строк.
		INNER JOIN Dic180  AS d1
			ON d1.id = COALESCE(o.field1, omp.field2)
		INNER JOIN Dic180  AS d2
			ON d2.id = COALESCE(o.field3, omp.field4)

Здесь по идеи при перемножение кол-во строк ну ни при каком раскладе не может увеличиться (в словаре Dic180 id - PK). Однако, execution plan рисует следующую картину:
Приходит 17 строк,
Делается Clustered Index Scan по табличке Dic180, 
Делается Nested Loops (Inner Join)
Выходит 17*180 строк.
Делается Clustered Index Scan по табличке Dic180, 
Делается Nested Loops (Inner Join)
Выходит 17*180*180 строк.

Причем второй Nested Loops еще рисует warning: No join predicate.
Пробовал убирать всё лишнее, оставить только выборку из основной таблицы плюс эти два джойна, всё работает четко: 17 строк на входе, два джойна, 17 строк на выходе.
Подскажите, куда копать?
Спасибо.
22 июн 12, 10:56    [12758132]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение InnerJoin  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А можете план показать, а не пересказать?

З.Ы. Вместо вот этого - COALESCE(o.field1, omp.field2) - можно два джоина написать, а потом уже выбрать нужное значение через case.
22 июн 12, 12:17    [12758978]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение InnerJoin  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Гавриленко Сергей Алексеевич
А можете план показать, а не пересказать?

З.Ы. Вместо вот этого - COALESCE(o.field1, omp.field2) - можно два джоина написать, а потом уже выбрать нужное значение через case.

да, вы правы, я именно так уже и сделал :)
Тут получается, что когда в предикат джойна пишешь функцию, то он делает index scan и выдает полное декартово произведение таблиц, которое потом конено отфильтруется, но на время выполнение это влияет координально. А когда в предикат джойна пишешь конкретное значение, то всё рабоатет как обычно, выполняется index seek, и на выходе выдает уже профильтрованное число строк.
22 июн 12, 13:28    [12759804]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение InnerJoin  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kudep
Тут получается, что когда в предикат джойна пишешь функцию, то он делает index scan и выдает полное декартово произведение таблиц, которое потом конено отфильтруется, но на время выполнение это влияет координально. А когда в предикат джойна пишешь конкретное значение, то всё рабоатет как обычно, выполняется index seek, и на выходе выдает уже профильтрованное число строк.

Потому что сервер не может знать, что там ваша функция вычисляет.
22 июн 12, 13:36    [12759882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить