SQLServer try catch performance


9

¿Alguien ha encontrado alguna mejora en el rendimiento/tradoff del uso de BEGIN TRY..END TRY en el servidor sql 2008, frente al antiguo IF @@ ERROR <> 0? Solo curiosidad por saber si hay sanciones de rendimiento o no.

2

Ésta es una cuestión de edad, pero en 2012 Aaron Bertrand escribió un artículo detallado Performance impact of different error handling techniques donde se comparó algunos enfoques para tratar las excepciones en SQL Server y pensé que es vale la pena mencionarlo aquí.

Dice que la primaria se aproxima a la gente usa para tratar con excepciones son:

  • simplemente dejar que el motor de manejarlo, y la burbuja ninguna excepción al llamador.
  • Utilice BEGIN TRANSACTION y ROLLBACK si @@ERROR <> 0.
  • Utilice TRY/CATCH con ROLLBACK en el bloque CATCH (SQL Server 2005+).

Y muchos toman el enfoque que se debe comprobar si van a incurrir en la violación en primer lugar, ya que parece más limpio para manejar la duplican a sí mismo que para forzar el motor para hacerlo.

Sus conclusiones son:

si pensamos que vamos a tener una alta tasa de fracaso, o no tienen idea lo que será nuestra tasa de falla potencial, a continuación, comprobando primero en evitar violaciónes en el motor va a valer muchísimo nuestro mientras. Incluso en el caso en que tenemos una inserción exitosa cada vez, el costo de la verificación primero es marginal y se justifica fácilmente por el costo potencial de los errores de manejo más adelante (a menos que su tasa de falla prevista sea exactamente 0%).

Este es el gráfico del artículo:

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` 
  0

Hola. No estoy seguro de cuál es tu punto principal. Si está sugiriendo que además de TRY ... CATCH las personas también hagan primero los controles, entonces eso es irrelevante en lo que respecta a todos los escenarios posibles, y debería ser obvio, al menos para los profesionales de DB, que hacer una lectura simple es menos trabajo que escribir en el registro y luego tener que hacer más trabajo para administrar el ROLLBACK. Si dices que solo haces el cheque y no usas TRY ... CATCH, entonces es un malentendido peligroso de una prueba que no explica por qué usamos el manejo de excepciones en primer lugar. 14 feb. 162016-02-14 20:35:54

  0

@srutzky, ese artículo compara varias variantes, no solo las preguntadas en esta pregunta. Puede ver en el rendimiento del gráfico de 'TRY ... CATCH' vs' IF @@ ERROR <> 0'. En caso de muchos retrocesos, 'TRY ... CATCH' es mucho mejor, no peor de lo que creías. 14 feb. 162016-02-14 22:20:51

  0

Ese artículo es casi inútil. Realmente solo contrarresta el absurdo escenario de no hacer una validación previa. Por lo tanto, ignore las pruebas "Just *". ¿Cuántas operaciones son una sola acción de fila? ¿Quién permitiría que ocurra el error en los enfoques basados ​​en conjuntos, cuando la reversión puede tomar minutos? Y la prueba no cubre el uso real de 'TRY ... CATCH' colocando el' IF EXISTS' dentro de él. El escenario "All Fail" es interesante de notar, pero poco práctico porque nunca sucederá, y omite las 3 opciones, por lo que no las está comparando. Eso muestra que 'TRY ... CATCH' está en 3er lugar en las 6 pruebas que se relacionan aquí. 15 feb. 162016-02-15 17:44:00

  0

Y entrando el último (incluso más si se prueba el escenario más probable de colocar el 'IF EXISTS' dentro del' TRY ...CATCH') está bien porque la validación previa no es la razón principal para realizar el manejo de errores, que es el problema con ese artículo. Utilizamos el manejo de errores porque no podemos pre validar todos los errores posibles. Puede haber errores de permisos, interbloqueos, etc. Usamos TRY ... CATCH porque es la mejor forma de controlar el proceso cuando ocurren errores impredecibles, especialmente en escenarios anidados. Por favor, mira mi respuesta aquí para ver lo que quiero decir: http://dba.stackexchange.com/a/93265/30859 15 feb. 162016-02-15 17:54:08


3

Desde SQL 2005, debe intentar usar la forma TRY CATCH para manejar las excepciones o registrar los errores. Se considera como la mejor práctica. No debería haber ningún golpe de rendimiento importante al usarlo.

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

Se preguntó sobre el rendimiento relativo ... 22 feb. 092009-02-22 08:26:47


4

Dado que los problemas de acceso al disco de la base de datos son idénticos, no debería haber problemas apreciables de rendimiento.

  0

El rendimiento de 'TRY ... CATCH' y' SI @@ ERROR <> 0' es algo diferente. Pero, lo que es más importante, existe una diferencia significativa si intenta evitar el error en primer lugar. Aaron Bertrand lo ha mostrado en un artículo detallado [Impacto del rendimiento de diferentes técnicas de manejo de errores] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Puse la respuesta debajo del resumen de sus hallazgos. 13 feb. 162016-02-13 00:05:17


1

Olvida el rendimiento, es muchísimo más seguro, mejor y más predecible.

Sin embargo, utilizar @@ ERROR generalmente requiere un GOTO y/o muchas declaraciones IF para gestionarlo correctamente, así que supongo que puede haber un pequeño impulso en TRY..CATCH.

+1

De acuerdo. El rendimiento no es la principal preocupación, dado que el concepto T-SQL 'TRY' /' CATCH' supera las pruebas de '@@ ERROR' después de cada instrucción. Si bien hay un pequeño golpe de rendimiento por usar 'TRY' /' CATCH', es un precio aceptable a pagar dados los otros beneficios. 05 oct. 152015-10-05 15:34:44

  0

@srutzky, aun así, si está buscando el rendimiento, tenga en cuenta que el rendimiento de 'TRY ... CATCH' y' IF @@ ERROR <> 0' es algo diferente. Pero, lo que es más importante, existe una diferencia significativa si intenta evitar el error en primer lugar. Aaron Bertrand lo ha mostrado en un artículo detallado [Impacto del rendimiento de diferentes técnicas de manejo de errores] (http://sqlperformance.com/2012/08/t-sql-queries/error-handling). Puse la respuesta debajo del resumen de sus hallazgos. 13 feb. 162016-02-13 00:06:22

  0

@VladimirBaranov Ese artículo no es relevante para esta pregunta. Por supuesto, hay ahorros significativos para evitar la necesidad de retroceder. Eso es asumido y no debería ser necesario establecerlo. Pero aún necesita manejo de errores, y 'TRY ... CATCH' es mucho mejor que probar' @@ ERROR <> 0', incluso si 'TRY ... CATCH' es un poco más lento. 14 feb. 162016-02-14 20:45:18


0

El rendimiento de TRY ... CATCH es más probable un poco más cuando no hay errores. Por otro lado, será más rápido en muchos casos donde hay un error.

Pero, no debe codificar estrictamente para el rendimiento de todos modos. Y, la sobrecarga, si la hay, va a ser bastante pequeña, así que no cambiaría la sintaxis segura por el rendimiento en esta instancia.

Además, Try ... Catch hace que el código sea un poco más fácil de mantener, especialmente si su equipo de desarrollo de SQL no ha estado en SQL Server por mucho tiempo, lo que desafortunadamente sucede con demasiada frecuencia. Me imagino que esto será más el caso dentro de unos años.


-3
  0

Preguntó específicamente sobre SQL Server; Los artículos de C# no son relevantes aquí. 21 nov. 132013-11-21 04:36:10