Насколько оптимальна эта функция? - PullRequest
1 голос
/ 14 октября 2010

Я собираюсь реализовать эту функцию для вычисления некоторых чисел.

CREATE FUNCTION [dbo].[funLookupFTE] (@PFID int) RETURNS
    VARCHAR(20) AS BEGIN 

DECLARE @NumberOfFTE AS VARCHAR(20)
SET @NumberOfFTE = (SELECT  SUM(CASE WHEN Hours <= 20 THEN 0.5 WHEN Hours > 20 THEN 1     END) AS FTECount 
                    FROM tblPractitioners 
                    WHERE PFID =
@PFID)
RETURN @NumberOfFTE
END

Просто пытаюсь понять, насколько это оптимально, и не будет ли дело в его руках.

1 Ответ

4 голосов
/ 14 октября 2010

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

Например:

SELECT * FROM tblPractioners P1
INNER JOIN
(
    SELECT  PFID, SUM(CASE WHEN Hours <= 20 THEN 0.5 WHEN Hours > 20 THEN 1 END) 
        AS FTECount 
    FROM tblPractitioners 
    GROUP BY PFID
) P2 ON P1.PFID = P2.PFID

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

...