locked
Problema de Performance com Table-Valued Function com consulta XML via XQuery RRS feed

  • Pergunta

  • Boa tarde!

     Eu fiz uma table-valued function que recebe como parâmetro uma lista de Ids e retorna uma tabela com essa lista. Isso é necessário porque eu utilizo esta função para realizar joins via LINQ To Sql.  Para realizar essa tarefa, minha aplicação converte a lista de Ids em XML e o passa como parâmetro para a function.

    Entretanto,  quando o XML possui mais de 4.000 itens a consulta é extremamente lenta (acima de 20 segundos com 4.000).  A quebra do XML na function é realizado através de XQuery. Em uma simulação fora da function, a mesma consulta com XQuery tem sua execução imediata enquanto que a function demora mais de 20 segundos para executar com a mesma instrução.

    Essa lentidão é inerente a function ou eu estou fazendo algo de errado?

    Para ilustrar o problema :

    1) Código da Function:

     

    ALTER FUNCTION [dbo].[TVF_SEG_VISIBILIDADE]

    (

          @IDS XML

    )

     

    RETURNS @TEMP TABLE (ID INT)

    BEGIN

          INSERT INTO

                @TEMP (ID)

           SELECT

                list.id.value('.','INT')

          FROM

                @IDS.nodes('/*/ID') AS list(id)

               

          RETURN

    END

     

     

    2) Bloco T-SQL de Teste

     

    DECLARE @P0 XML

    SET @P0=’ <Root>

    <ID>1</ID>

      <ID>2</ID>

      <ID>3</ID>

      <ID>4</ID>

      <ID>5</ID>

      <ID>6</ID>

      <ID>7</ID>

          …. 

      <ID>4100</ID>

      <ID>4101</ID>

     </Root>'

     

     

          -- SELECIONANDO OS NÓS DIRETAMENTE DO XML (ZERO SEGS)

          SELECT

                list.ID.value('.','BIGINT')

          FROM

                @p0.nodes('/*/ID') AS list(ID)

     

          -- SELECIONANDO USANDO O TABLE-VALUED FUNCTION (aprox 25 SEGS para mesma consulta)

          SELECT

                ID

          FROM

                TVF_SEG_VISIBILIDADE (@p0)

     

     

     

     

     

     

     


    Alessandro Brito
    • Movido Gustavo Maia Aguiar terça-feira, 22 de março de 2011 23:13 (De:SQL Server - Desenvolvimento Geral)
    terça-feira, 22 de março de 2011 20:22

Respostas

  • Alessandro,

    Acredito que você esteja tendo este problema de performance devido à maneira que sua function foi escrita. Note que na função, você faz a leitura do XML e armazena o resultado na variável do tipo tabela que servirá de retorno. No outro exemplo, você fez apenas um select direto nos valores do XML. 

    Tente usar a function abaixo e veja se o tempo de execução é menor.

    Create FUNCTION [dbo].[TVF_SEG_VISIBILIDADE_ALTERADA] 
    ( 
       @IDS XML 
    ) 
    RETURNS TABLE 
    AS
    RETURN 
    (
      SELECT list.id.value('.','INT') Id 
      FROM  @IDS.nodes('/*/ID') AS list(id) 
    )
    

    Espero que ajude!

     

    quarta-feira, 23 de março de 2011 00:40

Todas as Respostas

  • Alessandro,

    Acredito que você esteja tendo este problema de performance devido à maneira que sua function foi escrita. Note que na função, você faz a leitura do XML e armazena o resultado na variável do tipo tabela que servirá de retorno. No outro exemplo, você fez apenas um select direto nos valores do XML. 

    Tente usar a function abaixo e veja se o tempo de execução é menor.

    Create FUNCTION [dbo].[TVF_SEG_VISIBILIDADE_ALTERADA] 
    ( 
       @IDS XML 
    ) 
    RETURNS TABLE 
    AS
    RETURN 
    (
      SELECT list.id.value('.','INT') Id 
      FROM  @IDS.nodes('/*/ID') AS list(id) 
    )
    

    Espero que ajude!

     

    quarta-feira, 23 de março de 2011 00:40
  • Olá Luiz. Após a retirada da variável table a function passou a ser executada em menos de 1 segundo ! Muito obrigado pela ajuda. Alessandro Brito.
    Alessandro Brito
    quinta-feira, 24 de março de 2011 10:38