首页 新闻 搜索 专区 学院

帮忙优化存储过程

0
悬赏园豆:50 [待解决问题]

请各位大侠帮我看看这个存储过程怎么进行优化:

1 ALTER PROC [dbo].[proc_aa]
2 (
3 @start DATETIME ='2010-12-01 00:00:00'
4 ,@end DATETIME ='2010-12-02 00:00:00'
5 ,@branch VARCHAR(20)='%'
6 ,@grpno VARCHAR(20) ='%'
7 ,@uid VARCHAR(20) ='%'
8 )
9 AS
10 begin
11 SELECT
12 u.uid AS [工号]
13 ,u.name AS [姓名]
14 ,COUNT(b.id) AS [呼入总量]
15 ,COUNT(c.id) AS [呼入通话量]
16 ,ISNULL(SUM(c.TalkDuration),0) AS [呼入通话时长]
17 ,COUNT(e.id) AS [呼出总量]
18 ,COUNT(f.id) AS [呼出接通量]
19 ,ISNULL(SUM(f.TalkDuration),0) AS [呼出通话时长]
20 ,ISNULL(l.doingsec,0) AS [后台时长]
21 FROM dbo.rc_calllog a
22 LEFT JOIN dbo.rc_calllog b ON a.id = b.id AND b.IO=0
23 LEFT JOIN dbo.rc_calllog c ON a.id = c.Id AND c.IO=0 AND c.AnswerFlag=1
24 LEFT JOIN dbo.rc_calllog e ON a.id = e.id AND e.IO=1
25 LEFT JOIN dbo.rc_calllog f ON a.id = f.id AND f.IO=1 AND f.AnswerFlag=1
26 --状态时长
27 LEFT JOIN
28 (
29 SELECT uid,SUM(duration) AS doingsec
30 FROM dbo.rc_statrecord WHERE status='主动服务' AND starttime BETWEEN @start AND @end GROUP BY uid
31 )l ON a.AgentId= l.uid
32 INNER JOIN dbo.rc_operator u ON a.AgentId=u.uid ---
33 INNER JOIN
34 (
35 SELECT DISTINCT uid FROM dbo.rc_branchList
36 INNER JOIN dbo.rc_grpchlist ON dbo.rc_branchList.grpno = dbo.rc_grpchlist.grpno
37 WHERE dbo.rc_branchList.name LIKE @branch AND dbo.rc_grpchlist.grpno LIKE @grpno AND uid LIKE @uid
38 ) grp ON u.uid = grp.uid
39 WHERE a.InboundCallTime BETWEEN @start AND @end OR a.StartRingTime BETWEEN @start AND @end
40 GROUP BY u.uid,u.name,l.doingsec
41
42 END
43
44
45
46

表结构:
rc_branchList(部门信息)
name varchar(50):部门名称
grpno int:部门中的组
---------------------------
rc_grpchlist(组信息)
grpno int:组号
uid varchar(50):工号
----------------------
rc_operator(工号信息)
uid varchar(20):工号
pwd varchar(50):密码
name varchar(20):姓名
------------------------
rc_calllog(记录工号呼入呼出电话)
id bigint
IO int:电话呼入/呼出
InboundCallTime datetime:呼入时间
StartRingTime datetime:呼出时间
AnswerFlag int:电话是否接通
AgentId varchar(50) :工号

-------------------------
rc_statrecord(通话状态信息)
status varchar(50):状态名称
starttime datetime:开始时间
endtime datetime:结束时间
duration int:状态的持续时间
uid varchar(50):工号

各表数据扫描:
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'rc_statrecord'。扫描计数 3,逻辑读取 33109 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'rc_branchList'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'rc_grpchlist'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'rc_operator'。扫描计数 3,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'rc_calllog'。扫描计数 15,逻辑读取 51600 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
警告: 聚合或其他 SET 操作消除了空值。

Mafer的主页 Mafer | 初学一级 | 园豆:80
提问于:2010-12-14 15:21
< >
分享
所有回答(1)
0

1.rc_calllog 这个表出现的次数太多肯定有问题,可以写成一个表,后面的条件都写成   case when 放在前面

2. (SELECT uid,SUM(duration) AS doingsec
30FROM dbo.rc_statrecord WHERE status='主动服务'AND starttime BETWEEN@startAND@endGROUPBY uid)用
exists 替代 between and 并且给时间加上索引

3.传入的参数有可能为空,所以建议你用都拼接语句,判断是否为空再决定是否加上条件

没有测试!

maanshancss | 园豆:303 (菜鸟二级) | 2013-03-08 21:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册