Оптимизация циклов 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);