哪位高手帮忙优化一下我的这个存储过程

zq102605 2007-11-28 11:10:43
三张数据表
客户统计人员列表
字段: 部门,姓名

客户表
字段: 客户名称 ,添加时间,修改时间

潜在客户表
字段: 客户名称 ,添加时间,修改时间

做一个存储过程
传入参数:部门,开始时间,结束时间
得到 统计表
字段: 部门,姓名,客户更新量,客户增量,潜在客户更新量,潜在客户增量

CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin

select a. BusinessUnitIdName as 所属 ,a.CreatedByName as 负责人,
[客户更新量] = (select count(公司名称) from 所有客户 where 修改时间 between @开始时间 and @结束时间 and 负责人 = a.CreatedByName ),
[客户增量] = (select count(公司名称) from 所有客户 where 添加时间 between @开始时间 and @结束时间 and 负责人 = a.CreatedByName ),
[潜在客户更新量] = (select count(*) from 所有潜在客户 where 修改时间 between @开始时间 and @结束时间 and 负责人 = a.CreatedByName ),
[潜在客户增量] = (select count(*) from 所有潜在客户 where 添加时间 between @开始时间 and @结束时间 and 负责人 = a.CreatedByName )
from 客户统计人员列表 a where BusinessUnitIdName=@所属


end
GO


客户表中2万多条记录,潜在客户13万条记录
在查询分析器里执行这个存储过程要42秒, 在asp中调这个存储过程
sSql = "exec proc_Zltj '" & sArea & "','" & dbegin & "','" & dEnd & "'"
cn1.execute sSql
总是抱超时错误,跪求高手帮忙解决一下
...全文
59 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leo_lesley 2007-11-28
  • 打赏
  • 举报
回复
你上面的存储过程中有1点没有说明确,就是你的 添加时间,修改时间 是怎么存的(),
就是说当你新增加了一条记录时,只存 添加时间 为当前日期,还是 添加时间,修改时间 都存当前日期
如果是只存 添加日期,那用第一种,如果是 添加时间,修改时间 都存当前日期,那就用第二种

第一种
CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin


select a.部门,a.姓名,
客户更新量=sum(case when b.修改时间 is not null then 1 else 0 end),
客户增量=sum(case when b.修改时间 is null then 1 else 0 end),
潜在客户更新量=sum(case when c.修改时间 is not null then 1 else 0 end),
潜在客户增量=sum(case when c.修改时间 is null then 1 else 0 end)
from 客户统计人员列表 a inner join (select * from 客户表 where 添加时间 between @开始时间 and @结束时间) b on a.姓名=b.客户名称
inner join (select * from 潜在客户表 where 添加时间 between @开始时间 and @结束时间) c on a.姓名=b.客户名称
where a.部门=@所属
group by a.部门,a.姓名

end
GO


第二种

CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin


select a.部门,a.姓名,
客户更新量=sum(case when b.添加时间<>b.修改时间 then 1 else 0 end),
客户增量=sum(case when b.添加时间=b.修改时间 then 1 else 0 end),
潜在客户更新量=sum(case when c.添加时间<>c.修改时间 then 1 else 0 end),
潜在客户增量=sum(case when c.添加时间=c.修改时间 then 1 else 0 end)
from 客户统计人员列表 a inner join (select * from 客户表 where 添加时间 between @开始时间 and @结束时间) b on a.姓名=b.客户名称
inner join (select * from 潜在客户表 where 添加时间 between @开始时间 and @结束时间) c on a.姓名=b.客户名称
where a.部门=@所属
group by a.部门,a.姓名

end
GO
wuxinyuzhu 2007-11-28
  • 打赏
  • 举报
回复

这样会快一点吗?
CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin


select a. BusinessUnitIdName as 所属 ,a.CreatedByName as 负责人, b.[客户更新量], b.[客户增量],c.潜在客户更新量,c.潜在客户增量

from 客户统计人员列表 a inner join

(select 负责人,[客户更新量] = sum(case when 修改时间 between @开始时间 and @结束时间 then 1 else 0 end ),
[客户增量] = sum(case when 添加时间 between @开始时间 and @结束时间 then 1 else 0 end )
from 所有客户 group by 负责人) b on a.CreatedByName=b.负责人
inner join
(select 负责人, [潜在客户更新量] = sum(case when 修改时间 between @开始时间 and @结束时间 then 1 else 0 end ),
[潜在客户增量] = sum(case when 添加时间 between @开始时间 and @结束时间 then 1 else 0 end )
from 所有潜在客户 group by 负责人) c on a.CreatedByName=c.负责人
where BusinessUnitIdName=@所属
end
GO

leo_lesley 2007-11-28
  • 打赏
  • 举报
回复
CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin


select a.部门,a.姓名,
客户更新量=sum(case when b.添加时间<>b.修改时间 then 1 else 0 end),
客户增量=sum(case when b.添加时间=b.修改时间 then 1 else 0 end),
潜在客户更新量=sum(case when c.添加时间<>c.修改时间 then 1 else 0 end),
潜在客户增量=sum(case when c.添加时间=c.修改时间 then 1 else 0 end)
from 客户统计人员列表 a inner join (select * from 客户表 where 添加时间 between @开始时间 and @结束时间) b on a.姓名=b.客户名称
inner join (select * from 潜在客户表 where 添加时间 between @开始时间 and @结束时间) c on a.姓名=b.客户名称
where a.部门=@所属
group by a.部门,a.姓名

end
GO
utpcb 2007-11-28
  • 打赏
  • 举报
回复

CREATE proc proc_Zltj
(
@所属 varchar(40),
@开始时间 datetime,
@结束时间 datetime
)
as
begin
declare @客户更新量 int,
@客户增量 int,
@潜在客户更新量 int ,
@潜在客户增量 int

select @客户增量=count(公司名称) from 所有客户 where 添加时间 between @开始时间 and @结束时间 and 负责人=a.CreatedByName
select @潜在客户更新量=count(*) from 所有潜在客户 where 修改时间 between @开始时间 and @结束时间 and 负责人=a.CreatedByName
select @潜在客户增量=count(*) from 所有潜在客户 where 添加时间 between @开始时间 and @结束时间 and 负责人=a.CreatedByName

select a.BusinessUnitIdName as 所属 ,a.CreatedByName as 负责人, @客户更新量 ,@客户增量 ,@潜在客户更新量, @潜在客户增量
from 客户统计人员列表 a where BusinessUnitIdName=@所属

end
GO

建议把中间的中文变量换成英文变量
kuangdp 2007-11-28
  • 打赏
  • 举报
回复
设计时可以考虑把客户表和潜在客户表合并成一个表,用一个字段TYPE来区分是属于客户还是潜在客户;
另外考虑建立索引.
leo_lesley 2007-11-28
  • 打赏
  • 举报
回复
--试试这个sql 语句
select 部门,姓名,
客户更新量=sum(case when b.添加时间<>b.修改时间 then 1 else 0 end),
客户增量=sum(case when b.添加时间=b.修改时间 then 1 else 0 end),
潜在客户更新量=sum(case when c.添加时间<>c.修改时间 then 1 else 0 end),
潜在客户增量=sum(case when c.添加时间=c.修改时间 then 1 else 0 end)
from 客户统计人员列表 a inner join 客户表 b on a.姓名=b.客户名称
inner join 潜在客户表 c on a.姓名=b.客户名称
puremoon2008 2007-11-28
  • 打赏
  • 举报
回复
在时间上建索引

先把客户统计人员列表与所有客户表关联后再做统计,这样可以先过滤掉BusinessUnitIdName<>@所属的记录

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