powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Порядок полей в ON имеет значение !!??
16 сообщений из 16, страница 1 из 1
Порядок полей в ON имеет значение !!??
    #39755524
Богдан Гоцкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,
Есть 2 абсолютно одинаковые таблицы с композитным кластерным PK (из 5 полей) с абсолютно одинаковыми данными. Есть простейший LEFT JOIN с условием соединения по тем же 5-ти полям которые в кластерных индексах. Всю жизнь думал что SQL декларативный язык ;-) и порядок перечисления полей в ON не имеет значения. Оказывается имеет ))
0. Создание тестовых данных
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
drop table table1;
create table table1
(
    id1 int not null,
    id2 int not null,
    id3 int not null,
    id4 int not null,
    id5 int not null
);
create unique clustered index ix1 on table1(id1, id2, id3, id4, id5)

drop table table2;
create table table2 (
    id1 int not null,
    id2 int not null,
    id3 int not null,
    id4 int not null,
    id5 int not null
);
create unique clustered index ix2 on table2(id1, id2, id3, id4, id5);

insert into table1 (id1, id2, id3, id4, id5)
select top 10000
       row_number()over(order by 1/0)/1000,
       row_number()over(order by 1/0),
       row_number()over(order by 1/0),
       row_number()over(order by 1/0),
       row_number()over(order by 1/0)
from master..spt_values t1, master..spt_values t2
where t1.type = 'P' and t2.type = 'P'

insert into table2 (id1, id2, id3, id4, id5)
select top 10000
       row_number()over(order by 1/0)/1000,
       row_number()over(order by 1/0),
       row_number()over(order by 1/0),
       row_number()over(order by 1/0),
       row_number()over(order by 1/0)
from master..spt_values t1, master..spt_values t2
where t1.type = 'P' and t2.type = 'P'



1. Запрос 1. Все поля в ON идут по порядку как в кластерных индексах. Как и ожидалось, имеем Merge Join в плане
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
       t1.id1,
       t1.id2,
       t1.id3,
       t1.id4,
       t1.id5,
       t2.id5
from table1 t1
left join table2 t2 on
		t1.id1 = t2.id1 and
		t1.id2 = t2.id2 and
		t1.id3 = t2.id3 and
		t1.id4 = t2.id4 and
		t1.id5 = t2.id5
where
	t1.id1 = 6



2. Запрос 2. Поменяйте местами id3 и id4, имеем Hash Match в плане. Чудеса!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
       t1.id1,
       t1.id2,
       t1.id3,
       t1.id4,
       t1.id5,
       t2.id5
from table1 t1
left join table2 t2 on
		t1.id1 = t2.id1 and
		t1.id2 = t2.id2 and
		t1.id4 = t2.id4 and
		t1.id3 = t2.id3 and
		t1.id5 = t2.id5
where
	t1.id1 = 6
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755550
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мануалы и минуют тя глупые вопросы.

Оптимизатор выбирает "наилучший" план, но он ограничен во времени выбора.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755576
Богдан Гоцкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В обоих случаях
Код: sql
1.
2.
Optimization Level = FULL, 
Reason For Early Termination Of Statement Optimization = Good Enough Plan Found


никаких таймаутов здесь...
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755617
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Богдан Гоцкийникаких таймаутов здесь...

Ты суслика видишь? А он есть!
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755618
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Богдан Гоцкий,

В данном случае алекс прав. Выбор наилучшего (с вашей точки зрения) плана является вероятностным, а не гарантированным. В том числе зависит и от таких вот условий.

Если оптимизатор воспроизводимо промахивается с выбором, а вы знаете, какой именно джойн здесь нужен - прибивайте гвоздями хинтами. Только учтите, что после обновления версии сиквела поведение может поменяться, и хинт может начать мешать, вместо того чтобы помогать.

