Usuário com melhor resposta
Problema de Performance com Table-Valued Function com consulta XML via XQuery

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!
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 23 de março de 2011 19:48
- Marcado como Resposta Alessandro Antonio de Brito quinta-feira, 24 de março de 2011 10:34
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!
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 23 de março de 2011 19:48
- Marcado como Resposta Alessandro Antonio de Brito quinta-feira, 24 de março de 2011 10:34
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 Britoquinta-feira, 24 de março de 2011 10:38