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);
我正在从人员数据库中获取一个结果集并按姓氏对他们进行排序。我还有一个 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);