Я работаю с 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 неправильно.