Время жизни соединения SQL
Я работаю над API-интерфейсом для запроса к серверу базы данных (в моем случае Oracle) для получения огромного количества данных. (На самом деле это слой поверх JDBC.)
API, который я создал, пытается максимально ограничить загрузку каждой запрашиваемой информации в память. Я имею в виду, что я предпочитаю перебирать результирующий набор и обрабатывать возвращенную строку одну за другой, вместо того, чтобы загружать все строки в память и обрабатывать их позже.
Но мне интересно, является ли это лучшей практикой, поскольку у нее есть некоторые проблемы:
- Набор результатов сохраняется в течение всей обработки. Если обработка длится столько же, сколько и получение данных, это означает, что мой набор результатов будет открыт в два раза дольше
- Выполнение другого запроса в моем цикле обработки означает открытие другого результирующего набора, пока я его уже использую, возможно, не стоит начинать открывать слишком много результирующих наборов одновременно.
С другой стороны, у него есть некоторые преимущества:
- У меня никогда не бывает более одной строки данных в памяти для набора результатов, так как мои запросы имеют тенденцию возвращать около 100 тыс. Строк, это может стоить того.
- Поскольку моя структура в значительной степени основана на концепциях функционального программирования, я никогда не полагаюсь на то, что несколько строк находятся в памяти одновременно.
- Запуск обработки первых возвращенных строк, пока ядро базы данных все еще возвращает другие строки, является значительным приростом производительности.
В ответ на Гэндальфа я добавлю еще немного информации:
- Мне всегда придется обрабатывать весь набор результатов
- Я не делаю агрегацию строк
Я интегрируюсь с приложением для управления основными данными и извлекаю данные для того, чтобы либо проверить их, либо экспортировать их в различных форматах (в ERP, на веб-платформу и т. Д.).
1 ответ
Универсального ответа нет. Я лично реализовывал оба решения десятки раз.
Это зависит от того, что для вас важнее: память или сетевой трафик.
Если у вас быстрое сетевое соединение (LAN
) и плохой клиентский компьютер, затем извлекайте данные построчно с сервера.
Если вы работаете над Internet
Тогда вам поможет пакетная загрузка.
Вы можете установить количество предварительных выборок или свойства слоя базы данных и найти золотое сечение.
Правило большого пальца таково: извлекайте все, что можете, не замечая этого
если вам нужен более подробный анализ, то здесь есть шесть факторов:
- Время отклика генерации строк (как скоро
Oracle
генерирует первый ряд / последний ряд) - Время отклика доставки строки / скорость (как скоро вы можете получить первый ряд / последний ряд)
- Время отклика обработки строки / скорость (как скоро вы можете показать первую строку / последнюю строку)
Одним из них будет узкое место.
Как правило, rate
а также responce time
являются антагонистами.
С помощью предварительной выборки вы можете контролировать время отклика доставки строки и скорость доставки строки: чем выше число предварительных выборок, тем выше скорость, но уменьшается время отклика, а меньшее количество предварительных выборок будет противоположным.
Выберите, какой из них важнее для вас.
Вы также можете сделать следующее: создать отдельные потоки для извлечения и обработки.
Выберите только несколько строк, чтобы пользователь был удивлен в режиме низкой предварительной выборки (с большим временем отклика), затем переключитесь в режим высокой предварительной выборки.
Он будет извлекать строки в фоновом режиме, и вы можете обрабатывать их также в фоновом режиме, пока пользователь просматривает первые строки.