Ver Mensaje Individual
  #6 (permalink)  
Antiguo 22/11/2011, 18:43
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Truncate table o Delete

Además de los posts correctos de jc3000, se puede agregar:

1. Truncate vs. Delete

El truncate es más rápido, libera el espacio de la tabla y los índices, pero solo sirve para borrar todas las filas, es decir, no tiene condición where, no se puede usar cuando la tabla está referenciada por una FK y al ser una sentencia DDL, no se puede hacer un rollback para deshacer la operación.

El delete es más lento, no libera el espacio de la tabla y por cada fila que se borra se ejecuta una tarea de mantenimiento sobre los índices, es más útil para eliminar datos parciales, además valida la integridad referencial y permite hacer rollback para deshacer la operación.

2. Rebuild de indices

Reconstruye el índice, sirve para desfragmentar el espacio utilizado (problema que se da cuando la tabla tiene muchas operaciones de insert/delete) o para mover el índice a otro tablespace, el mito de que un rebuild favorece el rendimiento de las consultas ya fue descartado.

3. Estadísticas

Es la información sobre el contenido y espacio de tablas e índices (cantidad de filas, valores nulos, etc), se almacenan en el diccionario del sistema y las utiliza el optimizador en cada consulta SQL para generar el plan de ejecución. Se deben actualizar en función de los datos, no del tiempo, es decir, cuanto mayor sea el volumen de datos modificados (como tu ejemplo de replicar) o la cantidad de operaciones insert/delete/update, mayor frecuencia de actualización. Para más info, puedes buscar por el paquete dbms_stats.

En tu caso particular, es más viable el truncate, además puedes optimizar el proceso y evitar los rebuild innecesarios con los pasos:

1. truncate table B.tabla1
2. drop de todos los índices de la tabla B.tabla1 (la carga de datos es más rápida cuando no hay índices)
3. insert into B.tabla1 select * from A.tabla1 (si el servidor tiene varios procesadores, te puedes beneficiar con el hint parallel)
3. create de todos los índices de la tabla B.tabla1 (esta operación tarda lo mismo que un rebuild)
4. dbms_stats.gather_table_stats('B','TABLA1') (comando para actualizar las estadísticas de la tabla y sus índices)

Saludos