2016-09-11 2 views
0

у меня есть этот запрос в хранимой процедуре:Функция в операторе отбора делает мой запрос работать очень медленно

SELECT  
    *, 
    ISNULL(dbo.ReturnShortageByItemCodeLinePackage(LineId, TestPackageId, MaterialDescriptionId), 0) AS Shortage 
FROM 
    dbo.ViewMTO 

Я использую функцию внутри запроса для вычисления целочисленного значения, как вы можете увидеть здесь:

ALTER FUNCTION [dbo].[ReturnShortageByItemCodeLinePackage] 
    (@lineId int,@testpackId int, @MaterialDescriptionId int) 
RETURNS float 
AS 
BEGIN 
    DECLARE @shortageQuantity float 
    DECLARE @MIVQuantity float 
    DECLARE @totalQuantity float 
    DECLARE @spoolQuantity float 
    DECLARE @ExistInSiteQuantity float 
    DECLARE @BeforeDoneQuantity float 

    SELECT 
     @totalQuantity = Quantity, 
     @spoolQuantity = QuantitySpool, 
     @ExistInSiteQuantity = QuantityExistInSite, 
     @BeforeDoneQuantity = QuantityBeforeDone 
    FROM 
     [SPMS2].[dbo].Materials 
    WHERE 
     LineId = @lineId 
     AND TestPackageId = @testpackId 
     AND MaterialDescriptionId = @MaterialDescriptionId 

    SELECT 
     @MIVQuantity = SUM(QuantityDeliver) 
    FROM 
     MaterialIssueVoucherDetails miv 
    JOIN 
     MaterialRequestContractorDetails mrc ON miv.MaterialRequestContractorDetailId = mrc.Id 
    WHERE 
     TestPackageId = @testpackId 
     AND LineId = @lineId 
     AND miv.MaterialDescriptionId = @MaterialDescriptionId 

    IF @MIVQuantity IS NULL 
    BEGIN 
     SET @MIVQuantity = 0  
    END 

    SET @shortageQuantity = @totalQuantity - (@BeforeDoneQuantity + @ExistInSiteQuantity + @spoolQuantity + @MIVQuantity) 

    RETURN round(@shortageQuantity, 3) 
END 

Запрос мой запрос выполнен через 3 минуты, это катастрофично для моих пользователей! Есть ли лучшее решение?

+0

Есть ViewMTO вид? – scsimon

ответ

1

я могу порекомендовать три вещи:

A. В следующей строке ..

SELECT @totalQuantity= ... 
FROM [SPMS2].[dbo].Materials 

Является ли это доступ к базе данных с помощью другого соединения Linked Server? Как быстро это соединение?

B. Ваш номер SP содержит ВЫБОР утверждений. Кто из них является узким местом? Вы можете добавить некоторые операторы PRINT, чтобы показать, когда каждый начал:

PRINT convert(nvarchar, GetDate(), 108) + ' This is the time !' 

C. Попробуйте запустить SQL-шоу на веб-странице ниже, что позволит выделить недостающие индексы.

Find missing indexes

Надеется, что это помогает.

+0

спасибо, но spms2 - это имя моего текущего db –

+0

Хорошо, что ответил на 1 из моих 3 предложений ... И еще 2 ...? –

Смежные вопросы