T-SQL TryCatch性能粗略測試
2016-01-15 10:04
375 查看
预先建立测试Table, 并初始化数据:
再看待测试的语句, 将其封装成存储过程,使用了交易(transaction), 并使用GOTO语句实现错误时跳转:
使用TRY Catch修改其中部分代码:
最后用下面的语句进行测试:
delete PDCA_FLATFILE_QUEUE_LOG
declare @timeStamp datetime
select @timeStamp=GETDATE()
declare @minFileId int
declare @tmpFileId int
declare @ExecSeqid int
declare @Total int
declare @DupliRunWhileXTimes int
select @minFileId=min(fileid) from PDCA_FLATFILE_QUEUE
select @ExecSeqid=0,@Total=100,@DupliRunWhileXTimes=5
while @ExecSeqid<@Total
begin
select @tmpFileId=@minFileId+@ExecSeqid
if @ExecSeqid%@DupliRunWhileXTimes=0
begin
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
end
else
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
select @ExecSeqid=@ExecSeqid+1
end
print datediff(ms,@timeStamp,GETDATE())
测试结果: 用两种写法测试上面代码的执行时间, 使用GOTO及@ErrorFlag判断的方式, 执行了5200ms左右; 使用Try Catch方式, 执行耗时4500ms左右。 可见, Try Catch方式并未多了系统开销而变慢, 反而因减少了部分判断语句而提高了执行速度。
结论:可以使用Try Catch代替“GOTO及@ErrorFlag判断”, 执行效能不会变差, 而代码会变得更为简洁, 易于维护。
CREATE TABLE [dbo].[PDCA_FLATFILE_QUEUE]( [FileID] [int] IDENTITY(1,1) NOT NULL, [TransID] [int] NOT NULL, [CDT] [datetime] NOT NULL CONSTRAINT [DF_PDCA_FLATFILE_QUEUE_CDT] DEFAULT (getdate()), [UDT] [datetime] NOT NULL CONSTRAINT [DF_PDCA_FLATFILE_QUEUE_UDT] DEFAULT (getdate()), CONSTRAINT [PK_PDCA_FLATFILE_QUEUE] PRIMARY KEY CLUSTERED( [FileID] ASC)) GO CREATE TABLE [dbo].[PDCA_FLATFILE_QUEUE_LOG]( [FileID] [int] NOT NULL, [TransID] [int] NOT NULL, [FileName] [varchar](500) NOT NULL, [QueueCDT] [datetime] NOT NULL, [QueueUDT] [datetime] NOT NULL, [LogCdt] [datetime] NOT NULL ) GO CREATE UNIQUE NONCLUSTERED INDEX [IX_PDCA_FLATFILE_QUEUE_LOG] ON [dbo].[PDCA_FLATFILE_QUEUE_LOG]([FileID] ASC) GO declare @i int select @i=1 while @i<100000 begin insert PDCA_FLATFILE_QUEUE(TransID) values (@i) select @i=@i+1 end
再看待测试的语句, 将其封装成存储过程,使用了交易(transaction), 并使用GOTO语句实现错误时跳转:
CREATE PROCEDURE [dbo].[uspPDCAFlatFile_SavePostLog] ( @FileID int, @FileName varchar(500), @ResponseResult tinyint, --0:Seccuss; 1:NoResponse or TransferFail; 2:FileError @ResponseStatus tinyint, --200/non-200 @ResponseMessage varchar(100)='' --0:need requeue; 1:Seccuss; 2/3/4:requeue after fix error ) AS declare @ErrorFlag int select @ErrorFlag=0 declare @c int begin tran insert PDCA_FLATFILE_QUEUE_LOG select FileID,TransID,@FileName,CDT,UDT,GETDATE() from PDCA_FLATFILE_QUEUE where FileID=@FileID if @@ERROR<>0 begin select @ErrorFlag=1 GOTO EndFlag end --delete PDCA_FLATFILE_QUEUE where FileID=@FileID --if @@ERROR<>0 begin select @ErrorFlag=1 GOTO EndFlag end select @c=10000 while @c>0 begin select @c=@c-1 end if @@ERROR<>0 begin select @ErrorFlag=1 GOTO EndFlag end EndFlag: IF @@ERROR<>0 or @ErrorFlag=1 begin rollback tran select RetCode=1,FileID=@FileID,Msg='PDCAFlatFile_SavePostLog Transaction Error!' end else begin commit tran select RetCode=0,FileID=@FileID,Msg='PDCAFlatFile_SavePostLog seccuss!' end
使用TRY Catch修改其中部分代码:
begin tran begin try insert PDCA_FLATFILE_QUEUE_LOG select FileID,TransID,@FileName,CDT,UDT,GETDATE() from PDCA_FLATFILE_QUEUE where FileID=@FileID --delete PDCA_FLATFILE_QUEUE where FileID=@FileID select @c=10000 while @c>0 begin select @c=@c-1 end commit tran select RetCode=0,FileID=@FileID,Msg='PDCAFlatFile_SavePostLog seccuss!' end try begin catch rollback tran select RetCode=1,FileID=@FileID,Msg='PDCAFlatFile_SavePostLog Transaction Error!' end catch
最后用下面的语句进行测试:
delete PDCA_FLATFILE_QUEUE_LOG
declare @timeStamp datetime
select @timeStamp=GETDATE()
declare @minFileId int
declare @tmpFileId int
declare @ExecSeqid int
declare @Total int
declare @DupliRunWhileXTimes int
select @minFileId=min(fileid) from PDCA_FLATFILE_QUEUE
select @ExecSeqid=0,@Total=100,@DupliRunWhileXTimes=5
while @ExecSeqid<@Total
begin
select @tmpFileId=@minFileId+@ExecSeqid
if @ExecSeqid%@DupliRunWhileXTimes=0
begin
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
end
else
exec uspPDCAFlatFile_SavePostLog_TryCatch @tmpFileId,'CSMC_IFATP_YLD_K93_20120309073355.zip',0,0
select @ExecSeqid=@ExecSeqid+1
end
print datediff(ms,@timeStamp,GETDATE())
测试结果: 用两种写法测试上面代码的执行时间, 使用GOTO及@ErrorFlag判断的方式, 执行了5200ms左右; 使用Try Catch方式, 执行耗时4500ms左右。 可见, Try Catch方式并未多了系统开销而变慢, 反而因减少了部分判断语句而提高了执行速度。
结论:可以使用Try Catch代替“GOTO及@ErrorFlag判断”, 执行效能不会变差, 而代码会变得更为简洁, 易于维护。
相关文章推荐
- SqlServer2012中First_Value函数简单分析
- SqlServer2012中LEAD函数简单分析
- SQLServer2012 查询分析器的快捷键
- sqlserver2012连接数据库是出现5120错误完美解决方案
- SQLserver2012 附加数据库出错之解决办法
- SQL Server2012 Generate Script(MMSQL脚本生成)
- oracle百万级数据分页优化
- sql server 日期 时间 函数整理
- Oracle DB优化
- SQL 查询重复数据并显示重复次数
- oracle查询和编写数据字典
- SQL语句--查询SQLServer表被锁的类型
- SQL语句--在数据库对象名称
- linux系统下创建oracle表空间和用户权限查询
- Mongodb基本命令及使用
- [转]SQLServer2008日志文件无法收缩处理方法
- Oracle内根据上一行总数和本行新增数计算本行总数
- Mac OS X修改mysql配置
- mysql load data infile 指定文件中的字段导入
- MYSQL备份与恢复精华篇