Está bastante bien documentado que las UDF fuerzan un plan en serie general.
No estoy seguro de que esté tan bien documentado.
- Una función escalar T-SQL evita el paralelismo en cualquier parte del plan.
- Una función CLR escalar se puede ejecutar en paralelo, siempre que no acceda a la base de datos.
- Una función T-SQL con valores de tabla de varias instrucciones fuerza una zona en serie en un plan que puede usar paralelismo en otro lugar.
- Una función T-SQL en línea con valores de tabla se expande como una vista, por lo que no tiene efecto directo.
Consulte Forzar un plan de ejecución paralela y / o la presentación de ejecución paralela de Craig Freedman .
Hay reclamos acerca de que los UDF son un cuadro negro que debe usar el cursor.
Estas afirmaciones no son correctas.
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.
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.
¿Es el soporte para UDF paralelo una característica razonable para solicitar?
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.
El objetivo de Froid es permitir a los desarrolladores utilizar las abstracciones de UDF y procedimientos sin comprometer el rendimiento. Froid logra este objetivo utilizando una técnica novedosa para convertir automáticamente programas imperativos en formas algebraicas relacionales equivalentes siempre que sea posible. Froid modela bloques de código imperativo como expresiones relacionales y los combina sistemáticamente en una sola expresión utilizando el operador Apply, lo que permite al optimizador de consultas elegir planes de consulta paralelos y orientados a conjuntos eficientes .
(énfasis mío)
Las funciones T-SQL escalares en línea ahora se implementan en SQL Server 2019 .