Итак, я прочитал целую кучу статей, предлагающих функции табличного значения и перекрестное применение, обеспечивающие лучшую производительность, чем скалярный 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
Спасибо!!
YYYY
более читабелен, чем, скажем,Year
? - person Damien_The_Unbeliever   schedule 15.12.2010