Sql возвращает 3 миллиона записей и исключение JVM вне памяти - PullRequest
0 голосов
/ 20 января 2010

Я подключаю oracle db через Java-программу. Проблема в том, что я получаю исключение Outofmemeory, потому что sql возвращает 3 миллиона записей. По какой-то причине я не могу увеличить размер кучи JVM.

Какое лучшее решение для решения этой проблемы?

Единственный вариант - запустить sql с LIMIT?

Ответы [ 9 ]

3 голосов
/ 20 января 2010

Если вашей программе нужно возвращать 3 млн записей одновременно, вы делаете что-то не так. Что нужно сделать, чтобы обрабатывать 3 млн. Записей одновременно?

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

2 голосов
/ 20 января 2010

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

Использование LIMIT является одним из решений, но лучшим решением будет реструктуризация базы данных и приложения, чтобы вы могли получать «более умные» запросы, которые не возвращают все за один раз. Например, вы можете вернуть записи на основе столбца даты. Таким образом, вы можете получить самые последние из них.

1 голос
/ 20 января 2010

Если каждая запись составляет около 1 килобайта, что означает 3 ГБ данных, есть ли у вас такой объем памяти для вашего приложения?

Должно быть лучше, если вы объясните «настоящую» проблему, поскольку OutOfMemory не является вашей реальной проблемой.

1 голос
/ 20 января 2010

Масштабирование приложений всегда является проблемой.Решение здесь будет делать все, что вы пытаетесь сделать в Java в качестве хранимой процедуры в Oracle PL / SQL.Позвольте oracle обрабатывать данные и использовать внутренние планировщики запросов, чтобы ограничить объем данных, поступающих на выход и, возможно, приводящих к большим задержкам.

Вы даже можете написать хранимую процедуру на Java .

Вторым решением будет действительно сделать ограниченный запрос и обработку из нескольких узлов Java и сопоставить результаты.Посмотрите на карту-уменьшить.

0 голосов
/ 20 января 2010

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

0 голосов
/ 20 января 2010

Только для справки. В запросах Oracle LIMIT равно ROWNUM

Например, ... WHERE ROWNUM<=1000

0 голосов
/ 20 января 2010

пересмотреть пункт «где».посмотрим, сможете ли вы сделать это более ограничительным.и / или ограничение использования

0 голосов
/ 20 января 2010

Возможны три варианта решения. 1. Если одновременное получение 3 миллионов записей не требуется. Используйте LIMIT

  1. Рассмотрите возможность использования значимого , где предложение

  2. Экспорт записей базы данных в формат txt или csv или в формате Excel с помощью инструмента, предоставляемого Oracle, и использование этого файла для вашего использования ..

Приветствия: -)

0 голосов
/ 20 января 2010

Попробуйте это:

http://w3schools.com/sql/sql_where.asp

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