我是创建存储过程和函数的新手,但是我无法弄清楚为什么其中一个版本的运行速度比另一个版本快得多。这是一个仅在调用时返回带有说明的字符串的函数。原始功能依赖于提供大约10个变量(版本在大约4秒钟内运行)。我想将其缩减为一个变量(版本运行很长时间)。
变量声明下面的代码是相同的,唯一的区别是我试图从函数本身中的适当位置提取变量,而不必在查询端提供它们。
即dbo.cf_NoRateReason(V1)作为ReasonCode而不是dbo.cf_NoRateReason(V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12)
如果我没有提供足够的信息(如我所说,对于功能/存储过程来说是新的,我会在前面道歉。
此版本运行大约需要2.5分钟才能运行
declare @Agencyid int
declare @ServiceCode varchar(10)
declare @Mod1 varchar(2)=null
declare @Mod2 varchar(2)=null
declare @Mod3 varchar(2)=null
declare @Mod4 varchar(2)=null
declare @POS int
declare @ServiceDate datetime
declare @ProvType varchar(1)
declare @PayerID int
declare @BirthDate datetime
declare @RenderingStaffID int
declare @SupervisingStaffID int
Select @Agencyid=s.agencyid, @ServiceCode = ServiceCode,
@Mod1 = ModifierCodeId, @Mod2 = ModifierCodeId2,
@Mod3 = ModifierCodeId3, @Mod4 = ModifierCodeId4,
@POS=PlaceOfServiceId, @ServiceDate = ServiceDate,
@RenderingStaffId=isnull(dbo.GetProviderStaffId('S',s.ServiceTransactionId,'82'),0),
@SupervisingStaffId=isnull(dbo.GetProviderStaffId('C',ClaimId,'DQ'),0),
@ProvType=s.servicetype, @Payerid=pmt.payerid,
@BirthDate=i.birthdate
From ServiceTransaction s
join individual i on s.servicetransactionid = i.individualid
join pmtadjdetail pmt on s.servicetransactionid = pmt.servicetransactionid
declare @Result Varchar(100) = ''
declare @Age int = dbo.getageatservicedate(@birthdate, @ServiceDate)
declare @ModString varchar(8) = dbo.sortmodifiers(@Mod1, @Mod2, @Mod3, @Mod4)
declare @DirectSupervision int = (iif(@Mod1 in ('U1','U6','U7','U9','UA')
or @Mod2 in ('U1','U6','U7','U9','UA')
or @Mod3 in ('U1','U6','U7','U9','UA')
or @Mod4 in ('U1','U6','U7','U9','UA'),1,0))
'************************************************************************************'
'This version takes about 4 seconds to run'
'************************************************************************************'
begin
declare @Result Varchar(100) = ''
declare @Age int = dbo.getageatservicedate(@birthdate, @ServiceDate)
declare @RenderingStaffID int = dbo.getstaffid(@STID,'DQ')
declare @SupervisingStaffID int = dbo.getstaffid(@STID,'82')
declare @ModString varchar(8) = dbo.sortmodifiers(@Mod1, @Mod2, @Mod3, @Mod4)
declare @DirectSupervision int = (iif(@Mod1 in ('U1','U6','U7','U9','UA')
or @Mod2 in ('U1','U6','U7','U9','UA')
or @Mod3 in ('U1','U6','U7','U9','UA')
or @Mod4 in ('U1','U6','U7','U9','UA'),1,0))