T-SQL TryCatch性能粗略測試

预先建立测试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判断”, 执行效能不会变差, 而代码会变得更为简洁, 易于维护。

猜你喜欢

转载自blog.csdn.net/cdwolfling/article/details/50521762