Проблема с производительностью SQL Server

Я использую 7 парсеров XML (собирающих данные со сторонних веб-сайтов) на моем сервере.

Когда я запускаю каждый XML-синтаксический анализатор отдельно, мне требуется около 1 минуты, чтобы пройти через 15 МБ XML (что довольно много).

Когда я бегу все 7 вместе, на завершение каждого бега уходит около 10 минут.

Каждый XML добавляет в базу данных много информации и выполняет около 50 000 запросов.

Сервер, на котором я запускаю свои парсеры:

  • Тип сервера: Hp Dl180 g6
  • Тип процессора: Intel Xeon E5504
  • Частота процессора: 2000 МГц
  • Количество процессоров: 2
  • Количество ядер: 4
  • Оперативная память: 16 ГБ

Запуск SQL Server Web Edition на двух процессорах

Проблема возникает, когда все парсеры работают параллельно, процессор SQL Server загружается на 100%.

И действительно большая проблема в том, что в будущем мне понадобится около 50 XML-парсеров :(

Что вы посоветуете, ребята? мне, может быть, обновить XML-сервер? или сам сервер?

Может быть, SQL Server работает на 1 ЦП, а не на 2 ЦП? как я могу это проверить?

Любой совет поможет ...


person m0fo    schedule 29.02.2012    source источник
comment
Попробуйте запускать вместе меньше парсеров. Если у вас 4 ядра, запустите 4 или 3 анализа за один раз.   -  person TcKs    schedule 29.02.2012


Ответы (2)


Была такая же проблема. у меня было 600 000 строк XML, обработка которых не завершилась даже через час. Что сработало для меня, так это разбить XML на более мелкие куски и вставить их во временную таблицу (мой XML описал телевизионные туфли, поэтому я разбил его на 200 разных каналов), и теперь для всего XML требуется 1 минута

person uriz    schedule 29.02.2012
comment
Вот что я сделал! Я анализирую XML расписания футбольных матчей, поэтому теперь я разбираю их небольшими порциями (каждый матч отдельно), и он работает быстрее, но когда все вместе, процессор настолько высок ... и я думаю, что это просто плохо. .. может быть какая-нибудь другая идея? - person m0fo; 29.02.2012
comment
Я попытался решить эту проблему с помощью нашего администратора базы данных, но безуспешно. Я полагаю, что XML-движок проблематичен с большим XML. Я остаюсь с временной таблицей. это работает хорошо для меня - person uriz; 29.02.2012

Несмотря на то, что ЦП загружен на 100%, я думаю, что ваше узкое место здесь - это ввод-вывод. Тем более, что вы сказали, что у вас одновременно несколько процессов чтения и записи данных на диск. Можете ли вы проверить ввод-вывод на своем сервере?

Если процессы попадают в разные таблицы, вы можете кое-что сделать, например, использовать файловые группы для разделения вашей БД на разные HD.

Если они обращаются к одним и тем же таблицам, у вас, вероятно, есть проблема с блокировкой, когда синтаксический анализатор A пытается прочитать данные в ту же таблицу, которую синтаксический анализатор B записывает. Я бы порекомендовал ПРОСТО ПРОВЕРИТЬ и выяснить, действительно ли это проблема, запустив процесс с уровнем изоляции, читаемым без привязки. Если все пройдет нормально, вы узнаете, в чем проблема.

person Diego    schedule 29.02.2012
comment
Привет, Диего, спасибо за комментарий! не могли бы вы подробнее объяснить, что мне делать? Я не понял на 100%. Парсеры считывают XML один раз в память и работают в цикле на всех элементах, поэтому в основном ничего (кроме самой БД) на диске не сохраняется. И, как вы сказали, я имею дело только с 3 таблицами (всеми парсерами). - person m0fo; 29.02.2012
comment
но вы сказали, что каждый XML добавляет много информации в БД и выполняет около 50 000 запросов. Я понял, что вы выполняли несколько вставок и выборок в свою БД, и, поскольку у вас есть несколько процессов, которые делают это, они, вероятно, борются за ресурсы. В любом случае, я предложил добавить установленный уровень изоляции транзакции, чтение незафиксированного в вашем парсере, чтобы это не приводило к блокировке, чтобы мы могли видеть, является ли это реальной проблемой. - person Diego; 29.02.2012
comment
Вы можете порекомендовать мне, как мне это сделать? Я не администратор базы данных, как вы могли оценить :) - person m0fo; 29.02.2012
comment
вам нужно добавить установленный уровень изоляции транзакции, считанный незафиксированным, перед вашим кодом SQL, поэтому, если синтаксический анализатор вызывает процедуру, просто сделайте это в начале кода. Но вы должны делать это везде, где вы попадаете в базу данных, выбираете или вставляете. - person Diego; 29.02.2012
comment
Я сделал это изменение, это немного помогло, но не сильно. Может быть, поможет более сильный SQL Server? Стандартная версия, а не веб-версия? - person m0fo; 29.02.2012
comment
Конечно, лучший сервер поможет! Просто помните, что с этим изменением читаются незадействованные данные. Это может нарушить ваш процесс - person Diego; 29.02.2012