Распараллеливание доступа к базе данных

#c# #multithreading #sqldatareader

#c# #многопоточность #sqldatareader

Вопрос:

Я создаю таблицу с объектами для обработки на SQL Server

База данных находится на сервере dbserver.

Затем, с помощью моего приложения (c #), я использую SqlDataReader для перебора всего объекта, и это происходит за время T. Я использую многопоточность и мьютекс в своем приложении, и оно использует одно и то же SqlDataReader для всех потоков. Я запускаюсь на сервере 1.

Затем, чтобы ускорить процесс, я разделяю объект на 2 ранга или группы по столбцу.

Затем я запускаю myapp в serverp01 для объектов в rank1 ( SqlDataReader с a select where rank = 1 ), а затем запускаю myapp в serverp02 для объекта в rank2 ( SqlDataReader с a select where rank = 2 ).

Моя проблема в том, что для обеих конфигураций требуется одинаковое время T. Возможно, я ошибаюсь, но это должно занять T / 2 времени или около того.

У кого-нибудь есть идея, что это происходит?

Комментарии:

1. Вы просматривали свой SQL server, чтобы узнать, есть ли там какие-либо проблемы, такие как блокировка, ожидания и т.д.?

Ответ №1:

Звучит так, как будто вы ограничены скоростью ввода-вывода. Когда вы запускаете эту штуку на serverp1, загружается ли процессор на максимум? Если нет, то, вероятно, сеть или диски БД являются узким местом. Вы можете проверить пропускную способность диска и сети на сервере БД, чтобы увидеть, достигли ли они определенного предела.

Если узким местом является диск, они пытаются сделать строки вашей таблицы более узкими, каждая строка в вашей таблице должна занимать как можно меньше байт. Убедитесь, что запрашиваемая таблица содержит только те несколько столбцов, которые вам действительно нужны, и что они максимально сжаты (т. Е. Сильно нормализованы с использованием целочисленных ключей вместо значений varchar, не обнуляемы и т.д.).

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

Если сеть является узким местом, то достаточно выбрать нужные столбцы и сделать их максимально узкими (ключ int вместо значения varchar).

С уважением, GJ