私のテーブルビューでは、私は4スカラー関数を呼び出す必要があります。 例:SQLでスカラー関数のパフォーマンスを向上させるにはどうすればよいですか?
CREATE view [SUMMARY]
AS
SELECT [Code] ,
...
dbo.[udf_REPORTTYPE](ts.LegTankSystemId,ReportingDate,analysis.[AnalysisTypeName]) as ReportingType ,
dbo.[udf_WATER](ts.SystemId,LastObsDate) as WaterReading,
case when analysis.LastObsDate is null then NULL else dbo.[udf_BJs_GENERAL](ts.LegTankSystemId,ISNULL(analysis.LastObsDate, ssd.ReportingDate)) end as [1Plus130_Reslut],
(CASE WHEN State ='NY' THEN dbo.[udf_NY](ts.SystemId,LastObsDate)
WHEN State ='CT' THEN dbo.[udf_CT] (ts.SystemId,LastObsDate)
END) AS State_SIR_Result
FROM LOBDW.SITE dimsite
LEFT JOIN [bjs].[udv_TANK] ts on dimsite.SiteId = ts.SiteId
...
私は同じパラメータを読み込み、異なる計算を行って、これらのスカラー関数で。
私の見解は、1分以上かかります400行を返すように。それは本当に悪いです。 これらのスカラー関数のパフォーマンスを改善することはできますか?ある関数からグローバル変数を定義し、両方の関数が同じデータを必要とする場合、その関数を別の関数で使用する方法はありますか?
例えば機能。
CREATE FUNCTION [dbo].[udf_REPORTTYPE]
(
@TankSystemId int,
@TimeStamp datetime2(7),
@AnalysisTypeName varchar(10)
)
RETURNS varchar(10)
AS
BEGIN
DECLARE @ReportType varchar(10);
DECLARE @TimePeriod datetime2(7)
DECLARE @LatestAnalysisDate datetime2(7)
SELECT TOP 1 @TimePeriod = Date FROM udv_DailySiraData where [email protected] ORDER BY Date DESC
SELECT TOP 1 @LatestAnalysisDate = LastObsDate FROM [udv_ANALYSES] where TankSystemId [email protected] ORDER BY LastObsDate DESC
SET @[email protected]
IF ((@TimePeriod>[email protected]) AND (@LatestAnalysisDate < @TimeStamp) AND @AnalysisTypeName IS NULL)
SET @ReportType = 'No Analysis Result';
IF ((@TimePeriod>[email protected]) AND @AnalysisTypeName IS NULL)
SET @ReportType = 'Latest';
RETURN @ReportType;
END;
あなたはあなたのビューで使用しているテーブル9N定義された任意のIインデックスを持っていますか? –
@MarkKramインデックスはまだありません。しかし、私は自分の関数を最適化しようとすると、パフォーマンスを参照してインデックスingをしようとします..ある関数からグローバル変数を定義し、両方の関数が同じデータを必要とする場合、別の関数で使用する方法はありますか? – Ratha
使用しないでください。代わりに[CTEs](https://technet.microsoft.com/en-us/library/ms190766(v = sql.105).aspx)を使用してください。 – codeConcussion