Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / right hash join и фильтр / 14 сообщений из 14, страница 1 из 1
31.08.2018, 05:14
    #39695918
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Пытаясь оптимизировать один сложный запрос столнулся с неодназным поведением оптимизатора при построении Плана запроса.
Суть: надо заставить таблицы (в реале вьюшки, но я буду упрощать где можно) соединяться с right outer hash join в определенном порядке. При нормальных параметрах сервер сам выстраивает подобное соединение и использует фильтр по всем таблицам. Но когда я пытаюсь заставить его использовать только right hash хинтом, сервер использует фильтр лишь на основной таблице, что приводить к дикому сканированию по остальным.

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

код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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)

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

Подскажите, пожалуйста, в какую сторону копать.
...
Рейтинг: 0 / 0
31.08.2018, 05:34
    #39695920
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Idol_111,

У меня пятничный затуп наверное, но в примере 1, когда условие на Т3 помещается в where, соотв. внешний джойн разве не превращается во внутренний?
...
Рейтинг: 0 / 0
31.08.2018, 05:43
    #39695921
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Ennor TiegaelIdol_111,

У меня пятничный затуп наверное, но в примере 1, когда условие на Т3 помещается в where, соотв. внешний джойн разве не превращается во внутренний?
в этом простом случае он превращается в inner join, ну так ничего не мешает так же сделать и во 2м случае. Разве нет?
...
Рейтинг: 0 / 0
31.08.2018, 07:06
    #39695927
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Idol_111,

У вас там 3 неиндексированные кучи, и вы джойны гвоздями прибивать пытаетесь. Может, сначала с индексами поколдовать? Оно и оптимизатору попроще будет, и вам.
...
Рейтинг: 0 / 0
31.08.2018, 07:11
    #39695928
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Ennor TiegaelIdol_111,

У вас там 3 неиндексированные кучи, и вы джойны гвоздями прибивать пытаетесь. Может, сначала с индексами поколдовать? Оно и оптимизатору попроще будет, и вам.
Спасибо за совет, за индексы не беспокойтесь, я не первый раз оптимизацию провожу :).
Вы лучше по существу чего-нибудь предложите.
...
Рейтинг: 0 / 0
31.08.2018, 09:52
    #39695986
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Idol_111,

ну если я правильно понимаю, то пробовать убрать HASH из JOIN и хинт OPTION(HASH JOIN)
...
Рейтинг: 0 / 0
31.08.2018, 10:54
    #39696026
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Код: sql
1.
2.
3.
4.
5.
6.
7.
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

?
...
Рейтинг: 0 / 0
31.08.2018, 17:57
    #39696406
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
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ом?
...
Рейтинг: 0 / 0
31.08.2018, 18:28
    #39696420
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
iapА зачем здесь LEFT, если T1.b < 100 выбрасывает все NULLы, порождённые LEFT JOINом?Об этом надо ТС'а спрашивать.
...
Рейтинг: 0 / 0
01.09.2018, 11:02
    #39696573
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
invmiapА зачем здесь LEFT, если T1.b < 100 выбрасывает все NULLы, порождённые LEFT JOINом?Об этом надо ТС'а спрашивать.Собственно, я и спросил. Ответ, правда, немного загадочен. Возможно, ТС не видит разницы между его 2-мя запросами.
...
Рейтинг: 0 / 0
03.09.2018, 02:07
    #39696957
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
похоже я как то не достаточно "разжевал" суть проблемы.

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

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

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

Для тех кто сам хочет проверить и дан был простой пример.
...
Рейтинг: 0 / 0
03.09.2018, 02:24
    #39696958
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Ennor TiegaelВозможно, ТС не видит разницы между его 2-мя запросами.
А вот здесь поподробней пожалуйста. И какова разница между этими двумя запросами? Неужели результат? :)
...
Рейтинг: 0 / 0
03.09.2018, 05:15
    #39696960
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Idol_111Ennor TiegaelВозможно, ТС не видит разницы между его 2-мя запросами.
А вот здесь поподробней пожалуйста. И какова разница между этими двумя запросами? Неужели результат? :)Вы не поверите:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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;
...
Рейтинг: 0 / 0
03.09.2018, 05:34
    #39696963
Idol_111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
right hash join и фильтр
Ennor TiegaelВы не поверите:

Ну почему же не поверю, поверю. Особенно когда так профессионально ткнут носом :).
Спасибо. Вы натолкнули меня на мысль, а то похоже у меня реально глаз "замылился".
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / right hash join и фильтр / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]