AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 72330
Accepted
crokusek
crokusek
Asked: 2014-07-25 13:43:06 +0800 CST2014-07-25 13:43:06 +0800 CST 2014-07-25 13:43:06 +0800 CST

O suporte para Parallel Scalar UDF é uma solicitação de recurso razoável?

  • 772

Está razoavelmente bem documentado que as UDFs escalares forçam um plano serial geral.

Executando funções em paralelo

Dado um grande número de linhas entrando em um ponto no pipeline onde uma UDF deve ser calculada, por que o mecanismo não pode simplesmente distribuí-las entre os processadores? Se não houver estado em uma UDF, a ordem não importa.

Há reclamações sobre UDF ser uma caixa preta que deve usar o cursor. Posso ver que um cursor de usuário não pode ser paralelizado dentro de um SP para os casos em que algum estado é mantido entre as iterações, mas parece que deveria ser paralelizado de outra forma.

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 do UDF.

O suporte para UDF paralelo é um recurso razoável a ser solicitado?

sql-server parallelism
  • 2 2 respostas
  • 2823 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2014-07-25T14:29:52+08:002014-07-25T14:29:52+08:00

    Está razoavelmente bem documentado que os UDFs forçam um plano serial geral.

    Não tenho certeza se tudo está bem documentado.

    • Uma função T-SQL escalar impede o paralelismo em qualquer lugar do plano.
    • Uma função escalar CLR pode ser executada em paralelo, desde que não acesse o banco de dados.
    • Uma função T-SQL com valor de tabela de várias instruções força uma zona serial em um plano que pode usar paralelismo em outro lugar.
    • Uma função T-SQL com valor de tabela embutida é expandida como uma exibição, portanto, não tem efeito direto.

    Consulte Forçando um Plano de Execução Paralela e/ou a apresentação de Execução Paralela de Craig Freedman .

    Há reclamações sobre UDFs sendo uma caixa preta que deve usar o cursor.

    Essas afirmações não são corretas.

    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 do UDF.

    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 dentro de um contexto separado do T-SQL, o que complica significativamente a operação correta, a coordenação e o desligamento (especialmente no caso de um erro).

    Da mesma forma, as variáveis ​​de tabela oferecem suporte a leituras paralelas (mas não a gravações) em geral, mas a variável de tabela exposta por uma função com valor de tabela não é capaz de oferecer suporte a leituras paralelas por motivos específicos da implementação. Você precisaria de alguém com acesso ao código-fonte (e liberdade para compartilhar detalhes) para fornecer uma resposta confiável, receio.

    O suporte para UDF paralelo é um recurso razoável a ser solicitado?

    Claro, se você puder fazer um caso forte o suficiente. Minha opinião é que o trabalho envolvido seria extenso, então sua proposta teria que atender a um padrão extremamente alto. Por exemplo, uma solicitação relacionada (e muito mais simples) para fornecer funções escalares embutidas tem grande suporte, mas não foi implementada por anos.


    Você pode gostar de ler o artigo da Microsoft:

    • Froid: Otimização de Programas Imperativos em um Banco de Dados Relacional (pdf)

    ...que descreve a abordagem que a Microsoft pretende adotar para resolver os problemas de desempenho da função escalar do T-SQL na versão após o SQL Server 2017.

    O objetivo do Froid é permitir que os desenvolvedores usem as abstrações de UDFs e procedimentos sem comprometer o desempenho. Froid atinge esse objetivo usando uma nova técnica para converter automaticamente programas imperativos em formas algébricas relacionais equivalentes sempre que possível. Froid modela blocos de código imperativo como expressões relacionais e os combina sistematicamente em uma única expressão usando o operador Apply, permitindo assim que o otimizador de consulta escolha planos de consulta paralelos orientados a conjuntos eficientes.

    (grifo meu)


    As funções T-SQL escalares embutidas agora são implementadas no SQL Server 2019 .

    • 17
  2. Karthik
    2018-02-10T12:53:53+08:002018-02-10T12:53:53+08:00

    Como Paul mencionou corretamente em sua resposta, não há razão fundamental para que UDFs escalares não possam ser executadas usando paralelismo. No entanto, além dos desafios de implementação, há outro motivo para forçá-los a serem seriais. O artigo da Froid citado por Paul dá mais informações sobre isso.

    Citando o artigo (Seção 2.3):

    Atualmente, o SQL Server não usa paralelismo intraconsulta em consultas que invocam UDFs. Os métodos podem ser projetados para atenuar essa limitação, mas apresentam desafios adicionais, como escolher o grau certo de paralelismo para cada invocação da UDF.

    Por exemplo, considere uma UDF que chama outras consultas SQL, como a da Figura 1. Cada uma dessas consultas pode usar paralelismo e, portanto, o otimizador não tem como saber como compartilhar threads entre elas, a menos que examine o UDF e decide o grau de paralelismo para cada consulta interna (que pode mudar de uma invocação para outra). Com UDFs aninhados e recursivos, esse problema se torna ainda mais difícil de gerenciar.

    A abordagem do Froid, conforme descrito no artigo, não apenas resultará em planos paralelos, mas também agregará muito mais benefícios para consultas com UDFs. Em essência, ele inclui sua solicitação de execução paralela de UDFs.

    Atualização: Froid agora está disponível como um recurso de visualização do SQL Server 2019. O recurso é chamado de "Scalar UDF Inlining". Mais detalhes aqui: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/11/07/introducing-scalar-udf-inlining/

    [Divulgação: sou co-autor do artigo Froid]

    • 11

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve