top of page
Search
daikingsocaheartse

Forma eficiente de vaciar tablas en ORACLE - Stack Overflow en español[^2^]



Si no queremos eliminar todos los registros, sino solamente algunos, debemos indicar cuál o cuáles; para ello utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la condición que deben cumplir los registros a borrar.




Borrar Millones De Registros En Oracle



Buenas Tardes,Estoy intentando realizar la partición de una tabla con mas de 200 millones de registros, el query que estoy utilizando es el siguiente:SELECTnombre,ciudad,oficina,registroFROM reportes.datacenterWHERE ROWNUM La consulta funciona bien sin embargo, cuando intento hace lo mismo con WHERE ROWNUM > 100000000 se ejecuta pero no me trae ninguna información para poderla extraer en una archivo .txt , me podrían ayudar muchas gracias


Excelente tu idea... pero existe otra solución para el mismo planteamiento? pero con las siguientes variantes: no hay espacio en Disco Duro para crear una copia de la tabla, la cual en mi caso tiene 8Gb y mas de 13 millones de registros, no se puede aumentar el Table Space y tampoco tengo permisos de administrador de BD, pero existe la necesidad de cambiar la data de la mayoria de esos registros.Muchisimas gracias


Hola... me identifico... Patricio Gonzalez desde Chile. Te felicito, me parecen geniales los tips que entregas. Puntualmente este caso (UPDATE de millones de registros) me servia muchisimo, hasta que vi que era valido para cuando uno necesita modificar la tabla completa. Tienes algun otro tip similar a este, es decir, donde se modifiquen millones de registros, pero no la totalidad de los registros de una tabla?Reitero mis felicitaciones por que efectivamente tus sugerencias son bastente buenas.Atentamente, Patricio Gonzalezpatogonz@hotmail.com


Hola q tal Leonardo... aver si me puedes ayudar...quiero insertar 2 millones de registros a una nueva tabla a partir de un query.... probe con el insert obviamente se demora horas de horas...utilice el bulk collect con forall y ahi mejoro el asunto pero igual se demora mucho.. me podrias dar alguna otra sugerencia de antemano agradecidoMiguel LópezGuayaquil - Ecuador


Cuando necesitamos hacer una carga masiva de datos en Oracle, hablamos de millones de registros, sea por una carga inicial de un sistema o una migración desde otro SGBD, el rendimiento en la inserción puede suponer una diferencia de tiempos considerable. Por tanto, en este tipo de proyectos es imprescindible trabajar en la optimización de carga de datos. De ello puede depender el éxito o fracaso del mismo.


Cuando tenemos que insertar millones de registros en una base de datos, la eficiencia de los procesos pueden provocar un incremento exponencial de los tiempos. Una inserción poco eficiente puede llegar a suponer que el proceso sea inviable.


Para dar mantenimiento a una tabla de 50 millones de registros, el mantenimiento consiste en borrar un mes de informacion, 10 millones, segun me dices. Bueno la unica opcion es borrar con el comando DELETE.


Algo que puedes hacer, pero esto solo es beneficioso si la cantidad de registros que se van a quedar en la tabla es menos de los que se van a borrar, es crear una nueva tabla hacer un insert select con los registros que vas a dejar, renombrar la tabla orginal con otro nombre y luego renombrar la nueva tabla al nombre de la original. Luego puedes sacar un backup de la tabla vieja y borrarla del sistema.


Esto tiene desventajas, ej. Al momento de hacer el rename la aplicacion que usa la tabla no puede estar corriendo, solo tiene sentido si la cantidad de registros a borrar es mayor que los que se quedan en la tabla, los procedimientos dependientes se invalidan (hay que recompilarlo), etc


En este caso la tabla de 50 millones de registros no se puede borrar nunca y todos los meses se agregan 10 millones.Yo me refería a realizarle tareas de mantenimiento como por ejemplo reconstruir índices u otras, siempre y cuando sea beneficioso para la tabla y para las consultas a la misma.


Descubre cómo InfStones, un proveedor de infraestructura de cadena de bloques PaaS de nivel empresarial, pudo aprovechar Autonomous JSON Database para crear un servicio de consultas de baja latencia sobre miles de millones de registros de cadena de bloques.


El presente código es un extracto de un código PLSQL que uno de los lectores de este blog me envió por correo electrónico indicándome que presentaba graves problemas de rendimiento, cosa que desde un primer momento a mi no me extrañó, considerando que la tabla tabla_enorme contenía más de 30 millones de registros. Es el típico ejemplo de código PL/SQL que para mejorar su rendimiento necesita que se aplique la técnica o funcionalidad de BULK COLLECT (que traducido directamente a castellano sería similar a decir "recogida a granel" pero que aquí traduciremos por procesamiento masivo).


