Пользовательские функции. SQL Server 2005 неправильно помечен как недетерминированный?

Что касается этого вопроса, я решил проверить UDF в моем хранилище данных (которые в основном должны были быть детерминированными). ), и я нашел несколько, которых не должно быть.

Например:

CREATE FUNCTION [udf_YearFromDataDtID]
(
    @DATA_DT_ID int
)
RETURNS int
AS
BEGIN
    RETURN @DATA_DT_ID / 10000
END

Отображается в этом запросе:

SELECT  ROUTINE_NAME
FROM    INFORMATION_SCHEMA.ROUTINES
WHERE   IS_DETERMINISTIC = 'NO'
        AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME

Почему это?


person Cade Roux    schedule 21.11.2008    source источник


Ответы (1)


Ура - очевидно, ТРЕБУЕТСЯ РАЗРАБОТКА СХЕМЫ, иначе она должна быть может вызвать проблемы с производительностью

ALTER FUNCTION [udf_YearFromDataDtID]
(
    @DATA_DT_ID int
)
RETURNS int
WITH SCHEMABINDING
AS
BEGIN
    RETURN @DATA_DT_ID / 10000
END

Похоже, исправив это, я мог бы немного повысить производительность. Хороший.

person Cade Roux    schedule 21.11.2008
comment
Использование UDF в запросах сильно снижает производительность, что бы вы ни делали. Если вы выполните все свои запросы и замените все экземпляры вызовов UDF на sql в функциях, вы увидите разницу в несколько порядков. Это обеспечивает повторяющийся SQL, но действительно может помочь. - person Eric Z Beard; 22.11.2008
comment
Эти конкретные UDF являются постоянными, но в конечном итоге они появляются в каждой строке - я мог бы оценить их как временные, но я ожидаю, что в конечном итоге они будут реорганизованы, поскольку выходная схема должна соответствовать общему рефакторингу системы в хранилище данных. Вход. - person Cade Roux; 22.11.2008