Случайная медленная производительность запросов в SQL Server 2016 - PullRequest
0 голосов
/ 19 ноября 2018

Увидимся в чем проблема ...

SELECT 
    SUM(A.POSTEDQTY),
    SUM(A.POSTEDVALUE),
    SUM(A.PHYSICALVALUE),
    SUM(A.DEDUCTED),
    SUM(A.RECEIVED),
    SUM(A.RESERVPHYSICAL),
    SUM(A.RESERVORDERED),
    SUM(A.REGISTERED),
    SUM(A.PICKED), 
    SUM(A.ONORDER),
    SUM(A.ORDERED),
    SUM(A.ARRIVED),
    SUM(A.QUOTATIONRECEIPT),
    SUM(A.QUOTATIONISSUE),
    SUM(A.AVAILPHYSICAL),
    SUM(A.AVAILORDERED),
    SUM(A.PHYSICALINVENT) 
FROM 
    INVENTSUM A WITH(NOLOCK) 
WHERE 
    ((A.DATAAREAID = @P1) 
    AND ((A.ITEMID = @P2) 
    AND (A.CLOSED = @P3))) 
    AND EXISTS (SELECT 'x' FROM INVENTDIM B WITH (NOLOCK) 
                WHERE ((B.DATAAREAID = @P4) 
                  AND ((((B.INVENTDIMID = A.INVENTDIMID) AND (B.CONFIGID = @P5)) 
                  AND (B.INVENTLOCATIONID = @P6)) AND (B.INVENTBATCHID = @P7))))

Низкая производительность запроса

declare @p2 int
set @p2=180157421
declare @p3 int
set @p3=16
declare @p4 int
set @p4=1
declare @p5 int
set @p5=1
exec sp_cursorexecute 1073741895,@p2 output,@p3 output,@p4 output,@p5 output,N'ens',N'V89710821',0,N'ens',N'PO16628',N'AS',N'OFS028748'
select @p2, @p3, @p4, @p5

Параметры запроса медленная производительность

SELECT SUM(A.POSTEDQTY),SUM(A.POSTEDVALUE),SUM(A.PHYSICALVALUE),SUM(A.DEDUCTED),SUM(A.RECEIVED),SUM(A.RESERVPHYSICAL),SUM(A.RESERVORDERED),SUM(A.REGISTERED),SUM(A.PICKED),SUM(A.ONORDER),SUM(A.ORDERED),SUM(A.ARRIVED),SUM(A.QUOTATIONRECEIPT),SUM(A.QUOTATIONISSUE),SUM(A.AVAILPHYSICAL),SUM(A.AVAILORDERED),SUM(A.PHYSICALINVENT) FROM INVENTSUMDELTA A WHERE ((A.DATAAREAID=@P1) AND (((A.ITEMID=@P2) AND (A.ISAGGREGATED=@P3)) AND (A.TTSID=@P4))) AND EXISTS (SELECT 'x' FROM INVENTDIM B WHERE ((B.DATAAREAID=@P5) AND ((((B.INVENTDIMID=A.INVENTDIMID) AND (B.CONFIGID=@P6)) AND (B.INVENTLOCATIONID=@P7)) AND (B.INVENTBATCHID=@P8))))

Тот же запрос, хорошая производительность

declare @p2 int
set @p2=180157423
declare @p3 int
set @p3=16
declare @p4 int
set @p4=1
declare @p5 int
set @p5=1
exec sp_cursorexecute 1073741904,@p2 output,@p3 output,@p4 output,@p5 output,N'ens',N'V89710821',0,5666550353,N'ens',N'PO16628',N'AS',N'OFS028748'
select @p2, @p3, @p4, @p5

Параметры того же запроса, хорошая производительность

В SQLServer Profiler вы можете видеть, что тот же запрос выполняется за 0 мс или более 10000 мс

И если я попытаюсь выполнить тот же запрос (10000мс) с теми же параметрами напрямую, это займет 0мс

Что происходит?

Спасибо !! :)

1 Ответ

0 голосов
/ 19 ноября 2018

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

https://littlekendra.com/2016/11/25/why-is-my-query-faster-the-second-time-it-runs-dear-sql-dba-episode-23/

...