管家婆辉煌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)