您的位置:首页 > 数据库

存储过程性能测试之_Sql执行速度的比较

2015-04-16 15:32 567 查看


前言

大数据量处理的存储过程执行时间非常长的时候,我们需要考虑对整个存储过程的sql脚本进行一次性能评估测试,主要是对处理大数据量的sql语句进行性能评估。有时候主观的对一个语句的性能评估需要熟悉sql语句的处理逻辑,也就需要对sql的深入了解和认识。一般情况下,测试人只熟悉简单的sql,那么对sql的性能评估也就无法从主观上去考虑,而且主观上的判断有时候还不一定正确。

针对主观无法评估sql的性能上,那我们就写一个比较简单的测试sql去测试处理速度,检查处理时间,在一定的程度上反馈相关sql的处理速度,尽可能让开发在相关处理语句上进行性能优化。


问题:

需求:从铃音平台(源数据A)同步100万的铃音资源到短搜系统(目标数据库B)中,数据库B中已经存在铃音资源,只是从在同步的铃音资源中更新铃音资源。在同步资源中,更新铃音资源步骤中,开发的做法是:

1、 将同步回来的铃音资源放在临时表1(#RingResource2)

2、 写查语句,从临时表(#RingResource2)筛选出短搜现有的铃音表(Resource_Ring)不存在的铃音。

3、 将筛选出来的铃音插入到短搜铃音表中(Resource_Ring)

步骤2中查询短搜现有的铃音表(Resource_Ring)不存在的铃音涉及到的数据非常大,Resource_Ring有26万的数据,#RingResource2有100万的数据。

针对这种查询,我比较两种写法(比较not in和not exists的查询速度),其中#RingResource存放的是短搜现有的铃音表(Resource_Ring)的数据

(1) SELECT * FROM #RingResource WHERE RingNo NOT IN (SELECT RingNo FROM #RingResource2)

(2) SELECT * FROM #RingResource WHERE NOT EXISTS (SELECT RingNo FROM #RingResource2 where #RingResource2.RingNo=#RingResource.RingNo)


测试方法:

针对这两个sql语句,我无法从主观上判断执行速度,那我写个sql脚本进行比较。写一个存储过程,把sql语句作为输入参数,检查时间。

步骤1:存储过程sql脚本

--- Author:whhuang ---

--- 测试sql语句执行时间---

--存储过程

create proc SQL_CMP_TIME

(

@sql1 nvarchar(4000), --sql1语句

@sql2 nvarchar(4000), --sql2语句

@t int—sql执行次数

)

as

---定义变量

declare @start_times1 datetime,@end_times2 datetime,@start_times3 datetime,@end_times4 datetime,@i int,@ms1 bigint,@ms2 bigint;

set @ms1=0;

set @ms2=0;

set @i=0;

while @i<@t

begin

--获取执行一次sql1的开始时间、结束时间

set @start_times1=getdate()

exec sp_executesql @sql1

set @end_times2=getdate()

--获取执行一次sql2开始时间、结束时间

set @start_times3=getdate()

exec sp_executesql @sql2

set @end_times4=getdate()

--计算执行时间

set @ms1=@ms1+datediff(ms,@start_times1,@end_times2)

set @ms2=@ms2+datediff(ms,@start_times3,@end_times4)

set @i=@i+1

end

--查询出sql执行时间

select AVG1=@ms1*1.000000/@t,AVG2=@ms2*1.000000/@t,TIMES=@t,DT1=@ms1,DT2=@ms2

步骤2:初始化数据

---执行存储过程语句

---导入数据

---1、新建临时表1(存放短搜现有的铃音表(Resource_Ring)数据)

drop table #RingResource--如果存在,就删除临时表

Create Table #RingResource

(

RingNo VARCHAR(32),

RingName VARCHAR(128),

Supplier VARCHAR(64),

RingAuthor VARCHAR(64),

RingPrice VARCHAR(8),

RingOrderNum VARCHAR(8),

ExpireDate VARCHAR(32)

)

---2、新建临时表2(用来存放同步回来的txt文件中的铃音资源数据)

drop table #RingResource2--如果存在,就删除临时表

Create Table #RingResource2

(

RingNo VARCHAR(32),

RingName VARCHAR(128),

Supplier VARCHAR(64),

RingAuthor VARCHAR(64),

RingPrice VARCHAR(8),

RingOrderNum VARCHAR(8),

ExpireDate VARCHAR(32)

)

---3、短搜现有的铃音表数据(从短搜现有的铃音表(Resource_Ring)把数据插入到临时表#RingResource)

insert into #RingResource

select RingNo,RingName,Supplier,RingAuthor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: