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

Откуда: Тольятти
Сообщений: 464
Добрый день!
Возникла проблема: план выполнения в функции, отличается от плана выполнения отдельного запроса.
Сам запрос:
DECLARE @otUID uniqueidentifier

DECLARE @ret smallint
SELECT TOP 1 @ret = DATEDIFF(dd, ralDate, GETDATE())
FROM RashodL WITH(noLock)
WHERE RashodL.otUID = @otUID
    AND ralKey & 6 = 2
ORDER BY ralDate

и функция:
CREATE FUNCTION RashodLCheckDocHand (@otUID uniqueidentifier)
RETURNS smallint
AS
BEGIN
DECLARE @ret smallint
SELECT TOP 1 @ret = DATEDIFF(dd, ralDate, GETDATE())
FROM RashodL WITH(noLock)
WHERE RashodL.otUID = @otUID
    AND ralKey & 6 = 2
ORDER BY ralDate

RETURN ISNULL(@ret, 0)
END


План выполнения запроса содержит Index Seek, а в плане выполнения через функцию Index Scan & Key Lookup. База стала сильно тормозить...

Почему так происходит? И как с этим можно бороться?
17 апр 14, 12:07    [15895319]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
saszay,

попробовать отказаться от скалярной функции в пользу табличной inline
17 апр 14, 12:18    [15895384]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Вы как тестируете запрос, константу подставляете?
17 апр 14, 12:22    [15895398]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
aleks2
Guest
saszay
Добрый день!
[/src]
и функция:
CREATE FUNCTION RashodLCheckDocHand (@otUID uniqueidentifier)
RETURNS smallint
AS
BEGIN
DECLARE @ret smallint
SELECT TOP 1 @ret = DATEDIFF(dd, ralDate, GETDATE())
FROM RashodL WITH(noLock)
WHERE RashodL.otUID = @otUID
    AND ralKey & 6 = 2
ORDER BY ralDate

RETURN ISNULL(@ret, 0)
END


И как с этим можно бороться?


Ну... научиться наконец то писать функции?

CREATE FUNCTION RashodLCheckDocHand (@otUID uniqueidentifier)
RETURNS smallint
AS
BEGIN
RETURN ISNULL( (SELECT DATEDIFF(dd, ralDate, GETDATE())
                           FROM RashodL WITH(noLock)
                           WHERE RashodL.otUID = @otUID
                               AND ralKey & 6 = 2
                           ORDER BY ralDate
                    ), 0)
END


+ индекс захерачить на RashodL (otUID, ralDate) include (ralKey)
17 апр 14, 12:29    [15895432]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
saszay,

попробовать отказаться от скалярной функции в пользу табличной inline
+1
18 апр 14, 03:14    [15899042]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Mnior
iap
saszay,

попробовать отказаться от скалярной функции в пользу табличной inline
+1



А зачем табличная inline, если мне нужно всего 1 значение?
21 апр 14, 16:27    [15911747]     Ответить | Цитировать Сообщить модератору
 Re: Разные планы выполнения у запроса и функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
saszay
Mnior
пропущено...
+1



А зачем табличная inline, если мне нужно всего 1 значение?
Для каждой строки?
Вот и будет скалярная вызываться столько раз, сколько строк.
21 апр 14, 17:02    [15911960]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить