Низкая производительность при запросе удаленной базы данных - это нормально? - PullRequest
3 голосов
/ 17 мая 2011

Я делаю загрузку из оракула, используя ODP.NET.

В своей текущей реализации код делает что-то вроде:

query entityIds to load based on criteria  
    foreach entityId
        load attributes 
        query geometries that exist
        foreach geometry that exists
            load geometry
        next
    next

когда БД соответствует критериям локальной сети, для загрузки 133 объектов требуется несколько секунд, чтобы загрузить все 133 объекта.

Когда БД - это удаленная БД, размещенная на ВМ в центре обработки данных на другом конце света, для их загрузки требуется около 3,5 минут.

Особенно медленным представляется запрос геометрии. При первоначальном тестировании (в TOAD, а не в коде загрузки службы), кажется, требуется около 2 секунд, чтобы загрузить геометрию для одного объекта с помощью удаленного компьютера. Если мы изменим запрос, чтобы загрузить все геометрии за один раз, это все равно займет 2 секунды. Этот вид подразумевает, что это не служебная нагрузка сети (поскольку объем возвращаемых данных намного больше для запроса, который возвращает все геометрии, но время одинаковое).

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

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

Вы замечаете сеть задержка .

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

Если сервер "далеко", то есть пинг 500 мс, это означает как минимум одну секунду задержки на запрос. Это несжимаемо - даже если запрос не возвращает строк, произойдет попадание в 1 с.

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

Я обнаружил, что эта статья содержит интересную (если не датированную) информацию: Это задержка, Глупо .

4 голосов
/ 17 мая 2011

Возможно, вы понимаете разницу между пропускной способностью и задержкой.

Задержка - это время, затрачиваемое на одну передачу в оба конца, тогда как пропускная способность - это объем данных, которые могут проходить в течение заданного периода времени (например, 1 секунда).

Если вы выполняете 200 запросов (из кода на стороне клиента, а не из хранимого процесса), то независимо от того, сколько данных идет в каждом запросе, вы получите 200 циклов

Нормальная задержка для другого конца света, я полагаю, составляет около полсекунды, поэтому для 200 объектов, извлекаемых отдельно, около 100 секунд.

Эти цифры не совсем совпадают с вашими, поэтому задержка может быть даже выше (зависит от всех видов сетевых факторов). Обычно я искал бы издержки запроса / поиска на сервере базы данных (при условии, что существует проблема с индексацией), но вы уже упоминали, что локально нет значительных накладных расходов (предположительно с теми же данными?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...