您的位置:首页 > 数据库

T-SQL TryCatch性能粗略測試

2016-01-15 10:04 375 查看
预先建立测试Table, 并初始化数据:

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