2015-12-11 4 views
0

У меня есть большой объем данных, и мне нужно обработать их по группам. Наличие на картинке: enter image description hereПолучить строки по группам MySQL Java

Как получить их по группам? (Сначала получите группу 1, процесс. Затем получите группу 2, процесс .. и т. Д.). Группировка основана на столбце pos, который должен быть равен.

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

+0

Используйте ограничение и смещение. Чтобы вы могли получить необходимое количество записей. Затем вы можете обработать его без OutOfMemoryError. – Aravind

+0

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

ответ

1

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

//Assuming you have a Connection conn; 
PreparedStatement groupsPS = 
    conn.prepareStatement("SELECT distinct pos from yourtable"); 
ResultSet groupsRS = groupsPS.executeQuery(); 
PreparedStatement groupdataPS = 
    conn.prepareStatement("SELECT * from yourtable where pos = ?"); 
ResultSet groupdataRS = null; 

while(groupsRS.next()) 
{ 
    groupdataPS.setString(1, groupsRS.getString("pos")); 
    groupdataRS = groupdataPS.executeQuery(); 
    while(groupsRS.next()) 
    { 
     //process your data here 
    } 
    groupdataRS.close(); 
} 
groupsRS.close(); 
groupdataPS.close(); 
groupsPS.close(); 
+0

Поскольку логика в порядке, это фактически вызывает проблему выбора n + 1, что делает ее очень медленной. – BetaRide

+0

@BetaRide Если нет индекса на 'pos', действительно. OP не хотел скорости, однако, он хотел меньше кусков результата. Давайте не будем забывать, что ему также понадобится упорядочить столбец 'pos', чтобы обрабатывать все по группе в одном запросе, что, в свою очередь, может замедлить все. – Timekiller

+0

Я основал свои недавно реструктурированные таблицы в вашем алгоритме и использовал таблицу индексирования для решения моей проблемы. Спасибо! – user3286528

1

У вас есть два варианта:

  1. перепишите SQL, чтобы убедиться, что вы получите меньшие результирующих и прочитать все данные в джонки.
  2. Используйте прокручиваемыйРезультаты. Это позволяет получить строку за строкой, не загружая весь набор результатов в память.
+0

Вы уверены, что прокручиваемый набор результатов не позволяет MySQL JDBC загружать весь результат в память? Я не мог найти что-либо релевантное в документах, и решения проблемы с памятью, например, в http://stackoverflow.com/questions/2095490, вместо этого предлагают использовать ResultSet.TYPE_FORWARD_ONLY, тогда как прокручиваемый набор результатов подразумевает TYPE_SCROLL_INSENSITIVE. – Timekiller

+0

Да, принятый ответ на связанный вопрос четко указывает, как работать с MySql и прокручивать результирующие наборы. – BetaRide

+0

Я следил за нашей опцией №1 и менял свои таблицы. Я написал ответ в этой теме. Спасибо! – user3286528

0

Так же, как то, что упомянуто @TimeKiller и @BetaRide, я перестроенный мои таблицы SQL и добавил таблицу индексации для моих поз с его частотой в другой колонке.

Используя это, можно просто итерацию через каждые поз с частотой> = 2, получают строки в таблице выше с выбранными поз, и обрабатывать их.

Спасибо!

+0

Хорошо, что он работает на вас.Если вы хотите ускорить выбор, вы должны использовать [фактический индекс] (https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html); также, пожалуйста, примите любой из трех ответов. – Timekiller

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