Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Порядок связывания таблиц  [new]
guest_guest
Guest
Есть таблицы А, В и С связанные через INNER JOIN A-B, B-C. По плану видно, что сервер сначала связывает B и С, а потом А и результат B и C. Можно ли заставить сервер сначала связать A и В, а потом результат А и В с С?
1 фев 11, 18:22    [10166782]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
_djХомяГ
Guest
вроде хинт запросе
FORCE ORDER
Указывает, что при оптимизации запроса сохраняется порядок объединения, заданный синтаксисом запроса. Использование подсказки FORCE ORDER не влияет на возможный реверс ролей в оптимизаторе запросов.
1 фев 11, 18:31    [10166820]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Мне кажется, что для трёх-то таблиц сервер лучше Вас разберётся, в каком порядке лучше связывать.
1 фев 11, 20:11    [10167229]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
guest_guest
Guest
iap
Мне кажется, что для трёх-то таблиц сервер лучше Вас разберётся, в каком порядке лучше связывать.


В данном случае таблица В связывается с С по сложному LIKE. В таблице В 3 млн записей, в А - порядка 100 тыс, она связывается с В по идентификатору, в результате A+B дает получается ~100 тыс записей. В С - 70 записей. Получается, что сначала идет медленное сравнение по LIKE, а потом идет свзка по идентивикатору. Я думаю в данном случае лучше самому задать порядок.
2 фев 11, 11:06    [10169269]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Связываются то по какой стратегии ? И где вы видите такой порядок соединений ?
2 фев 11, 11:11    [10169309]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
guest_guest
Guest
Glory,

порядок я вижу в плане. Сначала В и С (Nested Loops), а потом А с результатом (Hash Match)
2 фев 11, 11:21    [10169422]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
iap
Мне кажется, что для трёх-то таблиц сервер лучше Вас разберётся, в каком порядке лучше связывать.


вот как раз с этим у сервера временами серьезные проблемы :)
стабильно оптимизатор пока только константами в пределах 1 таблицы оперирует
ну или 2008 "option ( recompile )" наконец-то освоил
при соединении даже 2 таблиц + условия, причем одна - огромная и достаточно селективные условия, но их много, вторая - мелкий справочник + индекс на форин на него, разумеется неселективный, но написан JOIN и оптимизатор пускает побоку кучу сложных условий и упирается в обработку этого соединения... "отучивать" приходится иногда достаточно нетрадиционными средствами..
2 фев 11, 11:21    [10169424]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
guest_guest
Glory,

порядок я вижу в плане. Сначала В и С (Nested Loops), а потом А с результатом (Hash Match)

И что вас смущает? Сколько записей получается в результате соединения В+С?
2 фев 11, 11:36    [10169575]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
guest_guest
Guest
iljy
guest_guest
Glory,

порядок я вижу в плане. Сначала В и С (Nested Loops), а потом А с результатом (Hash Match)

И что вас смущает? Сколько записей получается в результате соединения В+С?



Смущает время. После добавления FORCE ORDER время выполнения уменьшилось с 7,5 мин. до 1 мин.

