Производительность измельчения XML в SQL Server

Я работаю с XML текущего наблюдения NOAA (, пример :. Вашингтон, округ Колумбия)и я измельчаю файлы для 4000+ станций в таблицу SQL Server 2008 R2. Перепробовав много разных подходов, у меня есть один, с которым я двигаюсь вперед.

Этот вопрос касается производительности между различными методами и, что наиболее важно, почему она такая резкая.

Первая попытка

Работая на C #, я проанализировал все файлы с помощью Linq to XML и записал полученные записи в базу данных с помощью Linq to SQL. Код для этого предсказуем, поэтому я не буду утомлять вас им.

Переписывание с помощью linq to Entity Framework не помогло.

Это привело к тому, что приложение работало более часа и обработало всего около 1600 файлов. Медлительность является результатом того, что Linq to SQL и Linq to Entities выполняют вставку и выбор для каждой записи.

Вторая попытка

Все еще работая на C #Я попытался ускорить его, используя методы массовой вставки, доступные в Интернете (пример:Ускорение вставки с помощью Linq с -по -SQL -, часть 1).

Все еще медленно, хотя заметно быстрее, чем первая попытка.

На этом этапе я перешел к использованию хранимой процедуры для обработки XML-шрединга и вставки с помощью кода C #, объединяющего файлы в одну строку XML и добавляющего тег-оболочку.

Третья попытка

Использование XML-запроса SQL Server, аналогичного этому (@xml — это файл xml )[из памяти]:

select credit = T.observation.value('credit[1]', 'varchar(256)')
      ,... -- the rest of the elements possible in the file.
from @xml.nodes('wrapper') W(station)
    cross apply W.station.nodes('current_observation') T(observation)

Я позволил ему работать в течение 15 минут и отменил его, обработав около 250 записей.

Четвертая попытка

Я изменил запрос, чтобы использовать OpenXML:

declare $idoc int

exec sp_xml_preparedocument @idoc output, @xml

select Credit
      ,... -- the rest of the elements
from openxml(@idoc, '/wrapper/current_observations', 2)
    with (
        Credit varchar(256) 'credit'
       ,...) -- the rest of the elements

exec sp_xml_removedocument @idoc

Это обработало все 4000+ записей за 10 секунд!Вполне приемлемо.

Хотя я ожидал некоторых различий между методами, я не ожидал, что разница будет настолько существенной.

Так что мой вопрос просто,

«Почему такая резкая разница в производительности между разными методами?»

Я очень рад, что мне показали, что я использовал первые 3 неправильно.

5
задан marc_s 15 July 2012 в 07:56
поделиться