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!!