Java 和 sql 循环优化

Java and sql loop optimization

我正在从人员数据库中获取一个结果集并按姓氏对他们进行排序。我还有一个 table 其他人与另一个 table 相关,但是因为我想不出一种方法来按照第一个 ID 的顺序对第二个 table 进行排序,我被迫在循环中每次都执行引用当前 id 的语句。

我肯定 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);     

我能想到的让这个速度更快的唯一其他方法是将两个 table 合二为一,但我不知道我是否想求助于它。

我假设你的 ResultSet rs 是基于这样的 SQL 陈述(由于问题完全缺乏细节,这里完全在黑暗中摸索):

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

如果您在同一查询中从 tblParent 中检索详细信息,您的代码将变得 MUCH 更快,例如(再次,在 table 上失明结构):

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);