直接在客户端上查询速度很快,但是到了代码中速度慢了很多,数据量在100万左右
这是查询代码:
List<String> result = new ArrayList<>();
String sql = "SELECT * FROM (SELECT KEYWORDS FROM KEYWORD_PERSONAL_HEAT WHERE USER_ID = '"+userId+"' AND KEYWORDS LIKE '%"+keyword+"%' GROUP BY KEYWORDS ORDER BY max(TIMES) DESC) WHERE ROWNUM <="+rowNum;
List<Map> searchResult = JdbcUtils.findBySql(this.getEntityManager(), sql);
for(Map map:searchResult){
result.add((String) map.get("KEYWORDS"));
}
这是底层查询代码:
public static List<Map> findBySql(EntityManager entityManager,String sql){
List<Map> result=new ArrayList<Map>();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
conn=openConn(entityManager);
pstmt=openPstmt(conn,sql);
ResultSetMetaData rsmd=pstmt.getMetaData();
rs=openRs(pstmt);
while(rs.next()){
Map data=new HashMap();
for(int i=1;i<=rsmd.getColumnCount();i++){
String columnName=rsmd.getColumnName(i);
data.put(columnName,rs.getObject(columnName));
}
result.add(data);
}
}catch (SQLException e){
e.printStackTrace();
}finally {
closeConn(rs,pstmt,conn);
}
return result;
}
大数据量的一次性全部查询出来本来就很慢.客户端查询快,那是因为一般客户端都是做了分页或者说条数限制的,不知道你用的什么工具,Navicat和DataGrip,pl/sql都是这样的,不过你可以设置一下fetchSize,会有大幅度的提高,但是该慢还是慢
pstmt.setFetchSize(500);
,明显是要从业务上做优化,哪有一次性加载100W的需求