2000w的大表
表结构如下,其中id是索引
查询处理慢的写法
List<String> queryLoidForPage(Integer startNum,Integer endNum){
try {
Connection oracleConnection = initBean.oracleConnection;
Statement stmt = oracleConnection.createStatement();
// 4.执行查询
long l = System.currentTimeMillis();
ResultSet rs = stmt.executeQuery("SELECT username FROM LOID_TABLE_ID where id BETWEEN "+startNum+" and "+endNum);
System.out.println("查询耗时:"+(System.currentTimeMillis()-l));
List<String> loids = new ArrayList<>();
// 5.处理结果集
System.out.println("开始处理结果集");
long l1 = System.currentTimeMillis();
while(rs.next()){
loids.add(rs.getString("username"));
}
System.out.println("处理结果集耗时:"+(System.currentTimeMillis()-l1));
return loids;
}catch (Exception e){
e.printStackTrace();
return new ArrayList<>();
}
}
开始查询0到10000条数据
查询耗时:79
开始处理结果集
处理结果集耗时:35988
结束查询0到10000条数据,耗时:36101
开始查询10000到20000条数据
查询耗时:36
开始处理结果集
处理结果集耗时:35910
结束查询10000到20000条数据,耗时:35946
10000条记录查询出来到处理好要35秒左右
查询处理快的写法
List<String> queryLoidForPage(Integer startNum,Integer endNum){
try {
Connection oracleConnection = initBean.oracleConnection;
PreparedStatement pstmt = oracleConnection.prepareStatement("SELECT username FROM LOID_TABLE_ID WHERE id BETWEEN ? AND ?");
// 设置查询参数
pstmt.setInt(1, startNum);
pstmt.setInt(2, endNum);
// 设置 fetch size 以提高查询效率 根据实际情况调整 fetch size
pstmt.setFetchSize(1000);
// 4.执行查询
long l = System.currentTimeMillis();
ResultSet rs = pstmt.executeQuery();
System.out.println("查询耗时:"+(System.currentTimeMillis()-l));
List<String> loids = new ArrayList<>();
// 5.处理结果集
System.out.println("开始处理结果集");
long l1 = System.currentTimeMillis();
while(rs.next()){
loids.add(rs.getString("username"));
}
System.out.println("处理结果集耗时:"+(System.currentTimeMillis()-l1));
return loids;
}catch (Exception e){
e.printStackTrace();
return new ArrayList<>();
}
}
开始查询0到10000条数据
查询耗时:85
开始处理结果集
处理结果集耗时:370
结束查询0到10000条数据,耗时:498
开始查询10000到20000条数据
查询耗时:37
开始处理结果集
处理结果集耗时:370
结束查询10000到20000条数据,耗时:407
开始查询20000到30000条数据
查询耗时:36
开始处理结果集
处理结果集耗时:365
结束查询20000到30000条数据,耗时:403
10000条记录查询加处理400毫秒
总结:尽量使用预处理查询,设置fetch size,即pstmt.setFetchSize(1000)