关于事物与性能的测试
在网上找了很多关于sql优化的方法,在一个存储过程中修改大量数据库数据时(比如需要很多insert,update,delete语句)使用事物就是一种优化,但是网上得来总觉浅,觉知此事要实践,于是我就自己做了一个关于事物的测试:
这是sql代码
--如果不存在就创建数据库 if not exists(select 1 from sys.databases where name='dbtest') begin create database dbtest end go --创建完之后就切换数据库(中间用go定义批量) use dbtest go --创建测试表 if not exists (select top 1 1 from sys.tables where name='test_trantest') begin create table test_trantest ( id int primary key identity(1,1), t1 varchar(100), t2 varchar(100), t3 varchar(100), t4 varchar(100) ) end go --测试开始之添加测试 --不开事物 declare @i int , @j datetime , @k int select @i=0,@j=0,@k=0,@j=GETDATE() --插入数据 while(@i<10000) begin insert into test_trantest values('测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20))) set @i=@i+1 end select '不开事物添加10000条数据耗时:'+cast(DATEDIFF(MS,@j,GETDATE()) as varchar(100))+' 毫秒' go --开事物 declare @i int , @j datetime , @k int select @i=0,@j=GETDATE() begin tran --插入数据 while(@i<10000) begin insert into test_trantest values('测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20)),'测试数据'+CAST(@i as varchar(20))) set @i=@i+1 end commit tran select '开事物添加10000条数据耗时:'+cast(DATEDIFF(MS,@j,GETDATE()) as varchar(100))+' 毫秒' go
结果如下:
可以看到使用事物修改大量数据要比不适用事物快很多,那么为什么呢?
原来是每执行一个sql语句都会自动开启和提交事物,而当执行的语句过多就会频繁的开启关闭事物,于是造成了不必要的重复操作,也就降低了效率。所以遇到上述情况可以手动开启和处理事物已达到优化的效果。
结果:在多sql语句时手动处理事物比不处理快。