好的,所以我已经阅读了一大堆文章,建议表值函数和交叉应用比标量 udf 提供更好的性能。我想以两种方式编写我的函数,然后测试哪个更好 - 但我无法弄清楚我应该使用/寻找什么来理解哪个是更好的选择。
我正在使用 SQL Server 2005。我尝试在数据库引擎优化顾问中运行估计的执行计划、实际执行计划和分析查询,但我不知道它试图告诉我什么。
使用 showplan_all on / off 看起来基于表的函数将使用更多的 cpu 1.157e-06 vs 8.3e-05,但表函数的总子树成本为 0.000830157 vs 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
谢谢!!