SQLServer尝试捕获性能

Jer*_*emy 9 sql-server try-catch

有没有人发现在sql server 2008中使用BEGIN TRY..END TRY的性能提升/转移,与旧的IF @@ ERROR <> 0相比?只是好奇知道是否存在性能损失.

Vla*_*nov 3

这是一个老问题,但在 2012 年,Aaron Bertrand 写了一篇详细的文章不同错误处理技术的性能影响,其中他比较了 SQL Server 中处理异常的几种方法,我认为这里值得一提。

他说,人们处理异常的主要方法是:

  • 只需让引擎处理它,并将任何异常返回给调用者即可。
  • 使用BEGIN TRANSACTIONROLLBACKif @@ERROR <> 0
  • 在块中使用TRY/CATCHwith (SQL Server 2005+)。ROLLBACKCATCH

许多人采取的方法是,他们应该首先检查是否会发生违规,因为自己处理重复项似乎比强迫引擎这样做更干净。

他的结论是:

如果我们认为故障率会很高,或者不知道潜在的故障率是多少,那么首先检查以避免引擎中的违规行为将是非常值得的。即使我们每次都成功插入,首先检查的成本也是微乎其微的,并且很容易通过稍后处理错误的潜在成本来证明其合理性(除非您的预期故障率恰好为 0%)。

这是文章中的图表:

概括

CheckInsert    |  Checks `IF EXISTS` first  |  Simple `INSERT`
CheckRollback  |  Checks `IF EXISTS` first  |  Use `IF @@ERROR <> 0`
CheckTryCatch  |  Checks `IF EXISTS` first  |  Use `TRY CATCH`
JustInsert     |                            |  Simple `INSERT`
JustRollback   |                            |  Use `IF @@ERROR <> 0`
JustTryCatch   |                            |  Use `TRY CATCH`
Run Code Online (Sandbox Code Playgroud)