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 / 320285
Accepted
lifeisajourney
lifeisajourney
Asked: 2022-11-29 09:14:52 +0800 CST2022-11-29 09:14:52 +0800 CST 2022-11-29 09:14:52 +0800 CST

Desempenho de XML x UDF no SQL Server

  • 772

Eu tenho uma situação em que tenho que decidir entre receber XML como um parâmetro de entrada para o procedimento armazenado ou uma lista de valores separados por vírgula e analisá-los usando uma função com valor de várias tabelas.

Logicamente falando, eu preferiria XML em vez de udfs porque udfs podem causar muitos problemas de desempenho. Mas vejo que o XML no back-end também usa funções com valor de tabela para analisar o xml. Eu queria saber se o XML é realmente melhor do que o UDF de várias tabelas e, em caso afirmativo, o que o torna melhor?

CREATE FUNCTION [dbo].[tmp_array_commaValues] ( @string varchar(4000))
RETURNS  @final TABLE(Value varchar(100))
AS
begin

    WITH tmp_cte(start, stop) AS

    (
      SELECT  1, CHARINDEX(',' , @string )
      
      UNION ALL
      
      SELECT  stop + 1, CHARINDEX(',' ,@string  , stop + 1)
      FROM tmp_cte
      WHERE stop > 0
    )

    insert into @final
    SELECT   SUBSTRING(@string , start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS stringValue
    FROM tmp_cte   

    return
end   

/* query */
Select value 
  From [dbo].[tmp_array_commaValues]('TAG,ABC,ZYX,BAG,TRY,LAG,LEAD,NETHERLANDS,TAG1,ABC1,ZYX1,BAG1,TRY1,SUN12,NANGE1')

/********** XML *********/
Declare @xml XML = '<root><id>Tag</id><id>Lag</id>
<id>Tag1</id><id>Lag1</id>
<id>Tag2</id><id>Lag2</id>
<id>Tag3</id><id>Lag3</id>
<id>Tag4</id><id>Lag4</id>
<id>Tag5</id><id>Lag5</id>
<id>Tag6</id><id>Lag6</id>
<id>Tag7</id><id>Lag7</id>
</root>'

select t.c.value('.','varchar(100)') as string
  From @xml.nodes('root/id/text()') As t(c)

Plano de execução para UDF: https://www.brentozar.com/pastetheplan/?id=SJpX2DMwi

Plano de execução para XML: https://www.brentozar.com/pastetheplan/?id=ByQv2PMvo

sql-server
  • 1 1 respostas
  • 77 Views

1 respostas

  • Voted
  1. Best Answer
    J.D.
    2022-11-29T09:40:16+08:002022-11-29T09:40:16+08:00

    udfs pode causar muitos problemas de desempenho

    Isso não é necessariamente verdade. Um código ruim causará problemas de desempenho, independentemente de onde for colocado. Existem algumas desvantagens com certos tipos de UDFs:

    1. As funções escalares são executadas RBAR (linha por linha agonizante) até o SQL Server 2019, onde certas funções escalares são inlineáveis .
    2. As funções escalares impedem o paralelismo em qualquer plano de qualquer objeto que as referencie diretamente ou qualquer objeto de dependência em qualquer parte da pilha de chamadas.
    3. As funções com valor de tabela de várias instruções evitam o paralelismo na zona em que são referenciadas no plano de consulta.

    É uma prática recomendada geralmente não usar funções escalares, por causa de suas múltiplas desvantagens, enquanto uma função com valor de tabela de instrução única é bastante adequada. As funções com valor de tabela de várias instruções são menos problemáticas, pois são serializadas apenas onde são referenciadas no plano de consulta, mas o plano de consulta como um todo ainda pode ter outras zonas paralelizadas.

    Para ler mais sobre coisas que inibem o paralelismo no SQL Server, consulte o artigo de Paul White Forçando um Plano de Execução de Consulta Paralela .

    Eu queria saber se o XML é realmente melhor do que o UDF de várias tabelas e, em caso afirmativo, o que o torna melhor?

    Como acontece com a maioria das coisas de desempenho, eu diria que depende exatamente do que você está fazendo com XML versus sua função com valor de tabela de várias instruções. Com os planos de execução que você forneceu, em uma rápida olhada, parece que o MSTVF pode ter um desempenho melhor (já que está processando menos dados e apenas um plano de execução mais simples com menos etapas, em geral). Mas não posso dizer conclusivamente.

    Você pode usar o Profiler ou Extended Events com o evento SQL:BatchCompleted ou executar SET IO, TIME STATISTICS ONe examinar a Messagesjanela no SSMS para ver CPU Time, Elapsed Timee outros TIME STATISTICSe IO STATISTICSpara ajudar a avaliar qual deles é executado com mais eficiência. Aquele com menos CPU Time, menor Elapsed Timee/ou menos Logical Readssão fatores gerais que você pode usar para determinar qual deles tem melhor desempenho.

    Além disso, a sugestão de Erik Darkling de usar Parâmetros com valor de tabela no procedimento geralmente é uma boa prática. Esta seria a minha escolha das 3 opções.

    Os parâmetros com valor de tabela têm alguma vantagem sobre XML ou análise de string?

    Sim, os dados já são apresentados em formato tabular e não precisam ser processados ​​(no SQL Server) para chegar lá. A única desvantagem tangível de usá-los é que eles são apresentados como uma variável de tabela na qual o SQL Server não mantém estatísticas. Minha solução usual para isso é imediatamente SELECTa variável de tabela em uma tabela temporária e, em vez disso, usar essa tabela temporária durante todo o procedimento.


    Ainda estamos no SQL Server 2012

    Eu recomendo procurar atualizar logo, pois há quatro versões principais atrás da mais recente e também não é mais suportada pelo Microsoft . A data de suporte estendido terminou em julho passado (2022).

    • 4

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