存储过程查询超时

时间:2013-09-15 10:41:48

标签: sql stored-procedures

大家好, 如何使这个查询最佳性能,因为它超时 大量的记录,请帮忙 请注意,我在一些与

连接的表格上制作了索引

如果有任何更新或以任何方式以新方式重写此存储过程 使其运行更快或性能最佳。

 ALTER PROCEDURE [dbo].[LoadClosedRequests]
    @RequestBusinessUnitId int,
    @StatusId int,
    @ProdId int,
    @SortExp varchar(100),
    @RequestID int,
    @RequestNumber int,
    @User varchar(56)  
    AS

    SELECT  Request.RequestID,RequestStatusID,RequestStatusName,
           BusinessUnitName,
           RequestWorkFlowID,
          RequestDate,RequestHFMApplicationID as RequestApplication,[User].UserName as RequestUserUserName,User_SWFT.UserId as RequestUserUserId,[User].UserEmail as RequestUserUserEmail,-1 as RequestParentKey,'' as RequestDescription,'' as RequestInitiatorUserName, -1 as RequestInitiatorUserId,'' as RequestInitiatorUserEmail
    ,Request.RequestType as RequestType,workflow.productID,productname
    FROM 
    (
    select requestid,LatestStatusDate,RequestStatusID,RequestStatusName
    from 
    (
    SELECT [RequestID],Max(HistoryItemDate) as LatestStatusDate
    from historyitem inner join request on historyitemRequestid=requestid
    group by RequestID
    ) currentstatus
    inner join historyitem on RequestID=HistoryItemRequestID and historyitemdate=LatestStatusDate
    inner join RequestStatus on RequestStatus.RequestStatusID=HistoryItem.HistoryItemRequestStatusID and HistoryItem.HistoryItemRequestStatusID in(2,3,4,5,6,9,10)
    --order by requestid
    ) LatestStatus

    inner join request on LatestStatus.requestid=Request.RequestID
    inner join Request on Request.RequestID=Request.RequestID
    inner join HistoryItem on HistoryItem.HistoryItemRequestID=Request.[RequestID]
    inner join User on UserID=RequestUser
    inner join [user] on [user].UserID=User.userid
    inner join WorkFlow on WorkFlowId=RequestWorkFlowID
    inner join BusinessUnit on BUID=BusinessUnitId
    inner Join Products on WorkFlow.ProductID= Products.ProductID


    where 
    (RequestStatusID=@StatusId or @StatusId=-1)and 
    (workflow.productID=@ProdId or @ProdId=-1)
    and (WorkFlow.buid=@RequestBusinessUnitId or @RequestBusinessUnitId=-1)
    and (Request.RequestID = @RequestNumber or @RequestNumber = -1)
    and (@User = '' or [User].UserName like '%'+ replace(@User, '*', '%') + '%' or exists (select distinct RequestID from requestuser inner join [User] on [User].userid = requestuser.userid where requestuser.requestID = Request.RequestID and [User].UserName like '%'+ replace(@User, '*', '%') + '%' ))

    group by Request.RequestID,RequestStatusID,RequestStatusName,
           BusinessUnitName,
           RequestWorkFlowID,
          RequestDate,RequestHFMApplicationID ,[User].UserName ,User.UserId,[User].UserEmail
    ,Request.RequestType,workflow.productID,productname

    ORDER BY 

    (
        CASE LOWER(@SortExp)

        WHEN 'requestuser' THEN  LOWER([User].[UserName]) 
        WHEN 'requestbu' THEN  LOWER(BusinessUnitName) 
        WHEN 'requeststatus' THEN  LOWER(RequestStatusName) 
        WHEN 'requestproduct' THEN  LOWER(productname) 
        WHEN 'requestapplication' THEN LOWER(CAST (RequestHFMApplicationID  AS VARCHAR) COLLATE SQL_Latin1_General_CP1_CI_AS)
        when 'requesttype'  THEN  
            ( 
                CASE LOWER([User].[UserName])
                WHEN 'Multi User' then 'Bulk'
                ELSE 'Single' 
                END
            )
        END
    ),

    (
        CASE LOWER(@SortExp) 
        WHEN 'requestdate' THEN RequestDate 
        END
    ),
    (
        CASE LOWER(@SortExp) 
        WHEN 'requestid' THEN Request.RequestID
        END
    )

0 个答案:

没有答案