Penguraian XML lambat

8

Saat ini saya mencoba untuk menyetel prosedur tersimpan yang agak bermasalah dan saya perhatikan bahwa sebagian besar biaya yang terkait dengan menjalankannya berasal dari parsing parsing beberapa XML ke dalam tabel temp. Inilah SQL yang dimaksud:

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)

Juga, jadi Anda memiliki beberapa gagasan tentang struktur XML yang diuraikan:

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

Apakah ada yang bisa saya lakukan untuk meningkatkan kinerja parsing node XML ini dan mengatur tabel temp ini?

jdm5310
sumber
Apakah xml diteruskan sebagai parameter?
World Wide DBA
3
Seberapa besar XML Anda, ada berapa banyak "Permintaan" node dan seberapa lambat itu? Biaya untuk permintaan XML tidak berguna dan tidak memberi tahu Anda apa-apa tentang kinerja aktual.
Mikael Eriksson

Jawaban:

5

Anda bisa mencoba OPENXML. Sekarang saya biasanya tidak merekomendasikan OPENXMLkarena memiliki sejumlah masalah memori yang terkenal (pada dasarnya dapat mengambil 1/8 dari buffer pool Anda tergantung pada ukuran XML) (!! TODO add link). Bagaimanapun legenda memilikinya, lebih cepat untuk potongan XML yang lebih besar, jadi patut dicoba di lingkungan pengembang / pengujian dan jika Anda mengetahui masalah memori, dan Anda mendapatkan kinerja, terserah Anda untuk memutuskan mana yang paling Anda butuhkan. Sesuatu seperti ini:

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

Ingatlah untuk selalu menelepon sp_xml_removedocument. Saya rasa XML Anda yang sebenarnya jauh lebih besar, dapatkah Anda memberi tahu kami berapa banyak Remarkelemen yang akan dimiliki dan berapa ukurannya dalam KB / MB. Saya akan kembali ke posting nanti dan membuat test rig untuk membandingkan kinerja berdasarkan statistik Anda.

UPDATE: Menurut skrip contoh Anda, XML Anda hanya dapat memiliki maks 256 Remarkelemen dengan panjang maksimal 2500. Setelah membuat beberapa sampel XML untuk memenuhi kriteria ini dan mengujinya, ada sedikit kinerja antara kedua teknik, dan keduanya selesai dalam sub-detik. Dalam hal ini saya akan memilih tipe data XML dan metode. Bisakah Anda memberikan informasi lain yang diminta?

wBob
sumber
3
SQL Server menggunakan MSXML dan DOM untuk memproses dokumen yang Anda muat melalui sp_xml_preparedocument. Ini membatasi memori virtual yang dapat digunakan MSXML untuk pemrosesan DOM hingga seperdelapan dari memori fisik pada mesin atau 500MB, mana yang lebih sedikit .
Paul White 9
4

Ada dua hal utama yang dapat Anda lakukan untuk meningkatkan kinerja parsing xml:

  • Buat xml variabel / kolom yang diketik , yang berarti mendeklarasikan skema xsd di atasnya. Ini akan memaksa validasi xml, yang dengan sendirinya akan memakan waktu sedikit, tetapi kecepatan parsing akan meningkat.
  • Indeks kolom xml (tidak berlaku untuk variabel xml). Anda dapat mengindeks kolom xml dalam sejumlah cara berbeda, tergantung pada kebutuhan Anda. Ini dapat memberi Anda keuntungan kinerja luar biasa untuk kueri dan pencarian yang lebih kompleks dalam gumpalan xml.
  • Jika kueri Anda adalah bagian dari kueri yang jauh lebih besar, saya sepertinya ingat bahwa operasi xml tidak memparalelkan, jadi Anda mungkin melakukan dengan bijak untuk memecah kueri besar dan melakukan parsing xml dalam kueri terpisah dari sisa pekerjaan.
Daniel Hutmacher
sumber
3
Saya menghitung tiga hal. :-)
Aaron Bertrand