Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
крокодилица_оля
Guest |
не детерминистик функцийе |
22 янв 14, 16:20 [15452907] Ответить | Цитировать Сообщить модератору |
McCar Member Откуда: Саратов Сообщений: 778 |
То есть в целом понятно, что во втором случае серверу нужно сначала обратиться к базе, чтобы получить значение [dbo].[getLactC_MOVE](), и только после этого уже строить план запроса, и вместо этого он строит план запроса сразу, при этом используя пессимистичное предположение, что селективность по l_move.c_move будет низкой.. Но как научить его не торопиться с планом запроса... |
22 янв 14, 16:28 [15452974] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||
22 янв 14, 16:39 [15453033] Ответить | Цитировать Сообщить модератору |
McCar Member Откуда: Саратов Сообщений: 778 |
Ну в общем да.. это помогло. select v.* from vMoves901 v where v.C_MOVE>(select * from [dbo].[getLactC_MOVE]()) Только все равно остался н вопрос, - почему оно так реализовано.. |
||||
22 янв 14, 17:27 [15453327] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
![]() |
||||
22 янв 14, 17:45 [15453417] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13148 |
со скалярной UDF такое часто тоже помогает - вместо Field > dbo.MyF() писать Field > (SELECT dbo.MyF()) |
22 янв 14, 18:07 [15453543] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||
22 янв 14, 21:42 [15454192] Ответить | Цитировать Сообщить модератору |
McCar Member Откуда: Саратов Сообщений: 778 |
Да, я переделал функцию [dbo].[getLactC_MOVE]() , теперь она inline. Не понимаю вашего удивления. |
||||
23 янв 14, 11:19 [15455560] Ответить | Цитировать Сообщить модератору |
inline function
Guest |
почему не впопад? была скалярная функция, (как уже говорили выше скорее всего не детерменированная), вы предложили вместо нее сделать inline табличную функцию, что ТС и сделал. |
||||
23 янв 14, 11:31 [15455623] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |