J'essaie actuellement de régler une procédure stockée quelque peu problématique et j'ai remarqué que la majorité des coûts associés à son exécution proviennent de l'analyse syntaxique de XML dans une table temporaire. Voici le SQL en question:
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)
De plus, vous avez donc une idée de la structure du XML analysé:
<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>
Puis-je faire quelque chose pour améliorer les performances de l'analyse de ces nœuds XML et la configuration de cette table temporaire?
sql-server
xml
temporary-tables
jdm5310
la source
la source
Réponses:
Tu pourrais essayer
OPENXML
. Maintenant, je ne recommande normalement pasOPENXML
car il a un certain nombre de problèmes de mémoire bien connus (en gros, cela peut prendre 1/8 de votre pool de tampons en fonction de la taille de XML) (!! TODO add link). Quelle que soit la légende, il est plus rapide pour les plus gros morceaux de XML, donc cela vaut la peine d'essayer dans un environnement de développement / test et si vous connaissez les problèmes de mémoire et que vous obtenez les performances, c'est à vous de décider de ce dont vous avez le plus besoin. Quelque chose comme ça:N'oubliez pas de toujours appeler
sp_xml_removedocument
. Je suppose que votre vrai XML est beaucoup plus grand, pouvez-vous nous donner une idée du nombre d'Remark
éléments qu'il comportera et de sa taille en Ko / Mo. Je reviendrai plus tard sur le post et mettrai en place un banc d'essai pour comparer les performances en fonction de vos statistiques.MISE À JOUR: Selon votre exemple de script, votre XML ne peut avoir qu'un maximum de 256
Remark
éléments avec une longueur maximale de 2500. Après avoir créé un exemple de XML pour répondre à ces critères et l'avoir testé, il y a peu de performances entre les deux techniques, et les deux terminer en moins d'une seconde. Dans ce cas, je choisirais le type de données XML et les méthodes. Pouvez-vous fournir les autres informations demandées s'il vous plaît?la source
Il y a deux choses principales que vous pouvez faire pour améliorer les performances d'analyse XML:
la source