2009-05-27 3 views
2

Я работаю над API для запроса сервера базы данных (Oracle в моем случае) для извлечения огромного количества данных. (На самом деле это слой поверх JDBC.)Срок службы SQL-соединения

Созданный мной API пытается максимально ограничить загрузку каждой запрошенной информации в память. Я имею в виду, что я предпочитаю перебирать результирующий набор и обрабатывать возвращенную строку один за другим, а не загружать каждую строку в память и обрабатывать их позже.

Но мне интересно, если это лучшая практика, поскольку она имеет некоторые проблемы:

  • набор результатов сохраняется в течение всей обработки, если обработка до тех пор, как извлечение данных, это означает, что мой результирующий набор будет открыт в два раза длиннее
  • Выполнение другого запроса внутри моего цикла обработки означает открытие другого набора результатов, пока я его уже использую, может быть неплохо начать открывать слишком много результирующих наборов одновременно.

С другой стороны, она имеет некоторые преимущества:

  • Я никогда не иметь более одной строки данных в памяти для набора результатов, так как мои запросы, как правило возвращать около 100k строк, это может стоит того.
  • Поскольку мои рамки в значительной степени основаны на концепциях функционального программирования, я никогда не полагаюсь на несколько строк, находящихся в памяти одновременно.
  • Запуск обработки первых строк, возвращаемых в то время, когда механизм базы данных все еще возвращает другие строки, является отличным повышением производительности.

В ответ на Гэндальф, я добавляю еще немного информации:

  • Я всегда должен буду обрабатывать весь набор результатов
  • Я не делаю какие-либо агрегации строк

Я интегрируюсь с приложением для управления основными данными и получая данные, чтобы либо проверить их, либо экспортировать их в различных форматах (в ERP, на веб-платформу и т. Д.).

+0

Что вы подразумеваете под "SQL server (Oracle)"? – Andomar

+0

Пробовал пояснить, извините за путаницу –

+0

Чтобы оценить преимущества, нам действительно нужно знать больше о том, как вы используете результаты запроса. Будете ли вы всегда обрабатывать весь набор результатов? Вы добавляете значения из каждого результата вместе или любую другую работу по агрегации, которая может быть выполнена в конце базы данных? – Gandalf

ответ

1

Нет универсального ответа. Я лично реализовал оба решения десятки раз.

Это зависит от того, что больше для вас: памяти или сетевого трафика.

Если у вас есть быстрое сетевое подключение (LAN) и плохой клиентский компьютер, а затем извлекайте данные по строкам с сервера.

Если вы работаете над Internet, то выборка партии поможет вам.

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

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

, если вам нужно более подробный анализ, есть шесть факторов, участвующих:

  • Роу поколения Быстродействие время/скорость (как только Oracle генерирует первый ряд/последний ряд)
  • Время доставки ответа/скорость (как скоро вы можете получить f рвая строка/последняя строка)
  • Его время отклика обработки/скоростью (как скоро вы можете показать первую строку/последнюю строку)

Один из них будет узким местом.

Как правило, rate и responce time являются антагонистами.

С предварительной выборкой, можно управлять строки времени отклика доставки и строки скорости доставки: больше количества предвыборки будет увеличить скорость, но уменьшает время отклика, нижний счетчик предвыборки будет делать противоположное.

Выберите, какой из них наиболее важен для вас.

Вы также можете сделать следующее: создать отдельные потоки для извлечения и обработки.

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

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

+0

Основываясь на вашем эмпирическом правиле, я понимаю, что если бы у меня было неограниченное количество памяти, я бы сразу забрал все записи. Но моя проблема с этой опцией заключается в том, что выборка 100k записей требует времени и отсрочит начало обработки этих записей. Получение их один за другим позволяет мне начать обработку по мере того, как записи получаются и ограничивают использование ЦП, поскольку моя обработка фактически происходит между каждой выборкой записей. –

+0

Благодарим вас за предложение провести анализ. Я буду анализировать эти ценности и попытаться принять наилучшее решение. Спасибо за предложения, но мое приложение не ориентировано на пользователя, ориентированное на данные, мне нужно как можно быстрее экспортировать как можно больше данных. –

Смежные вопросы