A diferencia del comando insert
, el comando delete
tiene una cláusula que puede utilizar todos los métodos descritos en el Capítulo 2, “El filtro where” para beneficiarse
directamente de la indexación. De hecho, el comando delete
trabaja como un select
seguido por una etapa adicional borrando todos los registros identificados.
La supresión actual de un registro es un proceso similar a insertar un nuevo registro; especialmente la supresión de las referencias dentro de los índices y las actividades para conservar los árboles de los índices equilibrados. La gráfica de rendimiento mostrado en la Figura 8.2 es, por lo tanto, muy similar a la mostrada para insert
.
Figura 8.2 Rendimiento del DELETE por número de índices
En principio, se espera un mejor rendimiento para un delete
sobre una tabla sin ningún índice de lo que lo es para un insert
. Sin embargo, si no existe índice, la base de datos debe leer la tabla entera para encontrar los registros que deben eliminarse. Eso significa que la supresión de registros podría ser más rápido que la búsqueda. Por tal motivo, este caso no se muestra en la Figura 8.2.
Sin embargo, puede tener sentido ejecutar un comando delete
sin índice así como ejecutar un comando select
sin índice; en el caso de que se devuelva una gran parte de la tabla.
Sugerencia
Incluso los comandos delete
y update
tienen un plan de ejecución.
Un comando delete
sin filtro where
es un ejemplo evidente en el cual la base de datos no puede utilizar un índice, si bien es un caso especial que tiene su propio comando SQL: truncate table
. Este comando tiene el mismo efecto que un delete
sin filtro where
, excepto que elimina todos los registros de una sola vez. Es muy rápido pero tiene dos efectos colaterales muy importantes: (1) se hace un
commit implícito
(excepciones: PostgreSQL y SQL Server); (2) no ejecuta ningún trigger.
Si te gusta mi manera de explicar, te encantará mi libro.