Эффективность функции - PullRequest
       2

Эффективность функции

0 голосов
/ 17 октября 2019

Я новичок в создании хранимых процедур и функций, и я просто не могу понять, почему одна из этих версий работает намного быстрее, чем другая. Это функция, которая при вызове просто возвращает строку с описанием. Исходная функция основана на предоставлении около 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))

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Этот вид подпадает под "опечатку" или простой надзор, но ....

Когда вы видите такую ​​большую разницу в производительности, без видимой причины (эти функции использовались в оригинальной версии какхорошо), это обычно, когда вам нужно начать искать такие ошибки: опечатки, пропущенные условия, неправильные условия из-за слишком сильного использования intellisense / дополнения кода и т. д. *

При замене нескольких параметровс тем, который можно использовать для автоматического извлечения остальных, всегда обязательно используйте этот параметр.

В указанной вами версии нет фильтра (предложение WHERE) в SELECT, который используется для получения «параметра». значения это нормально передается. Вы фактически получаете полный набор результатов соединения, со стоимостью вызовов функций для каждой строки результатов и только со значениями последнего результата.

0 голосов
/ 17 октября 2019

Вы правы - единственное отличие заключается в использовании функции. Пожалуйста, смотрите похожие вопросы , где это было решено.

Короче говоря, функции будут выполняться построчно, в то время как код на стороне запроса будет иметь другие опции без дополнительных вызовов функции. Возможно, вам удастся использовать скалярную функцию с привязкой схемы, а нулевые значения возвращают нулевые значения для повышения производительности.

Дополнительные соображения по поводу плана схемы были бы полезны. Здесь также есть объединения и другие встроенные логики, которые не ясны без примеров данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...