Prueba de rendimiento de funciones escalares frente a funciones con valores de tabla en el servidor SQL

Bien, he leído un montón de artículos que sugieren que las funciones de valor de tabla y la aplicación cruzada ofrecen un mejor rendimiento que un udf escalar. Quería escribir mi función en ambos sentidos y luego probar para ver cuál es mejor, pero no puedo entender qué se supone que debo usar / buscar para comprender cuál es la mejor opción.

Estoy usando SQL Server 2005. He intentado ejecutar el plan de ejecución estimado, el plan de ejecución real y analizar la consulta en el asesor de ajuste del motor de base de datos y no sé qué está tratando de decirme.

Al usar showplan_all on / off, parece que la función basada en la tabla usará más cpu 1.157e-06 frente a 8.3e-05, pero la función de tabla tiene un costo total de subárbol de 0.000830157 frente a 0.01983356.

El costo de la consulta de la función de valor de tabla también parece tener un costo mayor que el escalar. Aunque pensé que se suponía que era la mejor opción.

Entonces, aunque me gustaría probar cuál es el que brinda el mejor rendimiento, simplemente no estoy seguro de qué buscar en estas herramientas, por lo que cualquier sugerencia sería apreciada.

Necesito obtener un valor de año académico (basado en un rango de fechas establecido en la base de datos) basado en una fecha de calendario para que el contenido de la función esté debajo, por lo que es solo si me baso en escalar o en tabla. Este año alimenta otras consultas.

CREATE FUNCTION fn_AcademicYear
(
    -- Add the parameters for the function here
    @StartDate DateTime
)
RETURNS 
@AcademicYear TABLE 
(
    AcademicYear int
)
AS
BEGIN

DECLARE @YearOffset int, @AcademicStartDate DateTime 

    -- Lookup Academic Year Starting Date
    SELECT @AcademicStartDate = CONVERT(DateTime,[Value])
    FROM dbo.SystemSetting
    WHERE [Key] = 'AcademicYear.StartDate'

    SET @YearOffset = DATEPART(YYYY,@StartDate) - DATEPART(YYYY,@AcademicStartDate);
    -- try setting academic looking start date to year of the date passed in
    SET @AcademicStartDate = DATEADD(YYYY, @YearOffset, @AcademicStartDate);

    IF @StartDate < @AcademicStartDate
    BEGIN
        SET @AcademicStartDate = DATEADD(YYYY, @YearOffset-1, @AcademicStartDate);
    END

      INSERT @AcademicYear
      SELECT YEAR(@AcademicStartDate)

    RETURN 

¡¡Gracias!!

Respuestas a la pregunta(1)

Su respuesta a la pregunta