2015-04-22 165 views
-1

我正在处理这个存储过程,其中一个选项需要5分钟才能运行,但其他所有选项只需要5秒。根据选项花费很长时间的SQL查询

DECLARE @rptType varchar(75) 
SET @rptType = 'Audits' 

    SELECT CLT.[cltNum] AS [Client Number] ,CLT.[cltEng] AS [Engagement] ,CLT.[cltName] AS [Client Name] , CLT.[CSPLname] AS [Assurance Partner], CLT.[cmgLName], e.[DDEventDesc] AS [Project Type], Budget.[CBudProjectDesc] AS [Project Description], DUE.[CDTargetAmount] AS [Budget], MIN(WIP.[wdate]) [1st Date], CAST(SUM(WIP.[wRate]*WIP.[wHours]) AS decimal(34,2)) [Billable WIP], CAST(SUM(AR.[ARProgress])AS decimal(34,2)) [Progress], CAST((SUM(WIP.[wRate]*WIP.[wHours]) - SUM(AR.[ARProgress]))AS decimal(34,2)) [Net Wip], CAST(sum(Bucket.[cinvar])AS decimal(34,2)) [AR Balence], MAX(inv.[InvDate]) AS [Last InvoiceDate], due.[CDDateDelivered] AS [Project OTD Date]From [sab].[dbo].[WIP] AS WIP 
    Join [sab].[dbo].Clients AS CLT 
     ON WIP.[wcltID] = CLt.[ID] 
    Join [sab].[dbo].[cltdue] AS DUE 
     ON DUE.[CDID] = WIP.[wDue] 
    join [sab].[dbo].[DDEvents] AS E 
     ON DUE.[cdEventID] = e.[ID] 
    join [sab].[dbo].[Invoice] AS Inv 
     ON WIP.[wInvNum] = INV.[invNumber] 
    Join [sab].[dbo].[AcctsRec] AS AR 
     ON INV.[invNumber] = AR.[ARApplyTo] 
    Join [sab].[dbo].[ClientBuckets] AS Bucket 
     ON CLT.ID = Bucket.ID 
    JOIN [sab].[dbo].[cltBudget] AS Budget 
     ON clt.ID = cBudCltID 



    WHERE (@rptType = 'Audit - Payroll' AND e.[DDEventDesc] = 'Audit - Payroll' AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) OR 
      (@rptType = 'Audits' AND (e.[ID] = '132' OR e.[ID] = '133' OR e.[ID] = '134' OR e.[ID] = '135' OR e.[ID] = '139' OR e.[ID] = '140' OR e.[ID] = '142' OR e.[ID] = '178') 
                 AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0) 
                 ) OR 
      (@rptType = 'Reviews & Comps' AND e.[DDEventDesc] IN ('Audit - Review', 'Audit -Comp/Disc','Audit - Comp w/o Disc') AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) OR 
      (@rptType = 'Assur Tax Returns' AND e.[DDEventDesc] IN ('5500','720-PCORI','8955-SSA','Campaign Report','Corporate (1120-POL)','LM-1','LM-2','LM-3','LM-4','LM-10','LM-30','Non-Profit (990)','Non-Profit (990 EZ)','Non-Profit (990-N)','Non-Profit (990-T)','Schedule C Letters','Section 104D Letter') AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) 

    GROUP BY 
     CLT.[cltnum], 
     CLT.[clteng], 
     CLT.[cltName], 
     CLT.[CSPLname], 
     e.[DDEventDesc], 
     Budget.[CBudProjectDesc], 
     DUE.[CDTargetAmount], 
     DUE.[CDDateDelivered], 
     DUE.[CDDateReceived], 
     CLT.[CMGLname] 
    Having sum(Bucket.[cinvar])>0 

'审计'是一个需要很长的时间。

+0

我认为,这是一些与where语句 – user3120232

+0

不审核返回显著更多或更少的显著数据比其他的选择吗?如果是这样,你应该查找参数嗅探。 –

+0

