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

Откуда: Саратов
Сообщений: 778
Ситуация -
Есть некая скалярная целочисленная функция.
select [dbo].[getLactC_MOVE]()
--результат - 329393063

Есть вьюха vMoves901, в которой используется таблица L_MOVE с кластерным индексом по полю C_MOVE.
Запрос
select   v.* from vMoves901 v 	where v.C_MOVE>329393063

выполняется многовенно, потому как условие where v.C_MOVE>329393063 пробрасывается до кластерного индекса [IX_L_MOVE_C_MOVE] , и план запроса начинается с Seek по нему.
Но, в таком же по сути запроса
select   v.* from vMoves901 v	where v.C_MOVE>[dbo].[getLactC_MOVE]()

SQL не хочет использовать такую логику, и судя по плану запроса, WHERE условие накадывается уже после того как отработает вьюха.
Пробовал
select   v.* from vMoves901 v with (forceseek, index(IX_L_MOVE_C_MOVE))	where v.C_MOVE>[dbo].[getLactC_MOVE]()

-не помогает.
Вопросы - почему так и что делать?
Спасибо.
22 янв 14, 16:10    [15452852]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
крокодилица_оля
Guest
не детерминистик функцийе
22 янв 14, 16:20    [15452907]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
McCar
Member

Откуда: Саратов
Сообщений: 778
То есть в целом понятно, что во втором случае серверу нужно сначала обратиться к базе, чтобы получить значение [dbo].[getLactC_MOVE](), и только после этого уже строить план запроса, и вместо этого он строит план запроса сразу, при этом используя пессимистичное предположение, что селективность по l_move.c_move будет низкой..
Но как научить его не торопиться с планом запроса...
22 янв 14, 16:28    [15452974]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
McCar
То есть в целом понятно, что во втором случае серверу нужно сначала обратиться к базе, чтобы получить значение [dbo].[getLactC_MOVE](), и только после этого уже строить план запроса, и вместо этого он строит план запроса сразу, при этом используя пессимистичное предположение, что селективность по l_move.c_move будет низкой..
Но как научить его не торопиться с планом запроса...
Сделайте табличную инлайн функцию вместо скалярной.
22 янв 14, 16:39    [15453033]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
McCar
Member

Откуда: Саратов
Сообщений: 778
iap
McCar
То есть в целом понятно, что во втором случае серверу нужно сначала обратиться к базе, чтобы получить значение [dbo].[getLactC_MOVE](), и только после этого уже строить план запроса, и вместо этого он строит план запроса сразу, при этом используя пессимистичное предположение, что селективность по l_move.c_move будет низкой..
Но как научить его не торопиться с планом запроса...
Сделайте табличную инлайн функцию вместо скалярной.

Ну в общем да.. это помогло.
select   v.* from vMoves901 v 	where v.C_MOVE>(select  * from [dbo].[getLactC_MOVE]())

Только все равно остался н вопрос, - почему оно так реализовано..
22 янв 14, 17:27    [15453327]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
McCar
iap
пропущено...
Сделайте табличную инлайн функцию вместо скалярной.

Ну в общем да.. это помогло.
select   v.* from vMoves901 v 	where v.C_MOVE>(select  * from [dbo].[getLactC_MOVE]())


Только все равно остался н вопрос, - почему оно так реализовано..
Это - табличная инлайн-функция?!
22 янв 14, 17:45    [15453417]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
Crimean
Member

Откуда:
Сообщений: 13148
со скалярной UDF такое часто тоже помогает - вместо Field > dbo.MyF() писать Field > (SELECT dbo.MyF())
22 янв 14, 18:07    [15453543]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Crimean
со скалярной UDF такое часто тоже помогает - вместо Field > dbo.MyF() писать Field > (SELECT dbo.MyF())
Да, но удивил ответ невпопад на моё предложение.
22 янв 14, 21:42    [15454192]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
McCar
Member

Откуда: Саратов
Сообщений: 778
iap
McCar
пропущено...

Ну в общем да.. это помогло.
select   v.* from vMoves901 v 	where v.C_MOVE>(select  * from [dbo].[getLactC_MOVE]())


Только все равно остался н вопрос, - почему оно так реализовано..
Это - табличная инлайн-функция?!

Да, я переделал функцию [dbo].[getLactC_MOVE]() , теперь она inline.
Не понимаю вашего удивления.
23 янв 14, 11:19    [15455560]     Ответить | Цитировать Сообщить модератору
 Re: Знач-е из скалярной функции в WHERE условии на VIEW, - не пробрасывает до нужного индекса  [new]
inline function
Guest
iap
Crimean
со скалярной UDF такое часто тоже помогает - вместо Field > dbo.MyF() писать Field > (SELECT dbo.MyF())
Да, но удивил ответ невпопад на моё предложение.

почему не впопад?
была скалярная функция, (как уже говорили выше скорее всего не детерменированная), вы предложили вместо нее сделать inline табличную функцию, что ТС и сделал.
23 янв 14, 11:31    [15455623]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить