1.教会你爱的人爱你。 2.创造财富,享受生活,享受人生。 3.知识只有经过分享才能体现价值。 4.做最好的自己!

跟着质深开发学存储过程的测试

上一篇 / 下一篇  2010-05-28 12:30:01

存储过程测试文章相对来说比较小,这段时间和质深的开发学习了不少有关这方面的测试方法,供大家在工作中参考。

1.月份值的获取

一般存储过程的在报表系统应用比较多,而报表生成基本是按月和年来区分。

也就是说对于报表的存储过程用到日期值的可能性相当大,而如何提高用日期值去获取对应表中的数据?这个涉及到存储过程中日期值的获取方法问题:

刚开始时很多开发会先考虑生成一张日期表,然后根据日期表中的月份去和其它表关联来取值。如以下SQL语句:

declare @temp table (month char(6) not null)
insert into @temp
select distinct substring(convert(char(8),CallTime,112),1,6) as month
from A where CallTime>=@BeginDate and CallTime<@EndDate

如果数据量比较小,这种方法还是非常可行的,但如果数据量达到几千万上亿时,以上方法往往会导致Time out。

优化后的日期值获取方法为:

declare @temp table(YearMonth char(6) not null)
declare @tMonth datetime
set @tMonth=@BeginDate
while(substring(convert(char(8),@tMonth,112),1,6)<=substring(convert(char(8),@EndDate,112),1,6))

insert into @temp(YearMonth)values(substring(convert(char(8),@tMonth,112),1,6))
select @tMonth=DATEADD(mm,1,@tMonth)

通过在SQL2008可以查看出第二种方法的执行时间远远快于第一种。

2.两个字符串联接需增加非空的判断

这是一个特殊的报表,报表中有些字段需要写明在不同渠道显示的数据。

一般的方法是两个字符串直接拼接,然后中间加特殊符号以示区别。

事实上正是因为这个特殊符号,如果有一个字符串为空,就会导致整个拼接的结果为空。

RT+'/'+RTPmsCode

这种测试方法如果在墨盒测试中考虑前后者为空时,就可以判断出。

isnull(RT,'')+'/'+isnull(RTPmsCode,'')

3.优化查询语句

呼叫中心的数据报表,同样的几千万条数据,优化前执行4分26秒(基本无法生成报表),优化后执行只需2秒钟。

更改的方法是先检测出需要的数据然后去关联主表。

优化前

select al.month,al.Ad as Ad,al.TN,
isnull(p.Ab,0) as Ab,isnull(p.ans,0) as ans
from @allCode al left join 

(select substring(convert(char(8),CallTime,112),1,6) as month,
RTRIM(Substring(Dn,1,2)) as Ad,PN as TN,
sum(
Case when Number = '1497' AND Duration>10 then 1 
......
else 0 end) as Ab,
sum(case when Number = '1497' then 0
......
else 1 end) as ans
from Call a, vdn b
where ....(省略一些搜索条件)
and CallTime>=@BeginDate and CallTime<@EndDate
group by substring(convert(char(8),CallTime,112),1,6),RTRIM(Substring(Dn,1,2)),b.PN

) p
on al.month=p.month and al.ad=p.ad and al.TN=p.TN
order by al.month asc,al.ad,al.TN

优化后SQL

declare @p table(month char(6) not null,Ad varchar(2) null,TN varchar(15) null,Ab int null,ans int null)
insert into @p
select substring(convert(char(8),CallTime,112),1,6) as month,
RTRIM(Substring(Dn,1,2)) as Ad,PN as TN,
sum(
Case when Number = '1497' AND Duration>10 then 1 
......
else 0 end) as Ab,
sum(case when Number = '1497' then 0
......
else 1 end) as ans
from Call a, vdn b
where ....(省略一些搜索条件)
and CallTime>=@BeginDate and CallTime<@EndDate
group by substring(convert(char(8),CallTime,112),1,6),RTRIM(Substring(Dn,1,2)),b.PN

select al.month,al.Ad as Ad,al.TN,
isnull(p.Ab,0) as Ab,isnull(p.ans,0) as ans
from @allCode al left join @p p
on al.month=p.month and al.ad=p.ad and al.TN=p.TN
order by al.month asc,al.ad,al.TN

4.不断更新中


TAG: 优化 报表 测试 存储过程

 

评分:0

我来说两句

Open Toolbar