わかりましたので、テーブル値関数とクロス適用を提案する記事をたくさん読んだので、スカラー udf よりも優れたパフォーマンスが得られます。私は両方の方法で関数を作成し、どちらが優れているかをテストしたかったのですが、どちらがより良いオプションであるかを理解するために何を使用/探すべきかを理解できません。
SQL Server 2005 を使用しています。推定実行計画、実際の実行計画を実行し、データベース エンジン チューニング アドバイザーでクエリを分析しようとしましたが、何を伝えようとしているのかわかりません。
/off で showplan_all を使用すると、テーブル ベースの関数は 8.3e-05 よりも多くの CPU 1.157e-06 を使用するように見えますが、テーブル関数の合計サブツリー コストは 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
ありがとう!!