SQL повторно оценивает функцию для каждой строки или только один раз, преобразовывая ее в константу - PullRequest
5 голосов
/ 24 февраля 2012

если у меня есть функция

ALTER FUNCTION [dbo].[GetCycleDate]
(
)
RETURNS DATE
AS
    BEGIN
        DECLARE @CYC_DT DATE

        SELECT
            @CYC_DT = CYC_DT
        FROM
            CYC_DT
        WHERE
            CURR_CYC_IND = 'C'

        RETURN @CYC_DT

END

Для очень большой таблицы будут ли эти два SQL работать почти одинаково?

SELECT
    *
FROM
    [dbo].Table S
    INNER JOIN dbo.CYC_DT D ON  
        S.GL_DT = D.CYC_DT AND
        D.CURR_CYC_IND = 'C'


SELECT
    *
FROM
    [dbo].Table S
WHERE

    S.GL_DT = dbo.GetCycleDate() 

Я знаю, что избегать использования функции безопаснее, но для целей тестирования я хочу иметь возможность настроить функцию так, чтобы она возвращала жестко закодированный результат, не влияя на тестирование, проводимое другими людьми, которые полагаются на другую дату, которая будет установлена таблица дат цикла. Я хочу иметь возможность переключаться на другую дату, не влияя ни на кого другого.

1 Ответ

2 голосов
/ 24 февраля 2012

Как правило, это плохая идея, так как оптимизатор более ограничен в том, что он может сделать для вас, когда задействованы скалярные пользовательские функции.

http://blogs.msdn.com/b/dfurman/archive/2009/12/02/query-performance-scalar-udfs-and-predicate-pushdown.aspx

http://www.sql -server-performance.com / 2005 / SQL-Server-UDFs /

Так как ваш скалярный UDF не параметризован, а ваш пример запроса прост, вам, возможно, это сойдет с рук, но вам нужно проверить, чтобы убедиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...