• Permite encontrar mejoras sencillas para la sustitución de borrados masivos de registros en tablas.
• El objetivo de esta detección es disminuir el consumo y reducir la duración de los procesos afectados.
Detección
En Oracle existen dos tipos de comandos capaces de llevar a cabo el borrado de las filas contenidas en una tabla, DELETE y TRUNCATE. Estos dos comandos están pensados para situaciones distintas, en el caso de DELETE se utiliza para realizar borrados de una parte de los datos de la tabla, mientras que la utilidad TRUNCATE se utiliza para un borrado completo de la misma. A pesar de ser distintos, ya que DELETE es considerado un comando de gestión de datos y el TRUNCATE un comando de definición de datos, el primero es capaz de obtener los mismos resultados que TRUNCATE si no se le aplican filtros durante la ejecución, aunque de una forma mucho menos óptima.
El uso de la cláusula DELETE para realizar el vaciado total de una tabla, puede suponer un problema de rendimiento, ya que se realizan una serie de pasos intermedios que implican un consumo de recursos sobre la instancia de BBDD. Estos pasos incluyen el escaneo completo de la tabla, la búsqueda de los bloques que alojan las filas, el reajuste de los índices de la tabla y la generación de redo para poder deshacer el borrado en caso de fallo de la transacción, entre otros. Todos estos pasos, incrementan notablemente el tiempo necesario y el consumo de recursos para realizar el vaciado de una tabla
Para aquellos casos en los que se quiere realizar un borrado total de la tabla, es mucho mejor usar la cláusula TRUNCATE, ya que esta realiza un cambio de la marca de agua de la tabla para dejarla a cero y marca el espacio utilizado de la tabla como vacío. De este modo, se puede realizar un borrado completo de una tabla en menor tiempo y con menor consumo de recursos, optimizando la forma en la que llevar a cabo el mismo objetivo. Cabe destacar que este borrado es definitivo y los datos almacenados no se podrán recuperar ni mediante rollback o flashback.
Comparativa y Resultados
Siguiendo la guía de buenas prácticas integrada dentro de nuestra metodología, hemos aplicado en nuestros clientes la utilidad de este caso concreto, y para una tabla de más de 7 millones de filas, dónde se borraba cada registro de uno en uno, hemos conseguido reducir un 99% el tiempo de ejecución (Elapsed) y más de un 95% el consumo de CPU aplicando la utilidad TRUNCATE en lugar de DELETE:
En conclusión, si tenemos la necesidad de vaciar una tabla de la que sabemos que sus datos no son necesarios, aplicar el comando TRUNCATE para el borrado es mucho más eficiente, ya que de esta forma no consumiremos recursos extra y el tiempo de ejecución será notablemente menor.