Diseñar los paquetes SSIS para el paralelismo (vídeo de SQL Server)
Se aplica a:: Microsoft SQL Server Integration Services |
Autores: Matt Carroll, Microsoft Corporation |
Duración: 00:12:37 Tamaño: 29,2 MB Tipo: archivo WMV |
|
|
Resumen del vídeo
En este vídeo se demuestra cómo aumentar el rendimiento de los paquetes Integration Services para diseñar el paralelismo.
Menciones a participantes en el vídeo
Gracias a Thomas Kejser por aportar el material para la serie Serie de vídeos SSIS: diseñar y ajustar el rendimiento de SQL Server. Este vídeo es el cuarto de la serie.
Gracias a Carla Sabotta y Douglas Laudenschlager por sus consejos e inestimables comentarios.
Notas técnicas del vídeo
Nota
Las notas técnicas son extractos seleccionados del vídeo.
A continuación se enumeran los principios del diseño paralelo: dividir el problema, eliminar los conflictos y programar con eficacia.
La idea del diseño paralelo es dividir un problema grande en piezas independientes más pequeñas, y desplegar el trabajo. En Integration Services, dividir el problema en porciones más pequeñas significa dividir los datos que se van a procesar. Es conveniente intentar hacer estas particiones del mismo tamaño ya que de ese modo la programación será óptima y la distribución mucho más sencilla.
Después, tendrá que eliminar los conflictos entre las partes de trabajo más pequeñas, de modo que puedan ocurrir en paralelo sin interferir entre sí. Es aconsejable un diseño sin estado, lo que significa que cada unidad de trabajo se contiene a sí misma y no necesita coordinarse con nada más aparte de lo que se usa para hacer su trabajo. También sería conveniente reducir la contención por los recursos externos.
Finalmente, tendrá que tomar las porciones pequeñas de trabajo independiente y extenderlas para conseguir agilizarlas. Esto implica programar y distribuir el trabajo de modo que los recursos más importantes se usen eficazmente. También implica usar el tiempo con sabiduría y no permitir que una tarea larga acapare el tiempo de ejecución. Si imagina un diagrama de Gantt del trabajo que se va a hacer, deseará que la carga de trabajo esté equilibrada de modo que todo el conjunto de trabajo finalice lo antes posible.
Dividir el problema
Debe dividir los datos de origen en fragmentos más pequeños de aproximadamente el mismo tamaño. Para ello, puede basarse en intervalos naturales de datos, por ejemplo, temporales o de geografía. O bien, si tiene una columna de identidad, puede modular sus valores para identificar las divisiones iguales. De lo contrario, puede limitarse a aplicar una función hash en las columnas de clave para crear las particiones.
Además de crear divisiones en la tabla de origen, tendrá que dividir las tablas de destino para hacer coincidir las particiones de los datos de origen. El comando SQL SWITCH proporciona un mecanismo muy eficaz para agregar particiones a una tabla y quitarlas.
Eliminar conflictos
Después de dividir el problema, tiene que eliminar los posibles conflictos entre esas divisiones. Un diseño sin estado es importante para evitar las interacciones complejas y los consiguientes conflictos. Parea asegurarse de que el paquete no tiene estado en su diseño, tendrá que pasar en él toda la información que necesita para hacer su trabajo.
Asegúrese de evitar la contención de los bloqueos. Muchas conexiones que se insertan en la misma tabla ocasionarán a la larga contención por los recursos. Para evitar esto, use tablas con particiones y aprovéchese de SQL SWITCH.
Tenga cuidado con la contención por el hardware de control. Si la E/S de disco es problemática, use más unidades o unidades más rápidas. Si el problema es la E/S de red, agregue o actualice los controladores de red. Si el problema lo constituyen la CPU o la memoria, use un equipo con más procesadores o memoria, o varios equipos. Y recuerde que Integration Services está diseñado para ejecutarse en memoria, de modo que debe asegurarse de que cada paquete tiene memoria suficiente.
Programar con eficacia
Después de dividir el problema en tareas más pequeñas y eliminar los conflictos entre ellas, tendrá que programarlas para que se ejecuten de forma eficaz. Para crear una programación eficiente, comience por definir una cola de prioridades del trabajo que se va a hacer. Para ello, lo mejor es usar una tabla SQL.
Después, inicie varias copias del paquete que ha creado para hacer el trabajo. Para hacer esto de forma sencilla y efectiva, se puede usar el comando START de Windows para invocar el programa dtexec.exe. El número de paquetes que inicie determina el grado de paralelismo que va a usar.
Cada uno de estos paquetes procesará el trabajo de la cola de tareas según la prioridad hasta que no quede ningún trabajo por hacer. Un bucle dentro del paquete obtiene primero una tarea de la cola de prioridades, después hace el trabajo definido por esa tarea y a continuación repite el proceso hasta que la cola de tareas está vacía.
Demostración
En la primera ejecución de la demostración, cada tarea se procesa en secuencia por una sola instancia del paquete.
En la segunda ejecución de la demostración, dos procesos trabajan en paralelo. Las tareas se completan en lotes de dos y el tiempo de ejecución total de la demostración cae cerca de la mitad de 64 a 36 segundos.
En la tercera ejecución de la demostración, cuatro procesos trabajan en paralelo. El tiempo de las tareas individuales ha ascendido de 9 a 14 segundos aproximadamente. Y el tiempo de ejecución total ha caído de 36 a 28 segundos aproximadamente.
En la última de la demostración, ocho procesos trabajan en paralelo. A medida que todas las tareas se realizan simultáneamente, el tiempo de cada una asciende a cerca de 27 segundos y el tiempo total de ejecución es casi el mismo que con cuatro procesos. Lo que ha sucedido es que nos hemos topado con un cuello de botella de E/S de disco a medida que los ocho procesos contendían entre sí para leer sus archivos de datos del disco. Para resolver este problema, sería aconsejable dispersar los archivos a través de discos y controladoras independientes, o pasar a usar una tecnología de disco más rápida.