Tengo alrededor de 84 millones de filas. De ellos, todos deben transferirse a una base de datos separada en el mismo servidor, luego elimino para eliminar aproximadamente 60 millones de filas de la base de datos de origen.
Los 84 millones de filas están todos en la misma tabla. Esa tabla sola representa el 90% de toda la base de datos.
Entonces ... Fuente: 84 millones de filas -> 24 millones de filas Destino: 0 filas -> 84 millones de filas
La fuente está ejecutando el modo de recuperación completa, el destino se ejecutará de manera simple.
Me pregunto cuál sería la forma más eficiente de hacer esto.
Plan A:
1) INSERTAR EN EL SELECCIÓN DE Destino * DESDE la fuente
2) fuente TRUNCATE
3) INSERTE EN la fuente SELECCIONE * DESDE el destino DONDE keep_condition = 1
Plan B:
1) Restaurar una copia de seguridad de la base de datos de origen como la base de datos de destino
2) Descarte todas las tablas excepto la necesaria en la base de datos de destino
3) fuente TRUNCATE
4) INSERTE EN la fuente SELECCIONE * DESDE el destino DONDE keep_condition = 1
Plan C:
1) INSERTAR EN EL SELECCIÓN DE Destino * DESDE la fuente
2) BORRAR fuente DONDE keep_condition = 0
¿o algo mas?
Gracias
fuente
Respuestas:
Agregaría que, sin embargo, si decide abordar esto, deberá agrupar estas transacciones . Últimamente he tenido muy buena suerte con el artículo vinculado, y aprecio la forma en que aprovecha los índices en lugar de la mayoría de las soluciones por lotes que veo.
Incluso mínimamente registrado, esas son grandes transacciones , y podría pasar mucho tiempo lidiando con las ramificaciones del crecimiento anormal de registros (VLF, truncamiento, tamaño correcto, etc.).
Gracias
fuente
"Eficiente" podría aplicarse al uso del archivo de registro, el rendimiento de E / S, el tiempo de CPU o el tiempo de ejecución.
Intentaría lograr una operación mínimamente registrada, que sería bastante eficiente desde una perspectiva de registro. Esto debería ahorrarle tiempo de ejecución como un bono. Si tiene el espacio tempdb, lo siguiente podría funcionar para usted.
Para que se produzca una operación mínimamente registrada, deben cumplirse una serie de condiciones, incluidas las copias de seguridad actualmente en ejecución, la base de datos configurada en
BULK_LOGGED
modo de recuperación y, según sus índices, la tabla de destino puede estar vacía. Parte de este comportamiento también cambió (mejoró) de SQL Server 2005 a 2008.Por otra parte, sin conocer los detalles de su tabla y datos, cualquiera de sus otras opciones puede funcionar mejor. Intenta usar
.. y ver cuál funciona mejor.
EDITAR : al realizar operaciones de registro masivo, asegúrese de realizar una copia de seguridad (registro completo o de transacciones) antes y después de la operación si necesita la capacidad de restauración en un momento dado y sospecha que puede estar ocurriendo otra actividad en la base de datos en Al mismo tiempo que su trabajo ETL se está ejecutando.
Escribí una publicación de blog sobre operaciones mínimamente registradas hace un tiempo, hay enlaces allí a otras publicaciones y documentación.
fuente
BULK_LOGGED
modo. ¡Gracias!¿Por qué no BCP?
Abrir símbolo del sistema
bcp server.sourcedb.table out Filename.flt -T -c
bcp "SELECT * FROM sourcedb.table WHERE keep_condition = 1" queryout Filename2.flt -T -c
bcp Server.destinationdb.table in Filename.flt -T -c -b1000
verificar los datos
bcp server.sourcedb.table in Filename2.flt -T -c -b1000
fuente
No piense que debería recomendar cambiar el modelo de recuperación sin una copia de seguridad completa de la base de datos o una copia de seguridad de t-log antes y después . Una de las características del modelo de recuperación BULK_LOGGED es que perderá la capacidad de realizar una recuperación en un punto en el tiempo para los registros t que contienen operaciones de registro masivo. Escenario clásico: copia de seguridad completa nocturna, copias de seguridad t-log por hora. Cambia el modelo de recuperación a registro masivo e inicia su operación. Algo sale mal y la transacción se revierte (o no ha usado uno). Sin embargo, no está seguro de qué más estaba sucediendo en la base de datos, por lo que desea restaurar a un buen punto conocido.
¿Cuándo puedes volver a restaurar? La última copia de seguridad de t-log por hora que no contiene operaciones de registro masivo, lo que podría perder n minutos de transacciones. Una copia de seguridad completa o una copia de seguridad de t-log antes de cambiar el modelo de recuperación creará un punto de reserva. El que elija depende de su RTO.
fuente
Eliminar particiones de una tabla es una forma realmente rápida y eficiente en cuanto a recursos para eliminar grandes cantidades de datos de una tabla. Si esta tabla se particionara de manera que sea compatible con su origen / destino, la respuesta sería restaurar una copia, eliminar las tablas redundantes y las particiones redundantes del destino y eliminar las particiones complementarias del origen.
Sin embargo, el costo de habilitar la partición puede hacer que esta sea una operación más costosa en general.
fuente