Es fácil observar que el código PLSQL que utiliza la funcionalidad BULK COLLECT es bastante más complicado y mucho menos intuitivo que el original, pero los resultados a nivel de rendimiento van a ser realmente sorprendentes. Para tablas con 30 millones de registros, utilizar la funcionalidad de procesamiento masivo puede hacer que nuestro código se ejecute entre diez y veinte veces más rápido que sin utilizar dicha funcionalidad (ojo que, a veces, la mejora de rendimiento puede ser incluso hasta superior).


El gestor de base de datos Oracle permite cambiar atributos de las columnas de las tablas sin tener que volver a recrearlas completamente. Sin embargo algunos cambios no están permitidos si las columnas a modificar ya contienen datos. Esta limitación motiva que por lo general cambios de esta naturaleza requieran una planificación previa, sobre todo si la tabla contiene un volumen muy elevado de registros. Un ejemplo típico de esto podría ser el querer cambiar la precisión de una columna de tipo NUMBER(38,2) por NUMBER(38,3) en un tabla que ya almacena varias decenas de millones de registros en un entorno de producción.


Una segunda solución podría consistir en crear una tabla temporal de trabajo con la misma estructura que la original pero con la precisión de la columna afectada ya modificada, y mediante un bloque de código en PL/SQL ir moviendo registros de la tabla original a la temporal. Una vez volcados todos los registros borrar la original y renombrar la temporal como si fuera la original. El principal problema de este método sería que puede llegar a requerir un tiempo largo de ejecución y un gran tamaño en los tablespaces para asegurar el éxito de la ejecución del bloque PL/SQL porque durante un instante se están duplicando efectivamente todos los registros de la tabla original, al menos que se vayan borrando de la original a medida que se mueven en la temporal provocando entonces una indisponibilidad del sistema.


Si lo que se desea es borrar todos los registros de una tabla, lo único que se tiene que hacer es establecer una condición que se cumpla para todos y cada uno de los registros, por lo que la siguiente instrucción podría servir:


Estos dos ejemplos muestran como borrar los mismos datos una con un IN y una subconsulta, esta opción no es recomendada si son muchos dos registros, puede hacer muy pesada la validación, más que todo porque se podrían estar haciendo dos consultas a tablas distintas. La segunda opción es más eficiente que la primera pero siempre se hace una consulta completa a otra tabla, por cada registro se valida la información en otra. Como dijimos arriba si los datos son pocos, es válido, pero si la cantidad de registros son muchos es mejor pasar al siguiente ejemplo.


Qué sucede cuando los datos son millones de registros en la tabla a borrar y debe validar con otra tabla que también podría tener otros miles de registros, el proceso de borrado se podría hacer muy pesado para el motor de la base de datos. Así que de la misma forma en que hacemos consultas complejas de datos, SELECT con INNER JOIN para filtrar datos, esta misma estructura también la podemos utilizar en un DELETE.


A lo largo de mi carrera profesional, cuando una base de datos tenía varios millones de registros consideraba que manejábamos un gran volumen de datos (sin llegar al Big Data). En Otogami llegamos a manejar un histórico de unas decenas de millones de registros y ya se me hacía muy pesado.


Trabajando en Nextail he visto que esos millones de registros eran calderilla, y que el volumen de datos que manejaba era bajo comparado con lo que es capaz de gestionar una base de datos moderna.


Tengo un BD en SQL Server 2005, con un tabla que guarda un historicos de millones de registros (actualmente ocupa unos 17 GB en disco); y resulta que necesito aumentar el tamaño de 2 de sus campos VarChar de 25 a 40 caracteres. Al intentarlo hacer directamente me da el siguiente error:


Otra solución a este problema, y que utilizo muy a menudo, es comprobar siempre cómo van a ser eliminados antes de ejecutar el borrado de muchos registros. Si creamos y ejecutamos el script siguiente cuando necesitamos borrar registros, nos daríamos cuenta de que se iban a eliminar demasiados registros, dado que el SELECT devuelve 49999 registros. Siempre comento la parte del DELETE de la secuencia de comandos para que no sea ejecutado por accidente.


Seguro que en más de una ocasión hemos eliminado registros de una tabla en grandes cantidades, quizás millones. Una vez hecho esto lo esperable sería una reducción del espacio ocupado en el tablespaces, pero esto no es así, las extensiones siguen existiendo pero libres para el uso de la tabla en cuestión, no las puede usar otra tabla.


Una vez eliminados los millones de registros, se ha de compactar la tabla para devolver espacio libre al tablespace, una vez hecho esto incluso podemos reducir el tamaño de los datafiles sin encontrarnos con la limitación impuesta por el HIGH WATER MARK (tamaño máximo alcanzado por los objetos dentro de un datafile). 2ff7e9595c


1 view0 comments

Recent Posts

See All

Comments


bottom of page