Muchos de nosotros no tenemos acceso a servidores con más de un CPU, pero existe una manera de poder simular un plan de ejecución en paralelo en equipos con un solo CPU para efectos de pruebas y desarrollos.
Es posible utilizar el parámetro –P que es un parámetro no documentado para iniciar SQL Server y forzarlo a iniciar con un numero particular de UMSs (User Mode Scheduler). Esta es utilizada para experimentar con el optimizador de consultas la manera en que generaría un plan de ejecución en paralelo cuando solo se tiene un CPU físicamente.
A continuación explico acerca de los queries en paralelo y el UMS, para que puedan entender que pasa cuando habilitamos la bandera –P. Este tema es muy grande ya que ocupa un capitulo de SQL Server internals, por lo que solo daré un pequeño resumen.
Un plan en paralelo es cuando SQL Server procesa un query en múltiples pasos y todos al mismo tiempo. Sin embargo cuando SQL Server interactuá con el sistema operativo para manejar los threads, los queries no hacen peticiones al sistema operativo para ejecutarlos en el CPU, sino que SQL Server asigna un query (o una parte de un query en paralelo) a un UMS y ese UMS es responsable de programar el thread para que se ejecute en el CPU. SQL Server entonces pregunta directamente al UMS por tiempo de procesamiento y el UMS hace ese llamado al Sistema Operativo. También el UMS le dice al Sistema Operativo cuando debe de detener una petición en particular de SQL Server para que el UMS pueda programar otra nueva tarea.
Por default, SQL Server crea un UMS por cada procesador lógico que se tenga al iniciar. Me refiero a cada procesador lógico como a los dos procesadores que aparentemente ve el sistema operativo cuando tenemos un procesador fisico hyper-threaded. En este caso solo tenemos un solo procesador físico, pero dos procesadores lógicos. SQL Server asigna un UMS a cada procesador lógico y el número de UMS que tenga asignado SQL Server corresponde al máximo grado de paralelismo que tengamos en un query. Podemos usar la opción “affinity mask” en SQL Server para crear más UMS que el número de procesadores lógicos que tengamos. Esto es lo que hace la opción –P. Por ejemplo si iniciamos SQL Server con la opción –P4, crearemos cuatro UMSs aunque solo tengamos un equipo con 2 procesadores lógicos, lo mismo ocurriría si solo tuviéramos un procesador lógico.
No recomiendo usar esta opción en un equipo de producción, ya que en realidad no se está teniendo un mayor poder de procesamiento. Solo se está permitiendo que SQL Server cree más UMS’s en un solo procesador. Esto inevitablemente nos dará problemas de performance si tenemos una gran carga en el equipo. Sin embargo esta técnica nos da una manera de realizar pruebas sobre los diferentes planes de ejecución que SQL Server podría crear sobre un query, basado en el número de procesadores en el servidor, sin necesidad de tenerlos realmente. Como último Microsoft no da soporte para este parámetro que solo funciona en la versión Developer y Enterprise.