XML analisando lentamente


8

Atualmente, estou tentando ajustar um procedimento armazenado um tanto problemático e notei que a maioria dos custos associados à execução vem da análise de alguns XML em uma tabela temporária. Aqui está o SQL em questão:

CREATE TABLE #ChangeSet 
(
    RemarkTypeID TINYINT NOT NULL PRIMARY KEY,
    RemarkText VARCHAR(2500) NOT NULL,
    ListingID INT NOT NULL
)
INSERT INTO #ChangeSet
    (RemarkTypeID, 
    RemarkText,
    ListingID)
SELECT
    T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID,
    T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText,
    @ListingID
FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c)

Além disso, para ter uma idéia da estrutura do XML que está sendo analisada:

  <Remarks>
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" />
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211768" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="3" RemarkText="aaaell Maintained 3Bd 1.5Ba Semi-Detached Home In Cambridge Gardens. Garage W As Converted Into A Nice Family Room The Outside Is Maintence Free. Includes All Appliances,Security System,Storage Shed,Ceiling Fans And New Carpet.This Home Is Very Well Pricded. Seller Will Consider Fha Or Va Along With Conventional Finacing. This Is A Great Buy." />
 </Remarks>

Há algo que eu possa fazer para melhorar o desempenho da análise desses nós XML e da configuração dessa tabela temporária?


O xml está sendo passado como parâmetro?
World Wide DBA

3
Qual é o tamanho do seu XML, quantos nós "Request" existem e qual é a velocidade? O custo de uma consulta XML é inútil e não informa nada sobre o desempenho real.
Mikael Eriksson

Respostas:


5

Você poderia tentar OPENXML. Agora eu normalmente não recomendo, OPENXMLpois ele tem vários problemas de memória conhecidos (basicamente, pode levar 1/8 do seu buffer pool dependendo do tamanho do XML) (!! TODO add link). Seja qual for a lenda, é mais rápido para pedaços maiores de XML, portanto vale a pena tentar em um ambiente de desenvolvimento / teste e, se você conhece os problemas de memória e obtém o desempenho, cabe a você decidir o que mais precisa. Algo assim:

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @RemarksXml

INSERT INTO #ChangeSet
SELECT RemarkTypeID, RemarkText, @ListingID
FROM OPENXML( @handle, '/Remarks[1]/Remark', 1 ) 
WITH ( 
    RemarkTypeID    TINYINT,
    RemarkText      VARCHAR(2500)
    )

EXEC sp_xml_removedocument @handle

Lembre-se de sempre ligar sp_xml_removedocument. Suponho que seu XML real seja muito maior. Você pode nos dar uma idéia de quantos Remarkelementos ele terá e qual o tamanho em KB / MB. Voltarei ao post mais tarde e montarei uma plataforma de teste para comparar o desempenho com base em suas estatísticas.

ATUALIZAÇÃO: De acordo com o script de exemplo, seu XML pode ter no máximo 256 Remarkelementos com um comprimento máximo de 2500. Depois de criar um exemplo de XML para atender a esses critérios e testá-lo, há pouco desempenho entre as duas técnicas, e ambos terminar em sub-segundo. Nesse caso, eu escolheria o tipo de dados e métodos XML. Você pode fornecer as outras informações solicitadas, por favor?


3
O SQL Server usa o MSXML e o DOM para processar documentos carregados via sp_xml_preparedocument. Ele restringe a memória virtual que o MSXML pode usar no processamento do DOM a um oitavo da memória física na máquina ou a 500 MB, o que for menor .
Paul White 9

4

Há duas coisas principais que você pode fazer para melhorar o desempenho da análise de XML:

  • Digite a variável / coluna xml digitada , o que significa declarar um esquema xsd. Isso forçará uma validação do xml, que por si só levará um tempo, mas a velocidade da análise melhorará.
  • Índice de uma coluna xml (não se aplica a variáveis ​​xml). Você pode indexar colunas xml de várias maneiras diferentes, dependendo de seus requisitos. Isso pode proporcionar excelentes ganhos de desempenho para consultas e pesquisas mais complexas em blobs xml.
  • Se a sua consulta fizer parte de uma consulta muito maior, lembro-me de que as operações xml não são paralelas; portanto, você pode sabiamente dividir uma consulta grande e fazer a análise xml em uma consulta separada do restante do trabalho.

3
Eu conto três coisas, no entanto. :-)
Aaron Bertrand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.