Спасибо за действительно подробный ответ и за улучшение моей функции! :)
о, поэтому я прочитал целую кучу статей, предлагающих функции табличных значений и перекрестное применение, дают лучшую производительность, чем скалярный udf. Я хотел написать свою функцию обоими способами, а затем проверить, какая из них лучше - но я не могу понять, что я должен использовать / искать, чтобы понять, какой вариант лучше.
Я использую SQL Server 2005. Я попытался запустить примерный план выполнения, реальный план выполнения и проанализировать запрос в помощнике по настройке ядра базы данных, и я не знаю, что он пытается мне сказать.
При включении / выключении showplan_all похоже, что табличная функция будет использовать больше ЦП 1.157e-06 против 8.3e-05, но общая стоимость поддерева 0,000830157 против 0,01983356 у табличной функции.
Стоимость запроса табличной функции также кажется выше, чем скалярная. Хотя я думал, что это должен быть лучший вариант.
Так что, хотя я хотел бы доказать это самому, какой из них дает лучшую производительность - я просто не уверен, что искать в этих инструментах - поэтому любые предложения будут оценены!
Мне нужно получить значение учебного года (на основе диапазона дат, установленного в базе данных) на основе календарной даты, чтобы содержание функции было ниже - так что я просто выберу скаляр или таблицу. Этот год кормит в других запросах ..
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
Спасибо!!