Версия сервера-то какая, кстати? А то, может, вы там от 2005-го чудес ждете.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755619
Богдан Гоцкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае лечить хинтами ничего не нужно, достаточно просто в ON перечислить условия в том же порядке что и поля в кластерном индексе. Интерес чисто академический. Все интернеты доказывают что порядок условий в ON, WHERE и GROUP BY несущественен и ищут доказательства обратного. Я показал обратное и был сильно удивлен. В моей более чем 15-ти летней практике с сиквелом - первый раз такое вижу. Сначала думал что особенность версии сиквела, но нет, стабильно воспроизводиться на 2012, 2014, 2016, 2017 серверах. Более того, если запрос переписать через WHERE - такое же поведение. Получается что порядок предикатов в WHERE тоже играет роль. А для декларативного языка коим является SQL это дико неожиданно, согласитесь.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755620
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Богдан ГоцкийВ данном случае лечить хинтами ничего не нужно, достаточно просто в ON перечислить условия в том же порядке что и поля в кластерном индексе.Нет гарантии, что это будет работать всегда. Чтобы это понимать, достаточно знать, как в SQL работает оптимизатор. Он не перебирает все возможные варианты планов, он перебирает их до тех пор, пока не вылетит по таймауту, или пока не найдет good enough с его точки зрения. И это поведение документировано.

Случай не частый, к счастью, но я тоже встречался с таким.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755621
Богдан Гоцкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с хинтом, так вообще дичь полнейшая, оптимизатор добавил 2 абсолютно ненужные сортировки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
       t1.id1,
       t1.id2,
       t1.id3,
       t1.id4,
       t1.id5,
       t2.id5
from table1 t1
left merge join table2 t2 on
		t1.id1 = t2.id1 and
		t1.id2 = t2.id2 and
		t1.id4 = t2.id4 and
		t1.id3 = t2.id3 and
		t1.id5 = t2.id5
where
	t1.id1 = 6



...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755622
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы в таком случае отказался от составного ключа и добавил бы суррогатный identity. Все-таки джойн по пяти полям - это жесть. У вас там варехаус, что ли?
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755628
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Богдан Гоцкий,

Видимо это баговина или просто бай дизайн.

Если уберете where получите merge в обоих случаях.

С where предикат t1.id1 = t2.id1 исключается и вместо этого имеем два index seek с id1 = 6 с упорядоченными наборами на выходе.
Но во втором случае оптимизатор почему-то считает, что для merge необходимо переупорядочивание.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39755630
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА для декларативного языка коим является SQL это дико неожиданноДля ИТ вообще ничего не может быть неожиданного. :)
Тем более для МС.

Все коды пишут живые люди. А кодов - многие миллионы строк.
Документированных ошибок - тысячи. Недокументированных не меньше.

зы: "Все современные программы - бета-версии" (с)
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39757112
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте, как и по каким колонкам строиться статистика и как она используется для построения плана оптимизатором, тогда и поймёте, как влияет порядок предикатов...
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39757264
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гладченко,
а вот еще бы и ссылок годных на "почитать"?
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39757548
Богдан Гоцкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гладченко,

читал, похоже не в статистике тут дело. Больше похоже на багу во время построения дерева реляционных операторов. В обоих случаях дерево должно быть одинаковым. Создание статистик по {id1, id2, id4, id3, id5} на обоих таблицах никакой роли не сыграло.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39757587
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ГладченкоПочитайте, как и по каким колонкам строиться статистика и как она используется для построения плана оптимизатором, тогда и поймёте, как влияет порядок предикатов...Ну, статистика не имеет к этому никакого отношения. Скорее просто "лень" оптимизатора.
...
Рейтинг: 0 / 0
Порядок полей в ON имеет значение !!??
    #39757651
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Богдан Гоцкий,

авторВсю жизнь думал что SQL декларативный язык ;-) и порядок перечисления полей в ON не имеет значения. Оказывается имеет ))
не придирки ради, но истины для....
с SQL все в порядке он вам результат запроса гарантирует, а не план. Работу оптимизатора и планы запроса SQL слава богу не описывает.
А то потом начитавшись таких топиков, студенты рассказывают что вот в SQL баг есть.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Порядок полей в ON имеет значение !!??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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