Распараллеливание доступа к базе данных - PullRequest
0 голосов
/ 07 апреля 2011

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

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

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

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

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

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

Кто-нибудь имеет представление о том, что происходит?

1 Ответ

0 голосов
/ 07 апреля 2011

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

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

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

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

С уважением GJ

...