2008-10-02 34 views
41

Nunca he entendido claramente el uso de MAXDOP. Sé que hace que la consulta sea más rápida y que es el último elemento que puedo usar para la Optimización de consultas.¿Cuál es el propósito de usar OPTION (MAXDOP 1) en SQL Server?

Sin embargo, mi pregunta es, ¿cuándo y dónde es más adecuado para usar en una consulta?

+1

Debe incluir la versión y el paquete de servicio del servidor SQL. Esto puede haber sido resuelto en una versión posterior ... –

Respuesta

18

Esto es un dilema general sobre Paralelismo en SQL Server, es posible que no responda su pregunta directamente.

de los libros en línea, en MAXDOP:

establece el número máximo de procesadores el procesador de consultas puede utilizar para ejecutar una única sentencia índice. Se pueden usar menos procesadores según la carga de trabajo actual del sistema.

Consulte Rickie Lee's blog en el paralelismo y el tipo de espera CXPACKET. Es bastante interesante.

Generalmente, en una base de datos OLTP, mi opinión es que si una consulta es tan costosa que debe ejecutarse en varios procesadores, la consulta debe volverse a escribir en algo más eficiente.

¿Por qué obtienes mejores resultados al agregar MAXDOP (1)? Difícil de decir sin los planes de ejecución reales, pero podría ser tan simple como que el plan de ejecución sea totalmente diferente que sin la OPCIÓN, por ejemplo, usar un índice diferente (o más probable) UNIRSE de manera diferente, utilizando uniones MERGE o HASH.

20

Como se menciona en Kaboing, MAXDOP(n) realmente controla la cantidad de núcleos de CPU que se utilizan en el procesador de consultas.

En un sistema completamente inactivo, SQL Server intentará colocar las tablas en la memoria lo más rápido posible y unirlas en la memoria. Podría ser que, en tu caso, es mejor hacer esto con una sola CPU. Esto puede tener el mismo efecto que usar OPTION (FORCE ORDER), lo que obliga al optimizador de consultas a usar el orden de las uniones que ha especificado. En algunos casos, he visto OPTION (FORCE PLAN) reducir una consulta de 26 segundos a 1 segundo de tiempo de ejecución.

Libros en pantalla se enciende decir que los posibles valores para MAXDOP son:

0 - Utiliza el número real de CPU disponibles en función de la carga de trabajo actual del sistema. Este es el valor predeterminado y la configuración recomendada.

1 - Suprime la generación de planes paralelos. La operación se ejecutará en serie.

2-64 - Limita el número de procesadores al valor especificado. Se pueden usar menos procesadores dependiendo de la carga de trabajo actual. Si se especifica un valor mayor que la cantidad de CPU disponibles, se usa la cantidad real de CPU disponibles.

No estoy seguro de cuál es el mejor uso de MAXDOP es, sin embargo me gustaría tomar una conjetura y decir que si usted tiene una mesa con 8 particiones, que se quiere especificar MAXDOP(8) debido a la E/S limitaciones, pero podría estar equivocado.

Éstos son algunos enlaces rápidos que he encontrado sobre MAXDOP:

Books Online: Degree of Parallelism

General guidelines to use to configure the MAXDOP option

3

Hay un par de errores en parallization servidor SQL con entrada anormal. OPTION (MAXDOP 1) los esquivará.

EDITAR: viejo. Mis pruebas se realizaron en gran medida en SQL 2005. La mayoría parece no existir más, pero de vez en cuando cuestionamos la suposición cuando SQL 2014 hace algo tonto y volvemos a la vieja usanza y funciona. Nunca logramos demostrar que no solo se trataba de una mala generación de planes en casos más recientes, ya que se puede confiar en SQL Server para que funcione correctamente en las versiones más nuevas. Como todos los casos fueron consultas obligatorias de IO, MAXDOP 1 no duele.

+1

¿Podrías explicar esos errores por favor? –

+2

No pude calificar completamente los errores, pero uno en particular: cuando se esperaba que una combinación izquierda coincidiera, muy pocos% de las filas tratarían de poner en cola ambas tablas y unir en bucle en lugar de la búsqueda de marcadores solo con la paralelización activada. – Joshua

+0

@Joshua, ¿Sabes si los errores siguen siendo relevantes para SQL 2012, 14 o 16 versiones? – HappyTown

6

como algo de un lado, MAXDOP puede parecer ser utilizado como una solución a un error potencialmente desagradable:

Returned identity values not always correct

+0

+1 Lo habría publicado ahora si ya lo has hecho ... – takrl

+0

enlace está abajo - [espejo] (https: //web.archive.org/web/20130412223343/https: //connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) – user2426679

0

Adición de mis dos centavos, basado en un problema de rendimiento que observé.

Si las consultas sencillas se emparejan innecesariamente, pueden surgir más problemas que resolver una. Sin embargo, antes de agregar MAXDOP a la consulta como solución "instintiva", hay algunas configuraciones de servidor para verificar.

En Jeremiah Peschka - Five SQL Server Settings to Change, MAXDOP y "UMBRAL DE COSTES PARA EL PARALELISMO" (CTFP) se mencionan como configuraciones importantes para verificar.

Nota: Paul White mencionó max server memory como una configuración para comprobar, en una respuesta a Performance problem after migration from SQL Server 2005 to 2012. Un buen artículo kb para leer es Using large amounts of memory can result in an inefficient plan in SQL Server

Jonathan Kehayias - Tuning ‘cost threshold for parallelism’ from the Plan Cache ayuda a averiguar el buen valor para CTFP.

Why is cost threshold for parallelism ignored?

Aaron Bertrand - Six reasons you should be nervous about parallelism tiene una discusión acerca de algunos escenario en el que MAXDOP es la solución.

Componentes de paralelismo de inhibición se mencionan en Paul White - Forcing a Parallel Query Execution Plan

Cuestiones relacionadas