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

Откуда:
Сообщений: 2808
Добрый день. Пользуюсь секционированной таблицей, и данные из нее в запросе ограничиваю в пределах одной секции. С константами в условиях - все чудесно, с параметрами тоже решаемо хинтами - parameter sniffing. А вот возникла задача сделать вьюху в которой параметры берутся текущая дата и день назад на начало дня. в общем текст запроса для сравнения следующий:
declare
	@d1 smalldatetime = cast(cast(dateadd(dd,-1,getdate()) as date) as smalldatetime),
	@d2 smalldatetime = getdate()

	select top(100) *
	from bakhaev.fn_ОстаткиЗаПериодСоСреза	(
												@d1,@d2
											) option(recompile, maxdop 6)

	select top(100) *
	from bakhaev.fn_ОстаткиЗаПериодСоСреза	(
												cast(cast(dateadd(dd,-1,getdate()) as date) as smalldatetime), getdate()
											) option(recompile, maxdop 6)

И вот 2й запрос - который реально "воткнуть" во вьюху строит план не понимая, что данные нужно тянуть только из одной секции - вставляет дополнительную сортировку (во вложении в плане запроса можно увидеть). Как можно во вьюхе "прибить" оптимальный план????

PS: даже тот же параметр снифинг требует хинта рекомпайл, а во вьюхе и хинты то нельзя указывать )))). Вьюха используется для дальнейшей загрузки в SSAS и там тоже не прокатят хинты - тупо нужно указать или таблицу или вьюху откуда данные забирать.

К сообщению приложен файл (parameter vs not determ func.zip - 27Kb) cкачать
16 мар 16, 13:19    [18937793]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
Дед-Папыхтет,

cast(getdate() as smalldatetime)
16 мар 16, 14:44    [18938348]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Дед-Папыхтет
а во вьюхе и хинты то нельзя указывать ))))

Это почему?
16 мар 16, 14:52    [18938398]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Jovanny
Дед-Папыхтет
а во вьюхе и хинты то нельзя указывать ))))

Это почему?

Ну попробуй сделай вьюху с хинтом для резалтсета типа - option(recompile)
16 мар 16, 14:54    [18938418]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Владислав Колосов
Дед-Папыхтет,

cast(getdate() as smalldatetime)

Тоже самое... сортировка в плане остается
16 мар 16, 14:54    [18938425]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
option(recompile) - это хинт запроса, его нельзя.
А хинты таблицы и соединения - пожалуйста.
16 мар 16, 14:59    [18938458]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
параметризованные вью mssql разве бывают?
16 мар 16, 15:08    [18938537]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Дед-Папыхтет,

обернуть в multistatement-функцию. там можно хинты запросов.
ну, или добавить во вьюху еще одно условие, где дата явно прописана [Период] >= '2016-03-01'. и раз в месяц автоматически делать ей alter.
16 мар 16, 15:11    [18938570]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
Дед-Папыхтет,

в запросах разное количество строк в секции. Вы чего-то не договариваете.
16 мар 16, 15:26    [18938707]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
Владислав Колосов
Дед-Папыхтет,

в запросах разное количество строк в секции. Вы чего-то не договариваете.


Дед-Папыхтет
declare
	@d1 smalldatetime = cast(cast(dateadd(dd,-1,getdate()) as date) as smalldatetime),
	@d2 smalldatetime = getdate()

	select top(100) *
	from bakhaev.fn_ОстаткиЗаПериодСоСреза	(
												@d1,@d2
											) option(recompile, maxdop 6)

	select top(100) *
	from bakhaev.fn_ОстаткиЗаПериодСоСреза	(
												cast(cast(dateadd(dd,-1,getdate()) as date) as smalldatetime), getdate()
											) option(recompile, maxdop 6)


По тексту запроса разве не очевидно, что одинаковый результат??
16 мар 16, 19:29    [18940261]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
daw
Дед-Папыхтет,

обернуть в multistatement-функцию. там можно хинты запросов.
ну, или добавить во вьюху еще одно условие, где дата явно прописана [Период] >= '2016-03-01'. и раз в месяц автоматически делать ей alter.


Кстати... реально это сработает
16 мар 16, 19:30    [18940262]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по parameter sniffing  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
daw
Дед-Папыхтет,

обернуть в multistatement-функцию. там можно хинты запросов.
ну, или добавить во вьюху еще одно условие, где дата явно прописана [Период] >= '2016-03-01'. и раз в месяц автоматически делать ей alter.

Да я тоже думал вьюху менять динамически перед загрузкой... вроде не красиво. Но вот про малтистейтмент (не инлайн) табличную функцию совсем не вспомнил ))))). Обычно в 99% использую инлайн функции )))))))).
Да в такой сработает пожалуй и хинты и параметры. Спасибо за подсказку.
17 мар 16, 08:13    [18941237]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить