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

Откуда:
Сообщений: 427
Тест 1 и 2 показывают что оптимизатор вроде как учитывает последовательность таблиц, та таблица которая идет первой в запросе - становится внешней а вторая внутренней.
Вопрос в следующем, всегда ли это так, и если да, то где это написано в документации?
А если последовательность таблиц не гарантирована join хинтом, то можно ли как-то указать какая таблица будет внешней а какая внутренней, т.е. каким либо образом гарантировать порядок таблиц с помощью именно хинтов.

Заранее спасибо.

use tempdb;
go

if object_id('dbo.t1') is not null 
    drop table dbo.t1

if object_id('dbo.t2') is not null 
    drop table dbo.t2

create table dbo.t1
    (
      id int
    , val char(100)
    , constraint PK_T1 primary key clustered ( id )
    )

create table dbo.t2
    (
      id int
    , val char(100)
    , constraint PK_T2 primary key clustered ( id )
    )
go

;
with    cte ( id )
          as ( select   1
               union all
               select   id + 1
               from     cte
               where    id < 1000000
             )
    insert  into dbo.t2 ( id )
            select  id
            from    cte
    option  ( maxrecursion 0 );
go

;
with    cte ( id )
          as ( select   0
               union all
               select   id + 1
               from     cte
               where    id < 10
             )
    insert  into dbo.t1 ( id )
            select  id
            from    cte
    option  ( maxrecursion 0 );
go

-- на всякий случай :)
update statistics dbo.t1;
update statistics dbo.t2;
go

-- тест1 t1 join t2
select  *
from    t1
        inner loop join t2 on t1.id = t2.id	

-- тест2 t2 join t1
select  *
from    t2
        inner loop join t1 on t1.id = t2.id



Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
18 мар 13, 10:04    [14061142]     Ответить | Цитировать Сообщить модератору
 Re: Гарантирована ли очередность таблиц в джойнах при указании хинтов соединения  [new]
Оппть
Guest
Владимир Затуливетер,

option (force order)
18 мар 13, 10:15    [14061191]     Ответить | Цитировать Сообщить модератору
 Re: Гарантирована ли очередность таблиц в джойнах при указании хинтов соединения  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Оппть
Владимир Затуливетер,

option (force order)


FORCE ORDER
Specifies that the join order indicated by the query syntax is preserved during query optimization. Using FORCE ORDER does not affect possible role reversal behavior of the query optimizer.

Указывает, что при оптимизации запроса сохраняется порядок соединения, заданный синтаксисом запроса.Использование подсказки FORCE ORDER не влияет на возможный реверс ролей в оптимизаторе запросов.


FORCE ORDER как раз не гарантирует
"сохраняется порядок соединения" - т.е. порядок джойнов (а не порядок таблиц в джойнах)
"не влияет на возможный реверс ролей" - т.е. в одном соединении таблицы могут меняться местами (t1 join t2 join t3) или так например (t2 join t1 join t3).
18 мар 13, 10:31    [14061250]     Ответить | Цитировать Сообщить модератору
 Re: Гарантирована ли очередность таблиц в джойнах при указании хинтов соединения  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Владимир Затуливетер
Оппть
Владимир Затуливетер,

option (force order)


FORCE ORDER
Specifies that the join order indicated by the query syntax is preserved during query optimization. Using FORCE ORDER does not affect possible role reversal behavior of the query optimizer.

Указывает, что при оптимизации запроса сохраняется порядок соединения, заданный синтаксисом запроса.Использование подсказки FORCE ORDER не влияет на возможный реверс ролей в оптимизаторе запросов.


FORCE ORDER как раз не гарантирует
"сохраняется порядок соединения" - т.е. порядок джойнов (а не порядок таблиц в джойнах)
"не влияет на возможный реверс ролей" - т.е. в одном соединении таблицы могут меняться местами (t1 join t2 join t3) или так например (t2 join t1 join t3).

Это при хеш соединении
автор
If the optimizer anticipates wrongly which of the two inputs is smaller and, therefore, should have been the build input, the build and probe roles are reversed dynamically. The hash join makes sure that it uses the smaller overflow file as build input. This technique is called role reversal. Role reversal occurs inside the hash join after at least one spill to the disk.

Note:
Role reversal occurs independent of any query hints or structure. Role reversal does not display in your query plan; when it occurs, it is transparent to the user.

18 мар 13, 12:21    [14061766]     Ответить | Цитировать Сообщить модератору
 Re: Гарантирована ли очередность таблиц в джойнах при указании хинтов соединения  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Мистер Хенки,

Да похоже на правду.
Спасибо!
19 мар 13, 12:36    [14066614]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить