Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SELECT	A.number, B.number
FROM	                 master.dbo.spt_values A
	INNER MERGE JOIN master.dbo.spt_values B ON B.number = A.number + 10
GO
DECLARE	@Var Int = 10

SELECT	A.number, B.number
FROM	                 master.dbo.spt_values A
	INNER MERGE JOIN master.dbo.spt_values B ON B.number = A.number + @Var
GO
(2858 row(s) affected)

Msg 8622, Level 16, State 1, Line 2
Обработчик запросов не может предоставить план запроса из-за подсказок, определенных в запросе.
Заново запустите запрос без указания подсказок и без использования SET FORCEPLAN.


Предлагаю опцию сервера:
EXEC sp_configure 'Immutable variables in queries', 1;
Что скажете?

Хотя этого мало:
SELECT	A.number, B.number
FROM	                 master.dbo.spt_values	A CROSS APPLY (SELECT C.* FROM
	                 master.dbo.spt_values	B
	INNER MERGE JOIN master.dbo.spt_values	C ON C.number = B.number - A.number
					)	B
GO
Msg 8622, Level 16, State 1, ...

PS: Для тез кто не врубился, это пример показывающий невозможность. В реале все необходимые индексы есть.
23 май 12, 11:23    [12599331]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Mnior,
OPTION (RECOMPILE) в запросе заменяет эту опцию, если я правильно понял :)
23 май 12, 12:43    [12600250]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Shakill
OPTION (RECOMPILE)
Для @Var да, но для последнего случая не работает, естественно.

Вы нашли ещё один баг: Если запустить - работает, если нажать "получить план" то нет.
Из-за чего я и проффтыкал. Да, я пробывал до этого, теперь придётяся нарабатывать привычку смотреть всегда актульные планы.
23 май 12, 13:47    [12600930]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
step_ks
Member

Откуда:
Сообщений: 936
Желание, чтобы запрос с переменной работал, понятно.

Но
Mnior
SELECT	A.number, B.number
FROM	                 master.dbo.spt_values	A CROSS APPLY (SELECT C.* FROM
	                 master.dbo.spt_values	B
	INNER MERGE JOIN master.dbo.spt_values	C ON C.number = B.number - A.number
					)	B
GO
Msg 8622, Level 16, State 1, ...

c чего бы это вдруг требовать от оптимизатора, чтобы он мог схавать этот запрос? Ну не смог и не смог, хинты помешали.
23 май 12, 14:33    [12601460]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks, эээ что значит "Ну не смог и не смог", а какого фига он не смог?

1. Merge BxC делается для каждой строки из A в отдельности (Loop). Почему Compute для константы считает ([Expr] = A.number+10 [@Var]), а для колокнки не хотит ([Expr] = B.number- A.number) ?
A.number на момент Merge не меняется же.

2. По вашей логике оптимизатору можно везде Loop JOIN ставить в Force Order. А на любое возмущение пользователя по оптимизации запросов говорить: by design © ???
23 май 12, 18:54    [12603906]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
step_ks
Member

Откуда:
Сообщений: 936
Mnior
step_ks, эээ что значит "Ну не смог и не смог", а какого фига он не смог?

Microsoft knows.
Не зря же придумали ошибку 8622.

Mnior
2. По вашей логике оптимизатору можно везде Loop JOIN ставить в Force Order. А на любое возмущение пользователя по оптимизации запросов говорить: by design © ???

ну не знаю, как-то не вижу ничего возмутительного в том, что в некоторых случаях запросы с хинтами отказываются работать.
24 май 12, 09:35    [12605691]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Не зря же придумали ошибку 8622.
Кхм, вы не много не понимаете в чём вопрос.
Вопрос не в том что типа "глючит сервер" (как могло показаться). А в том почему разработчики запретили (или не доработали) генерить в плане Merge, т.к. нет объективнйх причин на это.

Mnior: Почему у машины нет четвёртого колеса?
Shakill: Почему что на заводе его не поставили!
Mnior: Спасибо кеп, но вопрос - почему его не ставят?

ошибку 8622 придумали для случаев когда она задана логически и физически неверно. Т.е. план невалиден.
Но есть две вещи:
1. Когда план задаётся явно.
2. Когда задаётся направление или ограничение куда "копать".
Во втором случае если герератор туп, то он может сказать что "я не вужу как сделать план в данных ограничениях".
Да, всё логично он не свалился, он не выдал неправильный план, он сказал это через ошибку.
А далее задаётся вопрос - "Реально ли план нельзя создать или генератор глуп".
То что генератор глуп это тоже нормально, т.к. есть проблема быстрого поиска планов.

Тогда вопрос трансформируется в другой: Что в данном случае?:
- есть объективная причина запрета данной оптимизации т.к. не даёт приемуществ
- приемущество не такое сильное как недостаток в скорости оптимизатора
- оптимизатор сильно тормозит при этом
- разработчики скуля проффтыкали
- банальный баг в генераторе

Повторяю, не вижу объективных причин. И вы Shakill их не привели.
Приемущества от Merge огромные (иначе бы этого оператора бы небыло)
Ответ на данный вопрос может быть простым, но я его пока не вижу.
24 май 12, 12:13    [12607146]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Mnior, казалось бы, при чем тут я
на всякий случай выберу вариант про тормозящий оптимизатор
24 май 12, 12:45    [12607492]     Ответить | Цитировать Сообщить модератору
 Re: Merge JOIN ON @Var (Immutable variables) | Ext. Column  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Shakill
казалось бы, при чем тут я

Ссори. Да имеллось ввиду step_ks.
Но зря я вообще упоминал какие либо имена.

Shakill
выберу вариант про тормозящий оптимизатор
Жаль что не скажете почему.
24 май 12, 12:52    [12607553]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить