Синтаксический анализ 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 и настройки этой временной таблицы?

jdm5310
источник
XML передается в качестве параметра?
World Wide DBA
3
Насколько велик ваш XML, сколько узлов "Request" и насколько он медленный? Стоимость XML-запроса бесполезна и ничего не говорит о фактической производительности.
Микаэль Эрикссон

Ответы:

5

Вы могли бы попробовать OPENXML. Сейчас я обычно не рекомендую, OPENXMLпоскольку у него есть ряд известных проблем с памятью (в основном это может занять 1/8 вашего пула буферов в зависимости от размера XML) (!! TODO add link). Однако, как гласит легенда, он быстрее для больших кусков XML, поэтому стоит попробовать в среде dev / test, и если вы знаете проблемы с памятью и получаете производительность, вам решать, что вам больше всего нужно. Что-то вроде этого:

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элементов он будет иметь и каков его размер в КБ / МБ. Я вернусь к этому посту позже и настрою тестовую установку для сравнения производительности на основе вашей статистики.

ОБНОВЛЕНИЕ: Согласно вашему примеру сценария, ваш XML может содержать не более 256 Remarkэлементов с максимальной длиной 2500. Создав некоторый пример XML для соответствия этим критериям и протестировав его, производительность двух методов невелика, и оба финишировать в секунду В этом случае я бы выбрал тип данных XML и методы. Можете ли вы предоставить другую запрашиваемую информацию, пожалуйста?

wBob
источник
3
SQL Server использует MSXML и DOM для обработки документов, которые вы загружаете через sp_xml_preparedocument. Это ограничивает виртуальную память, которую MSXML может использовать для обработки DOM, до одной восьмой физической памяти на машине или до 500 МБ, в зависимости от того , что меньше .
Пол Уайт 9
4

Есть две основные вещи, которые вы можете сделать, чтобы улучшить производительность парсинга xml:

  • Сделать переменную XML / столбец набранный , что означает , объявляя схему XSD на нем. Это приведет к проверке xml, что само по себе займет немного времени, но скорость синтаксического анализа улучшится.
  • Индексируйте столбец xml (не относится к переменным xml). Вы можете индексировать столбцы XML разными способами, в зависимости от ваших требований. Это может дать вам отличный прирост производительности для более сложных запросов и поисков в xml-объектах.
  • Если ваш запрос является частью гораздо большего запроса, я помню, что операции xml не распараллеливаются, поэтому вы могли бы разумно разбить большой запрос и выполнить синтаксический анализ xml в отдельном запросе от остальной части работы.
Даниэль Хутмахер
источник
3
Хотя я считаю три вещи. :-)
Аарон Бертран