B+C дают порядка 200 тыс записей, но повторюсь, там идет сравнение по LIKE т.е. В.строка LIKE '%' + C.строка + '%'. Соответственно 70 * 3 млн. таких сравненией
2 фев 11, 11:48    [10169692]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35367
Блог
Если по теме вопроса - то синтаксис Join`ов допускает использование скобок.
Правда сейчас точно не помню, влияют ли они на порядок соединения.

Кстати, указание подсказки соединения (типа inner hash join) влияет.
2 фев 11, 13:33    [10170680]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Критик
Если по теме вопроса - то синтаксис Join`ов допускает использование скобок.
Правда сейчас точно не помню, влияют ли они на порядок соединения.
Ни на что не влияют.
Они там абсолютно лишние.
2 фев 11, 13:44    [10170777]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
iap
Критик
Если по теме вопроса - то синтаксис Join`ов допускает использование скобок.
Правда сейчас точно не помню, влияют ли они на порядок соединения.
Ни на что не влияют.
Они там абсолютно лишние.


как раз при FORCE ORDER очень влияют
2 фев 11, 13:59    [10170928]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Crimean
iap
пропущено...
Ни на что не влияют.
Они там абсолютно лишние.


как раз при FORCE ORDER очень влияют
Абсолютно не влияют.
Ибо порядок JOINов однозначно определяется не скобками,
а последовательностью ключевых слов JOIN и ON
2 фев 11, 14:26    [10171127]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
set showplan_text on
go

set nocount on

declare @a table ( id int , id_b int, flag int )
declare @b table ( id int, id_c int, flag int )
declare @c table ( id int, flag int )

insert into @a select 1, 10, 1
insert into @b select 10, 100, 10
insert into @c select 100, 100

select * 
from @a a 
join @b b on b.id = a.id_b
join @c c on c.id = b.id_c
option ( loop join, force order )

select * 
from @a a 
join (    @b b 
     join @c c on c.id = b.id_c 
     ) on b.id = a.id_b
option ( loop join, force order )

go
set showplan_text off
go


StmtText                                                                                 
---------------------------------------------------------------------------------------- 
  |--Nested Loops(Inner Join, WHERE:(@b.[id_c] as [b].[id_c]=@c.[id] as [c].[id]))
       |--Nested Loops(Inner Join, WHERE:(@b.[id] as [b].[id]=@a.[id_b] as [a].[id_b]))
       |    |--Table Scan(OBJECT:(@a AS [a]))
       |    |--Table Scan(OBJECT:(@b AS [b]))
       |--Table Scan(OBJECT:(@c AS [c]))

StmtText                                                                                                                                   
------------------------------------------------------------------------------------------------------------------------------------------ 

StmtText                                                                                      
--------------------------------------------------------------------------------------------- 
  |--Nested Loops(Inner Join, WHERE:(@a.[id_b] as [a].[id_b]=@b.[id] as [b].[id]))
       |--Table Scan(OBJECT:(@a AS [a]))
       |--Table Spool
            |--Nested Loops(Inner Join, WHERE:(@c.[id] as [c].[id]=@b.[id_c] as [b].[id_c]))
                 |--Table Scan(OBJECT:(@b AS [b]))
                 |--Table Scan(OBJECT:(@c AS [c]))
2 фев 11, 14:52    [10171366]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Crimean
set showplan_text on
go

set nocount on

declare @a table ( id int , id_b int, flag int )
declare @b table ( id int, id_c int, flag int )
declare @c table ( id int, flag int )

insert into @a select 1, 10, 1
insert into @b select 10, 100, 10
insert into @c select 100, 100

select * 
from @a a 
join @b b on b.id = a.id_b
join @c c on c.id = b.id_c
option ( loop join, force order )

select * 
from @a a 
join     @b b 
     join @c c on c.id = b.id_c 
      on b.id = a.id_b
option ( loop join, force order )

go
set showplan_text off
go


StmtText                                                                                 
---------------------------------------------------------------------------------------- 
  |--Nested Loops(Inner Join, WHERE:(@b.[id_c] as [b].[id_c]=@c.[id] as [c].[id]))
       |--Nested Loops(Inner Join, WHERE:(@b.[id] as [b].[id]=@a.[id_b] as [a].[id_b]))
       |    |--Table Scan(OBJECT:(@a AS [a]))
       |    |--Table Scan(OBJECT:(@b AS [b]))
       |--Table Scan(OBJECT:(@c AS [c]))

StmtText                                                                                                                                   
------------------------------------------------------------------------------------------------------------------------------------------ 

StmtText                                                                                      
--------------------------------------------------------------------------------------------- 
  |--Nested Loops(Inner Join, WHERE:(@a.[id_b] as [a].[id_b]=@b.[id] as [b].[id]))
       |--Table Scan(OBJECT:(@a AS [a]))
       |--Table Spool
            |--Nested Loops(Inner Join, WHERE:(@c.[id] as [c].[id]=@b.[id_c] as [b].[id_c]))
                 |--Table Scan(OBJECT:(@b AS [b]))
                 |--Table Scan(OBJECT:(@c AS [c]))
Рраз! И нет никаких скобок!
2 фев 11, 14:57    [10171424]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
iap
Рраз! И нет никаких скобок!


но со скобками - то красивше! :)
2 фев 11, 15:05    [10171497]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Crimean
iap
Рраз! И нет никаких скобок!


но со скобками - то красивше! :)
C этим не поспоришь.
2 фев 11, 15:06    [10171500]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Порядок связывания таблиц  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Правильно ли я понял, что в первом случае сначала объединяются a и b, потом присоединяется с,
а во втором случае сначала соединяются b и c, затем a ?
28 май 12, 22:48    [12628707]     Ответить | Цитировать Сообщить модератору
 Re: Порядок связывания таблиц  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Шамиль Фаридович
Правильно ли я понял, что в первом случае сначала объединяются a и b, потом присоединяется с,
а во втором случае сначала соединяются b и c, затем a ?

правильно, но это работает исключительно с хинтом force order
29 май 12, 09:29    [12629542]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить