Тестирование производительности скалярных и табличных функций на сервере sql

Хорошо, я прочитал целую кучу статей, в которых предлагалось, что функции табличного значения и перекрестное применение дают лучшую производительность, чем скалярный udf. Я хотел написать свою функцию обоими способами, а затем протестировать, чтобы увидеть, какой из них лучше, но я не могу понять, что я должен использовать / искать, чтобы понять, какой вариант лучше.

Я использую SQL Server 2005. Я пробовал запускать предполагаемый план выполнения, фактический план выполнения и анализировать запрос в советнике по настройке ядра базы данных, и я не знаю, что он пытается мне сказать.

Использование showplan_all on / off выглядит как функция на основе таблицы будет использовать больше ЦП 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 

Спасибо !!

10
задан marc_s 15 December 2010 в 06:44
поделиться