功能效率

问题描述 投票:0回答:1

我是创建存储过程和函数的新手,但是我无法弄清楚为什么其中一个版本的运行速度比另一个版本快得多。这是一个仅在调用时返回带有说明的字符串的函数。原始功能依赖于提供大约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))

sql-server function processing-efficiency
1个回答
0
投票

您是正确的-唯一的区别是使用此功能。请参阅similar questions,此处已解决。

简而言之,函数将逐行执行,而查询端的代码将具有其他选项,而不会对该函数进行开销调用。您也许可以将标量函数与架构绑定一起使用,并且null可以返回null以获得更好的性能。

对架构计划的其他考虑将很有价值。没有示例数据,这里还有不清楚的联接和其他嵌入式逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.