Analisi XML lentamente


8

Attualmente sto provando a mettere a punto una procedura memorizzata piuttosto problematica e ho notato che la maggior parte dei costi associati alla sua esecuzione proviene dall'analisi di alcuni XML in una tabella temporanea. Ecco l'SQL in questione:

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)

Inoltre, hai un'idea della struttura dell'XML da analizzare:

  <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>

C'è qualcosa che posso fare per migliorare le prestazioni di analisi di questi nodi XML e impostazione di questa tabella temporanea?


L'XML viene passato come parametro?
World Wide DBA

3
Quanto è grande il tuo XML, quanti nodi "Request" ci sono e quanto è lento? Il costo per una query XML è inutile e non ti dice nulla sulle prestazioni effettive.
Mikael Eriksson

Risposte:


5

Potresti provare OPENXML. Ora di solito non lo consiglio OPENXMLperché ha una serie di problemi di memoria ben noti (in pratica può richiedere 1/8 del pool di buffer in base alla dimensione dell'XML) (!! TODO aggiungi link). Indipendentemente dalla leggenda, è più veloce per pezzi di XML più grandi, quindi vale la pena provare in un ambiente di sviluppo / test e se conosci i problemi di memoria e ottieni le prestazioni, spetta a te decidere quale ti serve di più. Qualcosa come questo:

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

Ricorda di chiamare sempre sp_xml_removedocument. Immagino che il tuo vero XML sia molto più grande, puoi darci un'idea di quanti Remarkelementi avrà e di quale dimensione è in KB / MB. Tornerò al post più tardi e creerò un banco di prova per confrontare le prestazioni in base alle tue statistiche.

AGGIORNAMENTO: Secondo il tuo script di esempio, il tuo XML può avere solo un massimo di 256 Remarkelementi con una lunghezza massima di 2500. Avendo creato un XML di esempio per soddisfare questi criteri e testato, le prestazioni tra le due tecniche sono scarse ed entrambe finire in meno di un secondo. In questo caso sceglierei il tipo di dati e i metodi XML. Potete fornire le altre informazioni richieste per favore?


3
SQL Server utilizza MSXML e il DOM per elaborare i documenti caricati tramite sp_xml_preparedocument. Limita la memoria virtuale che MSXML può utilizzare per l'elaborazione DOM a un ottavo della memoria fisica sulla macchina o a 500 MB, a seconda di quale dei due è inferiore .
Paul White 9

4

Esistono due cose principali che puoi fare per migliorare le prestazioni di analisi XML:

  • Rendi la variabile / colonna xml digitata , il che significa dichiarare uno schema xsd su di essa. Ciò forzerà una convalida dell'xml, che di per sé richiederà un po 'di tempo, ma la velocità di analisi migliorerà.
  • Indicizza una colonna xml (non si applica alle variabili xml). Puoi indicizzare le colonne XML in diversi modi, a seconda delle tue esigenze. Ciò può offrire eccellenti miglioramenti delle prestazioni per query e ricerche più complesse in BLOB XML.
  • Se la tua query fa parte di una query molto più grande, mi sembra di ricordare che le operazioni xml non si parallelizzano, quindi potresti fare saggiamente per spezzare una query di grandi dimensioni e fare l'analisi xml in una query separata dal resto del lavoro.

3
Conto tre cose, però. :-)
Aaron Bertrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.