El tema de los grados de paralelismo en SQL Server es bastante extenso y tiene una bibliografía
bastante amplia sobre todo en inglés (como casi todo en informática), en este post intentaré dar
una visión global de qué es y para qué sirven los grados de paralelismo en SQL Server y sobre
todo cuando y cómo utilizarlos.
En primer lugar y lo más importante es disipar cualquier idea que puedas tener acerca de esta
opción (Max Degree of Parallelism) y su vinculación a la cantidad de procesadores que SQL
Server puede utilizar cuando trata de procesar más de una conexión (o usuario) - no es así. Si SQL
Server tiene acceso a cuatro procesadores ociosos y tiene cuatro procesos para ejecutar, utilizará
los cuatro procesadores - independientemente del grado máximo de paralelismo.
Entonces, ¿qué esta opción no? Max Degree of Parallelism establece el número máximo de
procesadores que SQL Server puede utilizar para una consulta. Si SQL Server tiene que devolver
una gran cantidad de datos para una consulta a veces tiene sentido romper la misma en un
número de consultas más pequeñas, cada consulta devuelve entonces un subconjunto del total de
resultados. De esta manera el servidor SQL puede hacer uso de más de un procesador y, por lo
tanto, devolver un montón de registros con mayor rapidez para una determinada consulta de lo que
podría hacerlo con uno solo.
Hay una serie de criterios que deben cumplirse antes que SQL Server decida romper la consulta
en más de una (Intra Query Parallelism) pero a nosotros nos basta con saber que la decisión se
basa en la memoria disponible y, lo más importante, la disponibilidad de los procesadores (carece
de sentido hablar de paralelismo si nuestro servidor solo tiene 1 procesador).
Si esto es así ¿por qué tenemos que pensar en esta opción? Porque dejarlo en el valor
predeterminado 0 (dejando de SQL Server decidir) a veces se pueden dar efectos no deseados
como:
Una vez visto esto hay dos cosas importantes a saber sobre el paralelismo en SQL Server:
Las consultas en paralelo pueden generar muchos hilos ejecución, más de lo especificado
en la propia opción del grado máximo de paralelismo. Por ejemplo para un grado de paralelismo de
4 se podrían permitir más de 12 hilos de ejecución, cuatro para la consulta y el resto para
operaciones adicionales que se utilizan para las clases, discusiones, agregados y la recolección,
etc.
Las consultas en paralelo pueden causar que los procesos del servidor (SPID) tengan que
esperar un wait type 0x0200 o CXPACKET.
Con estos datos podemos concluir que generalmente no se debe utilizar el paralelismo en entornos
en los cuales vemos que las consultas debido a esto son más lentas, esta lentitud se puede deber
a:
1. Si el sistema tiene un rendimiento de datos muy pobres en el subsistema de disco
(s), entonces la descomposición de consultas es poco probable que vaya más rápido.
2. Posible sesgo de los datos, o posible bloqueo en un rango de datos por una CPU,
es decir, un proceso paralelo que está detrás, etc.
3. Si hay una falta de un índice para un predicado que da lugar a una exploración de
tabla. . Una operación de consulta en paralelo puede ocultar el hecho de que la consulta se
ejecutaría mucho más rápido con un solo procesador pero con los índices adecuados.
Los otros efectos de paralelismo mencionadas anteriormente, deberían explicarse por sí mismos y
deben conducir a la idea de que el paralelismo en sub consultas no es realmente apropiado para
las aplicaciones de Procesamiento de Transacciones En Línea (OLTP). Estas aplicaciones dónde
varía el tiempo de consulta tanto que puede molestar a los usuarios y donde el servidor de servicio
a un número de usuarios simultáneos es poco probable que se deba elegir un plan paralelo debido
al perfil de carga de trabajo de la CPU.
Así que han decidido emplear el paralelismo ¿qué valor se debe establecer para la opción grado
de paralelismo máximo? Bueno, una pauta que se suele tomar como referencia es que si tienes 8
procesadores entonces max degree of parallelism = 4, esta es probable que sea la configuración
óptima, sin embargo no hay nada que lo diga, los procesos de prueba y error son la única manera
de estar seguros.
Mi consejo sería no establecer este valor para más de la mitad el número de procesadores que se
tienen. Si tiene menos de 6 procesadores que establecería DOP a 1, que no permite ningún
paralelismo. También se podría hacer una excepción si se tuviera una base de datos que sólo va a
apoyar un proceso de usuario (algún tipo de datos de las tareas de almacenamiento o presentación
de informes) - aquí la excepción sería establecer max degree of parallelism a 0 (valor por
defecto), que permite decidir al propio SQL Server.
USE MASTER
GO
Esta opción es la más larga pero a la vez la más segura porque evitas errores del tipo The
configuration option 'max degree of parallelism' does not exist, or it may be an advanced option.
y Ad hoc update to system catalogs is not supported.
Opción 2:
Opción 3:
Accediendo a las propiedades avanzadas de la base de datos desde el SQL Server Managment
Studio y editar la opción de Grado de paralelismo máximo (ver imagen)
Resumen: Cuando SQL Server se ejecuta en un equipo con más de un microprocesador o CPU,
detecta el mejor grado de paralelismo, es decir, el número de procesadores que se emplea para
ejecutar una única instrucción en cada ejecución de planes en paralelo. Puede utilizar la
opción max degree of parallelism para limitar el número de procesadores utilizados en la
ejecución de planes paralelos. Para que el servidor pueda determinar el Grado máximo de
paralelismo, establezca esta opción en 0, que es el valor predeterminado. Si se establece el grado
máximo de paralelismo en 0, SQL Server puede utilizar todos los procesadores disponibles hasta
un número de 64. Para suprimir la generación del plan paralelo, establezca max degree of
parallelism en 1.