XML-Analyse langsam

8

Ich versuche derzeit, eine etwas problematische gespeicherte Prozedur zu optimieren, und ich habe festgestellt, dass der größte Teil der mit der Ausführung verbundenen Kosten durch das Parsen von XML in eine temporäre Tabelle entsteht. Hier ist die betreffende SQL:

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)

Sie haben also auch eine Vorstellung von der Struktur des zu analysierenden XML:

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

Kann ich irgendetwas tun, um die Leistung beim Parsen dieser XML-Knoten und beim Einrichten dieser temporären Tabelle zu verbessern?

jdm5310
quelle
Wird die XML als Parameter übergeben?
Mr. Brownstone
3
Wie groß ist Ihr XML, wie viele "Request" -Knoten gibt es und wie langsam ist es? Die Kosten für eine XML-Abfrage sind nutzlos und geben keinen Aufschluss über die tatsächliche Leistung.
Mikael Eriksson

Antworten:

5

Du könntest es versuchen OPENXML. Jetzt empfehle ich normalerweise nicht, OPENXMLda es eine Reihe bekannter Speicherprobleme gibt (im Grunde kann es je nach Größe des XML 1/8 Ihres Pufferpools dauern) (!! TODO Link hinzufügen). Wie die Legende sagt, ist es für größere XML-Teile schneller. Es lohnt sich also, es in einer Entwicklungs- / Testumgebung auszuprobieren. Wenn Sie die Speicherprobleme kennen und die Leistung erhalten, liegt es an Ihnen, zu entscheiden, welche Sie am meisten benötigen. Etwas wie das:

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

Denken Sie daran, immer anzurufen sp_xml_removedocument. Ich vermute, Ihr echtes XML ist viel größer. Können Sie uns eine Vorstellung davon geben, wie viele RemarkElemente es haben wird und wie groß KB / MB ist? Ich werde später auf den Beitrag zurückkommen und einen Prüfstand einrichten, um die Leistung anhand Ihrer Statistiken zu vergleichen.

UPDATE: Gemäß Ihrem Beispielskript kann Ihr XML nur maximal 256 RemarkElemente mit einer maximalen Länge von 2500 enthalten. Nachdem Sie ein Beispiel-XML erstellt haben, um diese Kriterien zu erfüllen und es zu testen, ist die Leistung zwischen den beiden Techniken und beiden gering in Sekundenschnelle beenden. In diesem Fall würde ich den XML-Datentyp und die XML-Methoden auswählen. Können Sie bitte die anderen angeforderten Informationen angeben?

wBob
quelle
3
SQL Server verwendet MSXML und das DOM, um Dokumente zu verarbeiten, die Sie über sp_xml_preparedocument laden. Der virtuelle Speicher, den MSXML für die DOM-Verarbeitung verwenden kann, wird auf ein Achtel des physischen Speichers auf dem Computer oder auf 500 MB beschränkt, je nachdem , welcher Wert geringer ist .
Paul White 9
4

Sie können zwei wichtige Maßnahmen ergreifen, um die XML-Parsing-Leistung zu verbessern:

  • Machen Sie die XML-Variable / Spalte typisiert , was bedeutet, dass ein xsd-Schema darauf deklariert wird. Dies erzwingt eine Validierung der XML, was an und für sich einige Zeit in Anspruch nehmen wird, aber die Analysegeschwindigkeit wird sich verbessern.
  • Indizieren Sie eine XML-Spalte (gilt nicht für XML-Variablen). Sie können XML-Spalten je nach Ihren Anforderungen auf verschiedene Arten indizieren . Dies kann zu hervorragenden Leistungssteigerungen bei komplexeren Abfragen und Suchvorgängen in XML-Blobs führen.
  • Wenn Ihre Abfrage Teil einer viel größeren Abfrage ist, erinnere ich mich anscheinend daran, dass XML-Operationen nicht parallelisiert werden. Daher sollten Sie eine große Abfrage mit Bedacht aufteilen und die XML-Analyse in einer vom Rest der Arbeit getrennten Abfrage durchführen.
Daniel Hutmacher
quelle
3
Ich zähle jedoch drei Dinge. :-)
Aaron Bertrand