Спасибо за действительно подробный ответ и за улучшение моей функции! :)

о, поэтому я прочитал целую кучу статей, предлагающих функции табличных значений и перекрестное применение, дают лучшую производительность, чем скалярный 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 

Спасибо!!

Ответы на вопрос(1)

Ваш ответ на вопрос