Etiquetas

,

Un tema quizás poco conocido por algunos desarrolladores y administradores de bases de datos es el tema del paralelismo o grado de paralelismo  que utiliza Sql Server para la ejecución de la consultas , por medio del paralelismo SQL Server trata de optimizar el rendimiento de las consultas y de las operaciones con índices valiéndose de los múltiples CPU que pueda tener un nuestro servidor de base de datos esto lo logra ejecutando en paralelo mediante varios sub procesos las partes de las consultas.  El número de subprocesos que utiliza una consulta en paralelo se determina al inicio de la ejecución del plan de consulta y viene determinado por la complejidad del plan y el grado de paralelismo.

El problema que ocurre es que en la práctica se presentan casos en los que el uso de mas CPU provoca que nuestras consultas se ejecuten de manera más lenta por lo que no siempre podremos dar por sentado que el uso de paralelismo ayude a ejecutar nuestras consultas mas rápido, principalmente esto ocurre debido a la comunicación que tiene que existir entre los distintos sub procesos que deben resolver en paralelo una determinada consulta y compartir los resultados con los otros subprocesos para arrojar un resultados final, por lo que hay casos en los que este proceso de comunicación entre sub procesos terminan ocupando el mayor porcentaje del tiempo de ejecución de la consulta.

Por su puesto la pregunta es usar o no paralelismo y la respuesta dependerá según cada caso, la mayoría de las consultas y operaciones de índices se beneficiaran del paralelismo pero esto no ocurrirá en todos los casos por lo que tendremos que realizar pruebas ajustando el grado de paralelismo y observando con que grado se comporta una determinada consulta de manera mas rápido.

Ahora bien lo bueno es que podemos configurar para cada consulta lo que se conoce como Máximo grado de paralelismo utilizando la opción MAXDOP. Veamos un Ejemplo:

USE AdventureWorks
GO
SELECT *
FROM Sales.SalesOrderDetail
ORDER BY ProductID
OPTION (MAXDOP 1)
GO

En esta consulta al indicar un MAXDOP =1 les estamos indicando al SQL Server que realice la consulta utilizando solo un CPU o dicho en otras palabras estaríamos desactivando el paralelismo.

Además Microsoft no da algunas recomendaciones sobre qué grado de paralelismo utilizar:

  • Para servidores que utilizan más de ocho procesadores, utilice la siguiente configuración: MAXDOP = 8.
  • Para servidores que tienen ocho o menos procesadores, utilice la siguiente configuración donde N es igual al número de procesadores: MAXDOP = 0 a N.
  • Para servidores que tienen NUMA configurado, MAXDOP no debe superar el número de CPU que están asignadas a cada nodo NUMA .
  • Para los servidores que hyper-threading habilitado, el valor MAXDOP no debe superar el número de procesadores físicos.

Eso es todo espero que se diviertan jugando con el MAXDOP en sus consultas y no olviden revisar el plan de ejecución de las consultas que les indicara que porcentaje del tiempo se va en las tareas de paralelismo.