存储过程性能测试之_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
相关文章推荐
- 存储过程测试sql执行时间间隔毫秒级
- 存储过程和T-SQL语句的执行计划重用性比较
- 存储过程和T-SQL语句的执行计划重用性比较
- SQL查询语句执行速度快,存储过程执行慢
- [PL/SQL]测试存储过程执行超长SQL(使用CLOB变量)
- Sql语句与存储过程查询数据的性能测试实现代码
- Oracle 性能测试一:嵌套SQL的查询速度比较分析(初级)
- 用存储过程执行Insert和直接执行Insert的性能比较
- Sql语句与存储过程查询数据的性能测试实现代码
- 用存储过程执行Insert和直接执行Insert的性能比较
- Sql语句与存储过程查询数据的性能测试
- loadrunner测试mysql中某个sql语句或存储过程的性能分享
- 执行存储过程与单独执行存储过程中的SQL查询速度不一致
- Oracle 性能测试一:嵌套SQL的查询速度比较分析(初级)
- 性能测试:动态生成SQL语句 VS 存储过程
- [PL/SQL]测试存储过程执行超长SQL(使用CLOB变量)
- 存储过程被程序和第三方客户端执行很慢,而sql server management studio执行速度正常
- 存储过程中执行动态Sql语句
- MySql带参数的存储过程编写(动态执行SQL语句)
- SQL执行效率和性能测试方法总结