1

У меня есть программа, которая выполняет длительный процесс. Циклы по тысячам записей, по одному за раз, и вызывают хранимую процедуру для каждой итерации. Будут ли запущены два экземпляра такой программы с одной обработкой половины записей, а другая обработка второй половины ускорит обработку?Запуск нескольких экземпляров программы для ускорения процесса?

Вот сценарии:

  1. 1 Программа, бег длительного процесса запуска
  2. 2 экземпляра программы на одном сервере, подключение к одной базе данных, каждый из которых отвечает за обработки половины (50%) из записей ,
  3. 2 экземпляра на разных серверах, подключающихся к одной базе данных, каждая из которых отвечает за половину (50%) записей.

Будет ли сценарий 2 или 3 работать в два раза быстрее, чем 1? Будет ли разница между 2 и 3? Основным узким местом является хранимый вызов proc, который занимает около половины секунды.

Спасибо!

+0

полностью зависит от вашей установки. одноядерный/однопоточный сервер db не будет пользоваться преимуществами нескольких параллельных клиентов. –

ответ

1

Это действительно зависит от того, что делает хранимая процедура. Если хранимая процедура будет обновлять записи, и у вас будет один экземпляр базы данных, тогда при записи данных будут возникать разногласия.

Значения в игре здесь, являются:

  1. Время, необходимое для считывания данных в памяти для приложений (и это также зависит от того, используется ли на стороне клиента или SQL-поддерживаемые сервером боковые курсоры).
  2. Время, необходимое для обработки или использования вашей логики приложения.
  3. Время, необходимое для записи обновленного элемента назад (при условии обновления proc).

Одно из решений (и это не в коем случае не идеальное решение, не зная точные требования), являются:

  1. Have X сервера чтение Y записи, и обрабатывать их.
  2. Если эти серверы записывают результаты на выделенный почтовый сервер в сериализованном виде, чтобы избежать разногласий.
+0

Логика приложения не занимает много времени, это сторонний хранимый процесс, который вызывается в цикле со стороны приложения (10 000 + раз) и занимает 0,5 секунды для завершения вызова каждый раз. Вместо x серверов я могу использовать один сервер и несколько экземпляров одной и той же программы для разделения обработки записей или для этого требуются несколько серверов? Я не уверен, что подразумевается, записывая результаты в сериализованном виде. Я просто передаю параметры хранимому процессу, и он срабатывает. – chobo

+0

@chobo, честно говоря, все зависит от чтения, того, что происходит в обработке, и сколько писем происходит. Если на серверах X будет выпущен gazillion, тогда ваш сервер БД будет иметь бутылочную горло, если вы не настроите какую-то стратегию репликации. Это очень зависит от реализации, поэтому мой ответ - это один рабочий процесс, но может не соответствовать вашим потребностям. Реальная проблема, которую вы пытаетесь решить и что она делает, - это то, что нам нужно знать, чтобы помочь :) –

+0

Thanks Moo. Я могу сказать, что хранимая процедура является транзакционной и выполняет множество проверок и записей целостности, это для системы управления запасами. Я не знаю, как mssql 2008 обрабатывал бы несколько вызовов этого процесса одновременно или в одно и то же время. Если вам нужна какая-то конкретная информация или область, которую я должен изучать, дайте мне знать :) Спасибо! – chobo

4

Это зависит от множества факторов. Также обратите внимание, что потоки могут быть более подходящими, чем процессы. А может и нет. Опять же: это зависит. Но: эта работа связана с CPU? Сеть переплет? Или связано с тем, что может сделать сервер базы данных? Добавление параллелизма помогает с привязкой к процессору и при разговоре с несколькими независимыми ресурсами. Борьба за одно и то же сетевое соединение или тот же сервер базы данных вряд ли улучшит ситуацию - и может многое ухудшить.

Откровенно говоря, из-за его звука лучшим вариантом может быть повторная работа sproc для работы в партиях (а не отдельных записей).

Чтобы правильно ответить на этот вопрос, вам необходимо знать, как используется ресурс сервера базы данных в настоящее время: может ли он получить дополнительную нагрузку? Или проще - просто попробуйте и посмотрите.

+0

Я не думаю, что процесс связан с ЦП, ему просто нужно пройти через 10000+ записей и иметь сохраненный процесс для выполнения 0,5 секунды для каждого из них. Я не уверен, что это привязка к базе данных или привязка к сети. Зарезервированная часть является частью сторонней системы erp, и ее изменение будет последним средством. – chobo

+0

@chobo хорошо, что такое сервер CPU/disk/etc, похожий на данный момент: похоже ли это, что он работает на холостом ходу? –

+0

Мне пришлось бы проверять диск и сеть, но использование процессора и памяти на сервере, на котором запущена программа, довольно низкое и устойчивое. – chobo

Смежные вопросы