sql >> Base de Datos >  >> RDS >> Oracle

Restricción ÚNICA vs verificación antes de INSERTAR

Creo que, en la mayoría de los casos, las diferencias entre esos dos serán lo suficientemente pequeñas como para que la elección se deba principalmente a elegir la implementación que termine siendo más comprensible para alguien que mira el código por primera vez.

Sin embargo, creo que el manejo de excepciones tiene algunas pequeñas ventajas:

  • El manejo de excepciones evita una posible condición de carrera. El método 'verificar, luego insertar' puede fallar si otro proceso inserta un registro entre su verificación y su inserción. Entonces, incluso si está haciendo 'comprobar y luego insertar', aún desea el manejo de excepciones en la inserción y si ya está haciendo el manejo de excepciones de todos modos, entonces podría eliminar la verificación inicial.

  • Si su código no es un procedimiento almacenado y tiene que interactuar con la base de datos a través de la red (es decir, la aplicación y la base de datos no están en el mismo cuadro), entonces desea evitar tener dos llamadas de red separadas (una para el cheque y la otra). otro para la inserción) y hacerlo a través del manejo de excepciones proporciona una forma sencilla de manejar todo con una sola llamada de red. Ahora, hay muchas maneras de hacer el método 'comprobar y luego insertar' mientras se evita la segunda llamada de red, pero es probable que la forma más sencilla de hacerlo sea simplemente capturar la excepción.

Por otro lado, el manejo de excepciones requiere una restricción única (que en realidad es un índice único), que viene con una compensación de rendimiento:

  • La creación de una restricción única será lenta en tablas muy grandes y provocará un impacto en el rendimiento en cada inserción en esa tabla. En bases de datos realmente grandes, también debe presupuestar el espacio de disco adicional consumido por el índice único utilizado para hacer cumplir la restricción.
  • Por otro lado, podría hacer que la selección de la tabla sea más rápida si sus consultas pueden aprovechar ese índice.

También me gustaría señalar que si se encuentra en una situación en la que lo que realmente desea hacer es 'actualizar otra inserción' (es decir, si ya existe un registro con el valor único, entonces desea actualizar ese registro; de lo contrario, inserte un nuevo record), entonces lo que realmente quiere usar es el método UPSERT de su base de datos en particular, si tiene uno. Para SQL Server y Oracle, esto sería una instrucción MERGE.