可能重复的[SQL Server:查询速度快,但程序速度慢](http://stackoverflow.com/questions/440944/sql-server-query-fast-but-slow-from-procedure) –

回答

0

进一步深入研究,我发现有些人比其他人花时间更长的原因是因为分组。当我将这个小组改为一个聚合函数时,它将时间缩短到3秒。

新的SQL:

DECLARE @rptType varchar(75) 
SET @rptType = 'Audits' 

SELECT CLT.[cltNum] AS [Client Number] , 
     CLT.[cltEng] AS [Engagement] , 
     CLT.[cltName] AS [Client Name] , 
     CLT.[CSPLname] AS [Assurance Partner], 
     CLT.[cmgLName] , 
     e.[DDEventDesc] AS [Project Type], 
     Budget.[CBudProjectDesc] AS [Project Description], 
     sum(DUE.[CDTargetAmount]) AS [Budget], 
     MIN(WIP.[wdate]) [1st Date], 
     CAST(SUM(WIP.[wRate]*WIP.[wHours]) AS decimal(34,2)) [Billable WIP], 
     CAST(SUM(AR.[ARProgress])AS decimal(34,2)) [Progress], 
     CAST((SUM(WIP.[wRate]*WIP.[wHours]) - SUM(AR.[ARProgress]))AS decimal(34,2)) [Net Wip], 
     CAST(sum(Bucket.[cinvar])AS decimal(34,2)) [AR Balence], 
     MAX(inv.[InvDate]) AS [Last InvoiceDate], 
     Max(due.[CDDateDelivered]) AS [Project OTD Date] 

From [sab].[dbo].[WIP] AS WIP 
Join [sab].[dbo].Clients AS CLT 
    ON WIP.[wcltID] = CLt.[ID] 
Join [sab].[dbo].[cltdue] AS DUE 
    ON DUE.[CDID] = WIP.[wDue] 
join [sab].[dbo].[DDEvents] AS e 
    ON DUE.[cdEventID] = e.[ID] 
join [sab].[dbo].[Invoice] AS Inv 
    ON WIP.[wInvNum] = INV.[invNumber] 
Join [sab].[dbo].[AcctsRec] AS AR 
    ON INV.[invNumber] = AR.[ARApplyTo] 
Join [sab].[dbo].[ClientBuckets] AS Bucket 
    ON CLT.ID = Bucket.ID 
JOIN [sab].[dbo].[cltBudget] AS Budget 
    ON clt.ID = cBudCltID 



WHERE (@rptType = 'Audit - Payroll' AND e.[DDEventDesc] = 'Audit - Payroll' AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) OR 
     (@rptType = 'Audits' AND e.[ID] IN (132, 133, 134, 135, 139, 140, 142, 178) AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) OR 
     (@rptType = 'Reviews & Comps' AND e.[DDEventDesc] IN ('Audit - Review', 'Audit -Comp/Disc','Audit - Comp w/o Disc') AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) OR 
     (@rptType = 'Assur Tax Returns' AND e.[DDEventDesc] IN ('5500','720-PCORI','8955-SSA','Campaign Report','Corporate (1120-POL)','LM-1','LM-2','LM-3','LM-4','LM-10','LM-30','Non-Profit (990)','Non-Profit (990 EZ)','Non-Profit (990-N)','Non-Profit (990-T)','Schedule C Letters','Section 104D Letter') AND AR.[ARType] = 1 AND (CLT.[cmaster]=1 OR CLT.[cinvIndivEng] = 0)) 

GROUP BY 
    CLT.[cltnum], 
    CLT.[clteng], 
    CLT.[cltName], 
    CLT.[CSPLname],  
    Budget.[CBudProjectDesc], 
    e.[DDEventDesc], 
    CLT.[CMGLname] 
Having sum(Bucket.[cinvar])>0 
0

假设问题是当@rpType是“Audits”时,我注意到在这种情况下不同的是您查询表[sab]中的[[ID]]列。[dbo]。[DDEvents ]。

有很多事情可能导致它运行速度明显变慢。首先要检查的是索引是否在列[ID]上创建。如果没有索引,那么这就是为什么它需要这么长时间。

另一种可能性是它只是返回更多的数据,所以花费更长的时间是正常的。

作为一个侧面说明,而不是过度使用 “或” 本部分:

AND (e.[ID] = '132' OR e.[ID] = '133' OR e.[ID] = '134' OR e.[ID] = '135' OR e.[ID] = '139' OR e.[ID] = '140' OR e.[ID] = '142' OR e.[ID] = '178') 

你可以用 “IN”:

AND e.[ID] IN ('132', '133',' 134', '135', '139', '140', '142', '178') 

差,应不影响性能 - 但它确实使代码更清洁。

+0

russ,IN需要与or语句相同的时间量。 – user3120232

+0

这就是我所说的,如果你读了整件事。 – Russ

+0

感谢大家的投入,这在SQL Server上面的帖子中没有回答:查询速度快,但程序慢;这在两个方面都运行缓慢。我发现一些标准比其他标准慢得多; 我已经切换回使用名为DDEventDesc的索引列,它是一个varchar(50)。不是一个整数。 有人可以告诉我为什么审计 - 个人财产税需要:03和审计 - EMB需要2分钟? – user3120232