XMLの解析が遅い


8

私は現在、やや問題のあるストアドプロシージャを調整しようとしています。実行に関連するコストの大部分は、いくつかのXMLを解析して一時テーブルに解析することに起因することに気付きました。問題の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)

また、あなたは構文解析されている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>

これらのXMLノードの解析とこの一時テーブルの設定のパフォーマンスを向上させるためにできることはありますか?


XMLはパラメーターとして渡されていますか?
World Wide DBA

3
XMLの大きさ、「リクエスト」ノードの数、速度はどれくらいですか?XMLクエリのコストは無駄であり、実際のパフォーマンスについては何もわかりません。
ミカエルエリクソン

回答:


5

あなたは試すことができOPENXMLます。現在OPENXML、よく知られているメモリの問題が多くあるため、通常はお勧めしません(基本的に、XMLのサイズによっては、バッファープールの1/8がかかる可能性があります)(!! TODO add link)。凡例にはそれがあり、XMLのより大きな部分の方が速いので、開発/テスト環境で試してみる価値があります。メモリの問題を知っていてパフォーマンスが得られる場合は、どれが最も必要かを決めるのはあなた次第です。このようなもの:

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

常に電話することを忘れないでくださいsp_xml_removedocument。実際のXMLの方がはるかに大きいと思いますが、Remark要素の数と、KB / MB単位のサイズを教えてください。後でこの投稿に戻って、統計に基づいてパフォーマンスを比較するためのテストリグを設定します。

更新:サンプルスクリプトによると、XML Remarkに含めることができる要素は最大256 要素、最大長は2500です。これらの基準を満たすサンプルXMLを作成してテストすると、2つの手法のパフォーマンスはほとんど変わりません。 1秒未満で終了します。この場合、XMLデータ型とメソッドを選択します。リクエストされたその他の情報を提供していただけますか?


3
SQL ServerはMSXMLとDOMを使用して、sp_xml_preparedocument経由でロードしたドキュメントを処理します。これは、MSXMLがDOM処理に使用できる仮想メモリを、マシンの物理メモリの1/8または500MBのいずれか小さい方に制限します。
ポールホワイト9

4

xml解析のパフォーマンスを向上させるには、主に2つの方法があります。

  • xml変数/列をtypedにします。これは、xsdスキーマを宣言することを意味します。これにより、XMLの検証が強制されます。これ自体は少し時間がかかりますが、解析速度は向上します。
  • xml列にインデックスを付けます(xml変数には適用されません)。要件に応じて、さまざまな方法でxml列インデックスを付けることができます。これにより、XML BLOBでのより複雑なクエリとルックアップのパフォーマンスが大幅に向上する場合があります。
  • クエリがはるかに大きなクエリの一部である場合、XML操作は並列化されないことを覚えているようです。そのため、大きなクエリを分割して、残りの作業とは別のクエリでXML解析を行うのが賢明かもしれません。

3
しかし、私は3つのことを数えます。:-)
アーロンベルトラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.