Я новичок в создании хранимых процедур и функций, и я просто не могу понять, почему одна из этих версий работает намного быстрее, чем другая. Это функция, которая при вызове просто возвращает строку с описанием. Исходная функция основана на предоставлении около 10 переменных (версия работает примерно за 4 секунды). Я хотел сократить это до единственной переменной (версия работает долго).
Код ниже объявления переменных идентичен, единственное отличие состоит в том, что я пытаюсь извлечь переменные из соответствующих внутри самой функции, а не предоставлять их на стороне запроса.
т.е. dbo.cf_NoRateReason (V1) как ReasonCode, а не dbo.cf_NoRateReason (V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12)
Iизвиняюсь заранее, если я не предоставляю достаточно информации, как я уже сказал, новичок в функциях / хранимых процедурах.
Эта версия запускается примерно за 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))