存储过程的测试文章相对来说比较小,这段时间和质深的开发学习了不少有关这方面的测试方法,供大家在工作中参考。
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.不断更新中