StringBuffer query = new StringBuffer();
query.append("select * from(");
query.append(
" select c.APP_OID,c.APP_USER_OID,c.APP_DEPT_NO,c.APP_USER_ID,c.APP_USER_CN,c.APP_DEPT,c.APP_DATE,c.APP_STATUS,c.APP_RECEIPT_CTX,c.PLAN_YEAR,row_number() ");
query.append(" over (order by PLAN_YEAR desc,APP_DEPT_NO ) R ");
query.append(" from ws_app_plan c where 1=1 "+ param +")");
query.append(" where R> " + (rollPage.getCurPage() - 1) * rollPage.getPerPageSize());
query.append(" and R<= " + rollPage.getCurPage() * rollPage.getPerPageSize());阿扁如上代码;现客户那边每次查询都要大概半分钟。。请问如何优化该SQL。。
query.append("select * from(");
query.append(
" select c.APP_OID,c.APP_USER_OID,c.APP_DEPT_NO,c.APP_USER_ID,c.APP_USER_CN,c.APP_DEPT,c.APP_DATE,c.APP_STATUS,c.APP_RECEIPT_CTX,c.PLAN_YEAR,row_number() ");
query.append(" over (order by PLAN_YEAR desc,APP_DEPT_NO ) R ");
query.append(" from ws_app_plan c where 1=1 "+ param +")");
query.append(" where R> " + (rollPage.getCurPage() - 1) * rollPage.getPerPageSize());
query.append(" and R<= " + rollPage.getCurPage() * rollPage.getPerPageSize());阿扁如上代码;现客户那边每次查询都要大概半分钟。。请问如何优化该SQL。。
解决方案 »
- 为什么要选用开发平台
- struts2处理1个form多个submit的问题,急!
- 一道算法题
- org.apache.jasper.JasperException: Unable to load class for JSP是什么原因请帮帮忙!
- myeclipse6.0中输入字符时弹出关键字功能
- 谁做过JBOSS3的配置
- 到那里去弄javax.ejb.EJBObject这个包啊!!
- maven工程pom问题
- java新手,学习的时候遇见的一些问题,求大神帮忙解答
- SpringMVC+mybatis+mysql 执行sql语句太慢的问题
- linux下安装tomcat的问题
- 关于Struts2 迭代标签迭代List
是不是数据量太大,没有索引的问题?
public static Map getList(int pageSize,int currentPage){
String sql="select * from person";
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Map result=null;
List list=null;
Person p=null;
try{
conn=DBAccess.getConnection();
result=new HashMap();
list=new ArrayList();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
if((currentPage-1)*pageSize!=0)
rs.absolute((currentPage-1)*pageSize);
int i=0;
while(rs.next()&&i++<pageSize){
p=new Person();
p.setId(rs.getString("id"));
p.setName(rs.getString("name"));
p.setSex(rs.getString("sex"));
p.setAge(Integer.parseInt(rs.getString("age")));
list.add(p);
}
result.put("list", list);
rs.close();
ps.close();
sql="select count(*) from person";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery(sql);
if(rs.next()){
result.put("tatalcount", rs.getInt(1));
}
rs.close();
ps.close();
conn.close();
}catch(Exception e){
e.printStackTrace();
}
return result;
}
给你个例子启发下SELECT x.*
from (SELECT z.*, rownum numbers
from pro_dowload_doc_log z
where rownum <= 10000) x
where x.numbers > 0;/*第二页的记录*/SELECT x.*
from (SELECT z.*, rownum numbers
from arc_pro_dowload_doc_log z
where rownum <= 2 * 10000) x
where x.numbers > 1 * 10000;
我用上面的方法,使用JDBC的方法获取10万条的数据没有问题。
oracle 的demo里有个sales表,一百八十多万的销售数据吧
建立了索引还分了区
差最后几页还是很慢
毕竟
rownum是根据结果集的数量计算的,也就是说查最有一页数据会把这个表的所有数据扫描一遍
rownum的分页算法不适合大数据量。我们早就做个测试。当数据量较大时,查询最后几页的时间每页都等同于查询所有数据的时间。
你直接将页码的参数传入SQL语句中执行查询返回ResultSet就行了。
from (SELECT z.*, rownum numbers
from pro_dowload_doc_log z
where rownum <= i*onePageNum) x
where x.numbers > (i-1) * onePageNum;
i:是传入的页码数值。
onePageNum:是设置一页显示的记录数量。