Jer*_*emy 9 sql-server try-catch
有没有人发现在sql server 2008中使用BEGIN TRY..END TRY的性能提升/转移,与旧的IF @@ ERROR <> 0相比?只是好奇知道是否存在性能损失.
这是一个老问题,但在 2012 年,Aaron Bertrand 写了一篇详细的文章不同错误处理技术的性能影响,其中他比较了 SQL Server 中处理异常的几种方法,我认为这里值得一提。
他说,人们处理异常的主要方法是:
- 只需让引擎处理它,并将任何异常返回给调用者即可。
- 使用
BEGIN TRANSACTION和ROLLBACKif@@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)