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

Откуда:
Сообщений: 598
Пытаясь оптимизировать один сложный запрос столнулся с неодназным поведением оптимизатора при построении Плана запроса.
Суть: надо заставить таблицы (в реале вьюшки, но я буду упрощать где можно) соединяться с right outer hash join в определенном порядке. При нормальных параметрах сервер сам выстраивает подобное соединение и использует фильтр по всем таблицам. Но когда я пытаюсь заставить его использовать только right hash хинтом, сервер использует фильтр лишь на основной таблице, что приводить к дикому сканированию по остальным.

Попытался воспроизвести простой пример на основе этой статьи.

код:
select *
from T3 
right hash join T2 
right hash join T1 
on T1.a = T2.a
on T1.b = T3.a
where T3.a < 100

select *
from T3 
right hash join T2 
right hash join T1 
on T1.a = T2.a
on T1.b = T3.a
where T1.b < 100

версия: 2008R2 (10.50.6529.0)

В моем реальном случае использовать первый вариант нет возможности.
Вопрос: почему сервер тупит в такой очевидной ситуации? и как его заставить?

Подскажите, пожалуйста, в какую сторону копать.
31 авг 18, 05:14    [21659568]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3247
Idol_111,

У меня пятничный затуп наверное, но в примере 1, когда условие на Т3 помещается в where, соотв. внешний джойн разве не превращается во внутренний?
31 авг 18, 05:34    [21659570]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Idol_111
Member

Откуда:
Сообщений: 598
Ennor Tiegael
Idol_111,

У меня пятничный затуп наверное, но в примере 1, когда условие на Т3 помещается в where, соотв. внешний джойн разве не превращается во внутренний?

в этом простом случае он превращается в inner join, ну так ничего не мешает так же сделать и во 2м случае. Разве нет?

К сообщению приложен файл. Размер - 32Kb
31 авг 18, 05:43    [21659571]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3247
Idol_111,

У вас там 3 неиндексированные кучи, и вы джойны гвоздями прибивать пытаетесь. Может, сначала с индексами поколдовать? Оно и оптимизатору попроще будет, и вам.
31 авг 18, 07:06    [21659578]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Idol_111
Member

Откуда:
Сообщений: 598
Ennor Tiegael
Idol_111,

У вас там 3 неиндексированные кучи, и вы джойны гвоздями прибивать пытаетесь. Может, сначала с индексами поколдовать? Оно и оптимизатору попроще будет, и вам.

Спасибо за совет, за индексы не беспокойтесь, я не первый раз оптимизацию провожу :).
Вы лучше по существу чего-нибудь предложите.
31 авг 18, 07:11    [21659580]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Idol_111,

ну если я правильно понимаю, то пробовать убрать HASH из JOIN и хинт OPTION(HASH JOIN)
31 авг 18, 09:52    [21659724]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
select *
from
 T2 left hash join
 T1 on T1.a = T2.a left hash join
 T3 on T3.a = T1.b
where
 T1.b < 100
?
31 авг 18, 10:54    [21659800]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
invm
select *
from
 T2 left hash join
 T1 on T1.a = T2.a left hash join
 T3 on T3.a = T1.b
where
 T1.b < 100

?
А зачем здесь LEFT, если T1.b < 100 выбрасывает все NULLы, порождённые LEFT JOINом?
31 авг 18, 17:57    [21660642]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
iap
А зачем здесь LEFT, если T1.b < 100 выбрасывает все NULLы, порождённые LEFT JOINом?
Об этом надо ТС'а спрашивать.
31 авг 18, 18:28    [21660672]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3247
invm
iap
А зачем здесь LEFT, если T1.b < 100 выбрасывает все NULLы, порождённые LEFT JOINом?
Об этом надо ТС'а спрашивать.
Собственно, я и спросил. Ответ, правда, немного загадочен. Возможно, ТС не видит разницы между его 2-мя запросами.
1 сен 18, 11:02    [21661081]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Idol_111
Member

Откуда:
Сообщений: 598
похоже я как то не достаточно "разжевал" суть проблемы.

Простой пример из ссылки (где можно найти коды для создания таблиц и самому все протестировать) лишь показывает, на мой взгляд, не достаточно "умное" поведение сервера при построении запроса. Кажется, что когда используются хинты сервер перестает понимать что T3.a = T1.b и можно использовать фильтр по обеим таблицам.

Мой случай гороздо сложнее (поэтому речь не о нем сейчас), там 9 вьюшек вложенных (5уровней) и соединенных сложным образом с кучей условий на каждой.
Кстати, поэтому не могу использовать OPTION(HASH JOIN) - View.
И самая проблематичная вьюха как раз и состоит в основном из 8 LEFT joins, но при построение "хорошего" плана сервер соединяет их через RIGHT OUTER JOIN. Что я и попытался возпроизвести жестко задав все хинтами и переписав вьюху чуток. Однако, в таком случае сервер отказывается использовать фильтры, которые заданы в конечном скрипте. Т.е. когда сам строит план использует фильтры, а когда с хинтами, уже не хочет и выходит жесткий скан по куче таблиц.
К примеру, вместо чтения 108 строк по таблице (когда с фильтром) идет скан 12 млн. строк.

Мой вопрос был: возможно ли победить подобную тупизну или нет?

Для тех кто сам хочет проверить и дан был простой пример.
3 сен 18, 02:07    [21662158]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Idol_111
Member

Откуда:
Сообщений: 598
Ennor Tiegael
Возможно, ТС не видит разницы между его 2-мя запросами.

А вот здесь поподробней пожалуйста. И какова разница между этими двумя запросами? Неужели результат? :)
3 сен 18, 02:24    [21662160]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3247
Idol_111
Ennor Tiegael
Возможно, ТС не видит разницы между его 2-мя запросами.

А вот здесь поподробней пожалуйста. И какова разница между этими двумя запросами? Неужели результат? :)
Вы не поверите:
declare @t1 table (Id int primary key);
declare @t2 table (Id int primary key);
declare @t3 table (Id int primary key);

insert into @t1 (Id)
select top (10) row_number() over(order by ao.object_id) from sys.all_objects ao;
insert into @t2 (Id)
values (1), (3), (5), (7), (9);
insert into @t3 (Id)
values (1), (2), (3), (4), (5);

select *
from @t3 t3
right join @t2 t2
right join @t1 t1
on T1.Id = T2.Id
on T1.Id = T3.Id
where T3.Id < 100;

select *
from @t3 t3
right join @t2 t2
right join @t1 t1
on T1.Id = T2.Id
on T1.Id = T3.Id
where T1.Id < 100;
3 сен 18, 05:15    [21662166]     Ответить | Цитировать Сообщить модератору
 Re: right hash join и фильтр  [new]
Idol_111
Member

Откуда:
Сообщений: 598
Ennor Tiegael
Вы не поверите:

Ну почему же не поверю, поверю. Особенно когда так профессионально ткнут носом :).
Спасибо. Вы натолкнули меня на мысль, а то похоже у меня реально глаз "замылился".
3 сен 18, 05:34    [21662170]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить