SQLServer尝试捕获性能

时间:2009-02-22 08:16:39

标签: sql-server try-catch

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

6 个答案:

答案 0 :(得分:4)

由于数据库磁盘命中问题相同,因此不存在明显的性能问题。

答案 1 :(得分:3)

从SQL 2005开始,您应该尝试使用TRY CATCH方式来处理异常或记录错误。它被认为是最佳实践。使用它不应该有重大的性能损失。

BEGIN TRY
    BEGIN TRANSACTION
    -- SQL 
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    ROLLBACK
    SELECT
        ERROR_MESSAGE(),
        ERROR_NUMBER() -- etc
END CATCH

答案 2 :(得分:2)

这是一个老问题,但是在2012年,Aaron Bertrand撰写了一篇详细的文章Performance impact of different error handling techniques,在那里他比较了几种处理SQL Server异常的方法,我认为值得一提。

他说,人们用来处理例外的主要方法是:

  
      
  • 让引擎处理它,并将任何异常冒回给调用者。
  •   
  • 如果BEGIN TRANSACTION使用ROLLBACK@@ERROR <> 0
  •   
  • TRY/CATCH块中使用ROLLBACK CATCH(SQL Server 2005 +)。
  •   
     

许多人采取的方法是他们应该检查他们是否会去   首先发生违规行为,因为它似乎更清洁   重复自己而不是强迫引擎这样做。

他的结论是:

  

如果我们认为我们的失败率很高,或者没有失败率   了解我们潜在的失败率,然后先检查   避免引擎违规将是非常值得我们的   而。即使在我们每次成功插入的情况下,   首先检查的成本是微不足道的,并且很容易证明是合理的   以后处理错误的潜在成本(除非您的预期   失败率恰好是0%)。

这是文章中的图表:

summary

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`

答案 3 :(得分:1)

忘记表现,这是一个更安全,更好,更可预测的视线。

然而,使用@@ ERROR通常需要GOTO和/或许多IF语句来正确管理它,所以我猜测TRY..CATCH可能会有一点点提升。

答案 4 :(得分:0)

当没有错误时,TRY ... CATCH的性能很可能会更多。另一方面,在出现错误的许多情况下,它会更快。

但是,不管怎样,你都不应该严格地对性能进行编码。并且,开销(如果有的话)将会相当小,所以在这种情况下,我不会用更安全的语法来换取性能。

此外,Try ... Catch使代码更容易维护,特别是如果你的SQL开发团队已经很长时间没有SQL Server,不幸的是,这种情况经常发生。我想,从现在起几年后情况会更多。

答案 5 :(得分:-3)