Borrar tabla con muchos registros

Tengo que eliminar el contenido de una tabla con más de 2 millones de registros.
Si utilizo la sentencia delete table where talcampo = 0 no finaliza y da error.
¿Alguno sabe de una forma más eficaz para poder realizarlo?

1 respuesta

Respuesta
1
2 millones no es tanto pero dependiendo de la configuración de tu instancia/base de datos y equipo puede que le cueste demasiado.
En tablas mucho más grandes cuando se tiene que hacer un update o delete de muchas filas, se recomienda crear otra tabla en base a la primera haciendo un
Create table t2
AS SELECT * FROM T1 WHERE CAMPO=0.
Tomar los scripts de creación de constraints, triggers e índices de T1 y modificarlos para que se corran para T2, o bien modificar el nombre de las tablas en cuestión T1 como Tback y t2 como T1, eliminando los triggers y constraints de Tback.
Otra solución:
Volviendo al tema del error puede ser que no te quede espacio en el tablespace de Undo, puedes probar redimensionarlo para que permita mantener las filas borradas (dado que uno puede deshacer los cambios una vez que tiró el DELETE, esas filas se mantienen "por si acaso" en el tablespace de UNDO).
Muchas gracias miguel, pero finalmente cree este script, borra correctamente sin finalizar con errores ni tampoco tener que crear otra tabla que creo que afectaría un poco más la performance de la db:
Declare
v_hay_registros NUMBER:=1;
BEGIN
--dBms_OUTPUT.PUT_LINE('1');
WHILE v_hay_registros != 0
LOOP
DELETE FROM tabla
WHERE campo = 0
AND ROWNUM <10000;
v_hay_registros := SQL%ROWCOUNT;
IF v_hay_registros != 0 THEN
COMMIT;
END IF;
--dBms_OUTPUT.PUT_LINE('1');
END LOOP;
COMMIT;
END;
Saludos y gracias!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas