Está bastante bien documentado que los UDF escalares fuerzan un plan en serie general.
Ejecutando funciones en paralelo
Dada una gran cantidad de filas que llegan a un punto en la tubería donde se debe calcular un UDF, ¿por qué el motor no puede simplemente distribuirlas entre los procesadores? Si no hay estado dentro de un UDF, entonces el orden no debería importar.
Hay afirmaciones de que UDF es un cuadro negro que debe usar el cursor. Puedo ver que un cursor de usuario no se puede paralelizar dentro de un SP para los casos en que se mantiene algún estado entre iteraciones, pero parece que de lo contrario debería ser paralelo.
Puntos adicionales para explicar por qué el motor obliga a que todo el plan sea serial en lugar de solo la etapa de cálculo de UDF.
¿Es el soporte para UDF paralelo una característica razonable para solicitar?
fuente
Respuestas:
No estoy seguro de que esté tan bien documentado.
Consulte Forzar un plan de ejecución paralela y / o la presentación de ejecución paralela de Craig Freedman .
Estas afirmaciones no son correctas.
Tengo entendido que las restricciones actuales son puramente el resultado de ciertos detalles de implementación. No hay una razón fundamental por la cual las funciones no puedan ejecutarse usando paralelismo.
Específicamente, las funciones escalares T-SQL se ejecutan dentro de un contexto T-SQL separado, lo que complica significativamente la operación correcta, la coordinación y el apagado (especialmente en el caso de un error).
Del mismo modo, las variables de tabla admiten lecturas paralelas (pero no escrituras) en general, pero la variable de tabla expuesta por una función con valores de tabla no puede admitir lecturas paralelas por razones específicas de implementación. Me temo que necesitaría a alguien con acceso al código fuente (y la libertad de compartir detalles) para proporcionar una respuesta autorizada.
Por supuesto, si puedes hacer un caso lo suficientemente fuerte. Mi propio sentimiento es que el trabajo involucrado sería extenso, por lo que su propuesta tendría que alcanzar un nivel extremadamente alto. Por ejemplo, una solicitud relacionada (y mucho más simple) para proporcionar funciones escalares en línea tiene un gran soporte, pero ha languidecido sin implementarse durante años.
Es posible que desee leer el documento de Microsoft:
... que describe el enfoque que Microsoft adoptará para abordar los problemas de rendimiento de la función escalar T-SQL en la versión posterior a SQL Server 2017.
(énfasis mío)
Las funciones T-SQL escalares en línea ahora se implementan en SQL Server 2019 .
fuente
Como Paul ha mencionado correctamente en su respuesta, no hay una razón fundamental por la que no se puedan ejecutar UDF escalares utilizando paralelismo. Sin embargo, aparte de los desafíos de implementación, hay otra razón para obligarlos a ser seriales. El documento de Froid citado por Paul da más información sobre esto.
Citando del artículo (Sección 2.3):
El enfoque de Froid, como se describe en el documento, no solo dará como resultado planes paralelos, sino que también agregará muchos más beneficios para consultas con UDF. En esencia, subsume su solicitud de ejecución paralela de UDF.
[Divulgación: soy coautor del artículo de Froid]
fuente