Está bastante bem documentado que a UDF escalar força um plano serial geral.
Executando funções em paralelo
Dado um grande número de linhas que chegam a um ponto no pipeline em que uma UDF deve ser calculada, por que o mecanismo não pode apenas distribuí-las entre os processadores? Se não houver estado dentro de uma UDF, o pedido não será importante.
Há alegações de que a UDF é uma caixa preta e deve usar o cursor. Percebo que um cursor de usuário não pode ser paralelizado em um SP para os casos em que algum estado é mantido entre iterações, mas parece que deveria ser paralelamente possível.
Pontos extras para explicar por que o mecanismo força todo o plano a ser serial, em vez de apenas o estágio de cálculo da UDF.
O suporte para UDF paralelo é um recurso razoável a ser solicitado?
fonte
Respostas:
Não tenho certeza de que tudo esteja bem documentado.
Consulte Forçando um plano de execução paralela e / ou a apresentação de Execução Paralela de Craig Freedman .
Essas alegações não estão corretas.
Meu entendimento é que as restrições atuais são puramente o resultado de certos detalhes de implementação. Não há razão fundamental para que funções não possam ser executadas usando paralelismo.
Especificamente, as funções escalares do T-SQL são executadas em um contexto T-SQL separado, o que complica a operação, coordenação e desligamento corretos (especialmente no caso de um erro) significativamente.
Da mesma forma, as variáveis de tabela suportam leituras paralelas (mas não gravam) em geral, mas a variável de tabela exposta por uma função com valor de tabela não é capaz de suportar leituras paralelas por razões específicas da implementação. Você precisaria de alguém com acesso ao código fonte (e a liberdade de compartilhar detalhes) para fornecer uma resposta autorizada, receio.
Obviamente, se você puder argumentar com força suficiente. Minha opinião é de que o trabalho envolvido seria extenso, portanto sua proposta teria que atender a um nível extremamente alto. Por exemplo, uma solicitação relacionada (e muito mais simples) para fornecer funções escalares em linha tem grande suporte, mas permanece deficiente por anos.
Você pode ler o documento da Microsoft:
... que descreve a abordagem que a Microsoft está adotando para resolver os problemas de desempenho da função escalar T-SQL na versão após o SQL Server 2017.
(ênfase minha)
As funções T-SQL escalares em linha agora são implementadas no SQL Server 2019 .
fonte
Como Paulo mencionou corretamente em sua resposta, não há razão fundamental para que UDFs escalares não possam ser executados usando paralelismo. No entanto, além dos desafios de implementação, há outro motivo para forçá-los a serem seriais. O artigo Froid citado por Paul fornece mais informações sobre isso.
Citando o artigo (Seção 2.3):
A abordagem do Froid, conforme descrito no artigo, não resultará apenas em planos paralelos, mas também adiciona muito mais benefícios para consultas com UDFs. Em essência, ele inclui seu pedido de execução paralela de UDFs.
[Divulgação: Eu sou co-autor do artigo Froid]
fonte