Оптимизация циклов Java и SQL

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

Я уверен, что SQL-оператор, выполняемый в цикле на каждой итерации, замедляет работу.

Медленный код с повторяющимся SQL-оператором в цикле

startTime = System.nanoTime();
int id;
String phone;
for (int i = 0; i < studentCount; i++) {
    rs.next();
    String name;
    id = Integer.parseInt(rs.getString(1));
    String middleInitial = rs.getString(3);
    if (middleInitial == null){
        name = rs.getString(2) + " " + rs.getString(4);
    }
    else
        name = rs.getString(2) + " " + middleInitial + " " + rs.getString(4);
    sql = "select parent1mobilephone, parent1workphone from tblParent where id = " + id;
    rs2 = st2.executeQuery(sql);
    rs2.next();
    phone = rs2.getString(1).length() == 12 ? rs2.getString(1) : rs2.getString(2);
    rs2.close();
    DirectoryBoxesPanel.add(new DirectoryBoxes(name, id, phone, selection));    
}
endTime = System.nanoTime();
duration = (endTime - startTime);
System.out.println("For LOOP: " + duration/1000000L);     

Быстрее незавершенного кода

startTime = System.nanoTime();
int id;
String phone;
sql = "select parent1mobilephone, parent1workphone from tblParent ORDER by FIRST TABLE";
rs2 = st2.executeQuery(sql);
for (int i = 0; i < studentCount; i++) {
    rs.next();
    String name;
    id = Integer.parseInt(rs.getString(1));
    String middleInitial = rs.getString(3);
    if (middleInitial == null){
        name = rs.getString(2) + " " + rs.getString(4);
    }
    else
        name = rs.getString(2) + " " + middleInitial + " " + rs.getString(4);
    rs2.next();
    phone = rs2.getString(1).length() == 12 ? rs2.getString(1) : rs2.getString(2);
    DirectoryBoxesPanel.add(new DirectoryBoxes(name, id, phone, selection));    
}
endTime = System.nanoTime();
duration = (endTime - startTime);
System.out.println("For LOOP: " + duration/1000000L);     

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

1 ответ

Решение

Я предполагаю, что ваш ResultSet rs основан на SQL-выражении, которое выглядит следующим образом (здесь мы видим все в темноте из-за полного отсутствия деталей в вопросе):

sql = "select id, first_name, middle_initial, last_name from tblStudents";

Ваш код станет НАМНОГО быстрее, если вы получите данные из tblParent в том же запросе, как (опять же, ослеп на структуру таблицы):

sql = "select s.id, s.first_name, s.middle_initial, s.last_name " +
      "       p.parent1mobilephone, parent1workphone " +
      "from tblStudents s join tblParents p on p.student_id = s.id " +
      "order by s.last_name";

Ваш код Java становится простым циклом над ResultSet:

startTime = System.nanoTime();
rs = ...;
while rs.next() {
    integer id = rs.getInt(1));
    String middleInitial = rs.getString(3);
    if (middleInitial == null) {
        String name = rs.getString(2) + " " + rs.getString(4);
    } else {
        String name = rs.getString(2) + " " + middleInitial + " " + rs.getString(4);
    }
    String phone = rs.getString(5).length() == 12 ? rs.getString(5) : rs.getString(6);
    DirectoryBoxesPanel.add(new DirectoryBoxes(name, id, phone, selection));    
}
endTime = System.nanoTime();
duration = (endTime - startTime);
System.out.println("For LOOP: " + duration/1000000L);
Другие вопросы по тегам