Есть ли способ загрузить результат запроса в память? - PullRequest
0 голосов
/ 29 июля 2011

У меня огромная база данных (строка 2,1 миллиарда), и мне нужно выполнить некоторые вычисления, чтобы извлечь некоторые статистические результаты.Насколько я понимаю, очевидно, что не стоит проводить вычисления непосредственно в этой базе данных.

Сейчас я пытаюсь загрузить часть таблицы в память (например, 1 миллион строк).Я не уверен, как загрузить весь фрагмент данных ResultSet в память, не перебирая строку за строкой.

Есть идеи?

Ответы [ 5 ]

7 голосов
/ 29 июля 2011

очевидно, что неразумно выполнять вычисления непосредственно в этой базе данных

Напротив, весьма вероятно, что выполнение этого в базе данных - самый мудрый способЭто.Базы данных созданы именно для обработки огромных объемов данных.Если вы можете выразить свои вычисления в виде SQL-запроса, база данных определит, как их эффективно выполнять.В целом, это будет сделано намного быстрее, чем если бы вы загрузили все данные в память и обработали их самостоятельно.

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

0 голосов
/ 30 июля 2011

То, что вы хотите сделать, называется OLAP (Online Analytical Processing) .Многие СУБД имеют богатый набор функций для таких функций, в частности, для расчета, например, Oracle Analytic Functions.Если вычисление не может быть выполнено в одном запросе SQL, вы можете написать хранимые процедуры, выполняющие эту работу за вас.

Но, пожалуйста, не загружайте терабайты данных из какой-либо базы данных, просто сделайте некоторые вычисления, которые можносделано в хранилище данных напрямую.Зачем?Вы будете использовать 99% времени для загрузки и передачи данных и 1% для расчета.

0 голосов
/ 29 июля 2011

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

0 голосов
/ 29 июля 2011

Я согласен с предыдущими ответами, что нехорошо загружать такое количество в память.Но, отвечая на ваш вопрос, есть класс для автономного представления ResultSet: javax.sql.RowSet

0 голосов
/ 29 июля 2011

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

...