Ver Mensaje Individual
  #3 (permalink)  
Antiguo 23/02/2010, 10:34
Alextroy
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Borrado masivo

Efectivamente. Ya habia valorado ese método pero me parecia demasiado engorroso y arriesgado.

La tabla en producción, podria tener 20 0 30 millones de registros, de los que a lo mejor necesitaria eliminar 2 o 3. No puedo saberlo con exactitud pero los números deben andar por ahí...

Estoy pensando en hacer un bucle que elimine los registros uno por uno y ejecute un commit cada 100000 registros, por ejemplo. Pero tengo algunas dudas:

Se que no puedo usar un cursor porque necesita un snapshot de toda la tabla. Asíque estoy pensando en meter todos los ID en una tabla temporal o un array, para ir recorriendolos y ejecutando el delete de la otra tabla tomando este valor ID como referencia. ¿como funcionaria un array con millones de registros? ¿ocuparian toda la memoria?

La otra opción es usar una tabla, temporal o no. La mecánica del script seria algo parecido a esto:


-- tendria una tabla t_temp con todos los Id.

SELECT COUNT(*) INTO REGISTROS FROM tabla_t;

LOOP
EXIT WHEN CONTADOR =0;
DELETE FROM tabla1 WHERE id IN
(SELECT id_tabla1 FROM t_temp WHERE rowcount < 100000);

IF REGISTROS >= 100000 THEN
COMMIT;
REGISTROS := 0;
END IF;

FROM t_temp WHERE ROWCOUNT < 100000';
SELECT COUNT(*) INTO CONTADOR FROM t_temp;

END LOOP;


Aunque claro, aún tengo que conseguir que funcione. De entrada me está dando problemas con el rowcount.

Última edición por Alextroy; 23/02/2010 a las 10:51