当前位置: 代码迷 >> Sql Server >> 执行存储过程能占用大量CPU,求分析解决
  详细解决方案

执行存储过程能占用大量CPU,求分析解决

热度:37   发布时间:2016-04-24 10:27:14.0
执行存储过程会占用大量CPU,求分析解决
管家婆辉煌2的数据库,录单时,在调用单位名称时,该单位的数据量越大,卡的时候越长,经查看活动监视器,是在执行下面的存储过程。有时重启机器能正常,但用不了几天又会如此。
现在开店,没时间再去学习了,烦请高人帮忙分析说明这些语句,并提出解决方法(如删除其中无用语句)。有偿解决,money 100    QQ508806

USE [graspdb]
GO
/****** 对象:  StoredProcedure [dbo].[p_hh_ChkbVchArtotal]    脚本日期: 07/02/2014 23:12:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

ALTER  procedure [dbo].[p_hh_ChkbVchArtotal] @btypeid varchar(50),@sdate varchar(10),@outcnt int output
as

set @outcnt = 0
SELECT @outcnt = count(1)  FROM DlyNdx n 
INNER JOIN (
SELECT  d.btypeid,  d.VchType, 
      d.Vchcode,    d.Total  AS VchTotal, (SUM(ISNULL(g.GatheringTotal, 0)) 
      + SUM(DISTINCT ISNULL(a.Total, 0))) AS GatheringTotal, 
       d.Total  -   (SUM(ISNULL(g.GatheringTotal, 0)) 
      + SUM(DISTINCT ISNULL(a.Total, 0))) AS BalanceTotal
FROM 
(SELECT  d.btypeid,  d.VchType, 
      d.Vchcode,  Total
from 
dbo.Dlyndx d  
WHERE d.btypeid = @btypeid and d.vchtype = 11 AND 
      (d.draft = 2) AND (d.RedOld = 'F') AND d.GatheringDate <> '' AND d.GatheringDate <= @sdate
) d
 LEFT OUTER JOIN
      (
SELECT  g.VchCode, 
       g.Total GatheringTotal       
  FROM (
 (select d.Vchcode,vchtype,
       d.Total
      from dlyndx d where  d.btypeid = @btypeid  and d.vchtype = 11 AND 
      (d.draft = 2) AND (d.RedOld = 'F')  and d.GatheringDate <> '' AND d.GatheringDate <= @sdate
 ) d INNER JOIN GatheringDly g
    ON d.VchCode = g.GatheringVchCode ) LEFT JOIN DlyA a
    ON d.VchCode = a.VchCode AND a.ATypeID = '000040000390000'   AND d.VchType = 11

) g ON d.Vchcode = g.VchCode
 
 LEFT OUTER JOIN
          (SELECT VchCode, Total
         FROM DlyA
         WHERE btypeid = @btypeid and  ATypeID = '000040000390000' and vchtype = 11 
) a ON d.Vchcode = a.VchCode         
GROUP BY  d.btypeid,  d.VchType, 
      d.Vchcode,    d.Total
) b ON n.VchCode = b.VchCode   AND (b.BalanceTotal > 0)
LEFT JOIN UnWarnList u ON CONVERT(VARCHAR(25), b.VchCode) = u.TypeID AND ISNULL(u.Type, 0) = 4
WHERE   n.btypeid = @btypeid and 
n.GatheringDate <> '' 
AND n.GatheringDate <= @sdate
AND n.VchType = 11
AND n.Draft = 2
AND n.RedOld = 'F'
AND ISNULL(u.Mode, 0) <> 1 AND 
((ISNULL(u.Mode, 0) = 0 AND n.GatheringDate < @sdate) 
OR (ISNULL(u.Mode, 0) = 2 AND u.ToDate < @sdate))


------解决方案--------------------
WHERE   n.btypeid = @btypeid and 
n.GatheringDate <> '' 
AND n.GatheringDate <= @sdate
AND n.VchType = 11
AND n.Draft = 2
AND n.RedOld = 'F'
AND ISNULL(u.Mode, 0) <> 1 AND 
((ISNULL(u.Mode, 0) = 0 AND n.GatheringDate < @sdate) 
OR (ISNULL(u.Mode, 0) = 2 AND u.ToDate < @sdate))

这些条件我觉得都可以先去筛选数据,然后再和其他的表关联,尤其是数据量比较大的时候,注意建立合适的索引。
------解决方案--------------------
加这两个索引:
CREATE NONCLUSTERED INDEX NonIndex_Dlyndx on dbo.Dlyndx(VchType,btypeid,RedOld,draft) INCLUDE(Vchcode,Total);

CREATE NONCLUSTERED INDEX NonIndex_GatheringDly on dbo.GatheringDly(VchCode)
  相关解决方案