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

Откуда:
Сообщений: 52
Привет!

В документации сказано, что обе входные таблицы должны быть отсортированы. Что значит, в этом контексте, "отсортированы"? Нельзя ведь до соединение дать команду сортировки (order by). В общем, что это имеется ввиду?
4 июл 13, 22:16    [14524786]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Raskolnikov,

Вы не дочитали документацию до конца?

http://msdn.microsoft.com/ru-ru/library/ms189961(v=sql.105).aspx

Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием.
4 июл 13, 22:30    [14524825]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
Raskolnikov
Member

Откуда:
Сообщений: 52
pkarklin, я на английском читал и не то, на что вы дали ссылку. За ссылку спасибо, ознакомился! Про индексы понятно, а вот
pkarklin
с помощью вставки явных операций сортировки в план запроса

и
pkarklin
когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием

не доходит. Не могли бы немного просвятить меня?
4 июл 13, 22:41    [14524858]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
с помощью вставки явных операций сортировки в план запроса


Если подходящего индекса нет, то в плане будет: Sort Showplan Operator

автор
когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием


Указанный выше оператор в плане запроса может быть подспорьем не только для Mergee, но и для Aggregate.
4 июл 13, 22:55    [14524892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
Raskolnikov
Member

Откуда:
Сообщений: 52
[quot pkarklin]Если подходящего индекса нет, то в плане будет: Sort Showplan Operator
Указанный выше оператор в плане запроса может быть подспорьем не только для Mergee, но и для Aggregate.
Т.е. сервер сам решит, что нужно сделать, например, именно merge join, а т.к. индекса нету, то нужно выполнить перед этим Sort Showplan Operator? Я просто думал, что если индекса по соответствующему полю нету, то сервер не может выполнить merge...
4 июл 13, 23:02    [14524914]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Raskolnikov
Не могли бы немного просвятить меня?
Может так будет понятней:
+ Пример
create table #a (i int not null);
create table #b (i int not null);
create table #c (i int not null);

insert into #a
output
 inserted.i into #b
values
 (1), (2), (3);

insert into #c
select
 a1.i
from
 #a a1 cross join
 #a a2;

set statistics xml on;

select
 *
from
 #a a join
 #b b on b.i = a.i
option
 (merge join);

set statistics xml off;

alter table #a add constraint PK_#a primary key (i);
alter table #b add constraint PK_#b primary key (i);

set statistics xml on;

select
 *
from
 #a a join
 #b b on b.i = a.i
option
 (merge join);

with x as
(
 select
  i, count(*) as cnt
 from
  #c
 group by
  i
)
select
 *
from
 #a a join
 x on x.i = a.i
option
 (merge join);

set statistics xml off;

drop table #a, #b, #c;
Выполните и сравните планы.
4 июл 13, 23:03    [14524915]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Raskolnikov,

У MS SQL Cost Based оптимизатор. Сервер принимает решение о том, как выполнять запрос, оценивая (за определенное ограниченное время) стоимость разных его вариантов. В некоторых случаях Sort + Merge может быть "дешевле".
4 июл 13, 23:09    [14524928]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Raskolnikov
Т.е. сервер сам решит, что нужно сделать, например, именно merge join, а т.к. индекса нету, то нужно выполнить перед этим Sort Showplan Operator? Я просто думал, что если индекса по соответствующему полю нету, то сервер не может выполнить merge...
Добро пожаловать в мир декларативного программирования.
5 июл 13, 01:14    [14525169]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять merge join  [new]
Raskolnikov
Member

Откуда:
Сообщений: 52
invm, pkarklin, спасибо за ответы! Пролили лучи света на мою темноту.
8 июл 13, 14:17    [14535977]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить