Slow Performance y Foreign Keys

Cuando una tabla tiene una foreign key sin índice y se produce un DELETE o UPDATE en la tabla padre, un “shared lock” es requerido en la tabla hija. Aunque este bloqueo es liberado inmediatamente después de obtenerse, podemos apreciar una degradación de rendimiento del sistema en DML concurrentes en tablas padre e hija.

Si la foreign key es indexada no se producirán bloqueos de tabla de ningún tipo en la tabla hija como resultado del INSERT, UPDATE o DELETE.

Por esta razón es importante a la hora de crear una foreign key, ver que uso se le va a dar y si es necesario indexarla para evitar problemas de rendimiento en la aplicación.

Este problema me lo he encontrado en algunas aplicaciones, cuando intentaban realizar un DELETE de una fila, el sistema era más lento de lo habitual. Lo mismo ocurría al intentar realizar un import de la misma tabla.

Después de comprobar que el plan de ejecución del DELETE era correcto, activé la traza para la sesión en concreto que estaba realizando la operación y me di cuenta que estaba realizando un FULL TABLE SCAN de la tabla hija, la cual tenía la foreign key sin indexar.

Tan pronto como desactivé la foreign key o creé un índice para dicha foreign key todo empezó a ir mucho más rápido.

One Comments

  • fitness singles

    16/09/2012

    excellent publish, very informative. I wonder why the other experts of this sector don’t realize this. You must proceed your writing. I’m confident, you have a great readers’ base already!

    Reply

Deja un comentario