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