Tengo una base de datos donde cargo archivos en una tabla de etapas, de esta tabla de etapas tengo 1-2 uniones para resolver algunas claves externas y luego inserto estas filas en la tabla final (que tiene una partición por mes). Tengo alrededor de 3.400 millones de filas para tres meses de datos.
¿Cuál es la forma más rápida de obtener estas filas de la puesta en escena en la mesa final? ¿Tarea de flujo de datos SSIS (que usa una vista como fuente y tiene una carga rápida activa) o un comando Insert INTO SELECT ....? Probé la tarea de flujo de datos y puedo obtener alrededor de mil millones de filas en aproximadamente 5 horas (8 núcleos / 192 GB de RAM en el servidor), lo cual me parece muy lento.
Respuestas:
Un enfoque común:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
n
filas, lo que puede reducir la tensión en el registro de transacciones, y por supuesto significa que si algún lote falla, solo tiene que comenzar desde ese lote. Escribí un blog sobre esto (mientras que en referencia a las eliminaciones, se aplican los mismos conceptos básicos) aquí: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletesSi sus particiones son físicas y no solo lógicas, puede ganar algo de tiempo haciendo que diferentes procesos llenen diferentes particiones simultáneamente (por supuesto, esto significa que no puede usar
TABLOCK
/TABLOCKX
). Esto supone que la fuente también es adecuada para múltiples procesos de selección sin superposición / bloqueo, etc., y que hace que ese lado de la operación sea aún más lento (sugerencia: cree un índice agrupado en la fuente que se adapte al esquema de partición en el destino).También puede considerar algo mucho más primitivo, como
BCP OUT
/BCP IN
.No sé si saltaría a SSIS para ayudar con esto. Probablemente haya algunas eficiencias allí, pero no sé si el esfuerzo justifica los ahorros.
fuente
Mirando su problema desde una perspectiva de SSIS, creo que la razón por la que esto puede haber tardado tanto es porque no tenía lotes. Esto puede conducir a demasiadas filas que llenan la tubería de SSIS y, como resultado, puede obstaculizar el rendimiento de SSIS. Lo que debe hacer es modificar sus filas por configuración de lote y posiblemente su tamaño máximo de confirmación de inserción. Ahora, ¿qué configura esto también dependerá de la cantidad de memoria disponible para su servidor SSIS? ¿Cuál es la velocidad del disco de su instancia de SQL Server? La mejor manera de hacer esto es probar. Permite, por ejemplo, usar 10,000. Esto enviará un lote al servidor 10,000 a la vez, lo que evitará que su tubería se llene en exceso y ayudará a ejecutar este proceso más rápido. Esta configuración se establece en su destino OLEDB.
Si es un problema, también puede agregar una tarea de ejecución de SQL antes y después para hacer lo que @AaronBertrand sugiere y eliminar / volver a agregar cualquier índice o restricción a la tabla.
fuente