#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