1- oracle 数据库
2- 上百万条数据,商品编号做主键  数据库表中已经排序好了,但是,并不连续!!! 并不是连续的, 比如:1  2  3  5  7   8   11   13  20  26  我说的就是这意思。
3- Web程序, 在网页上用GridView 分页, 每页约20条记录现在的问题是,如果选择“下一页” 读取数据没有问题, 但是如果选择指定的页, 或者 向前,向后  条制定的页数 就在逻辑上出现问题了。
因为不是连续的,在读取下一页的时候可以知道当前页的最后一条纪录的编号,然后读取后面的20条记录没有问题, 但如果跳页。比如跳8页,那样的话,就不知道要从哪一条记录开始读取了。自己虽然知道 跳8页  就是跳160条记录,但由于 主键的编号是不连续的, 根本不知道要从哪个地方读取啊!
小弟初来csdn 没多少分 就全给了好了!

解决方案 »

  1.   

    分页的时候不按照 商品编号做主键,
    取rownum来排序(先order  by,再取rownum就不会乱了)
      

  2.   

    public static String addLimitOffset(String argStatement, int argListSize, int argNowPage) { String newStatement = ""; int limit = argListSize;
    int offset = 0;
    if (argNowPage > 0) {
    offset = (argNowPage - 1) * argListSize;
    } String newWhereStatement = "";
    if (offset > 0) {
    int iLimit  = offset + limit;
    int iOffset = offset + 1;
    newWhereStatement = " WHERE line BETWEEN " + String.valueOf(iOffset) + " AND " + String.valueOf(iLimit);  } else {
    newWhereStatement = " WHERE line <= " + String.valueOf(limit);
    } newStatement =
    "SELECT * FROM (" +
    "SELECT t1.*, rownum line FROM (" +
    argStatement +
    " ) t1 )" +
    newWhereStatement; return newStatement;
      }
    在sql语句的末尾调用此函数,argStatement:你写的sql语句,argListSize:每页要显示的纪录条数,argNowPage:要显示页的页码号
      

  3.   

    如果  我现在要取出来的数据是这样的:   在Web页面显示的数据是经过筛选的,   我想在一个有上百万条记录的表中查找符合条件的纪录,然后做分页。 这样,怎样才能提高效率? 
    比如, 把商品的产地作为查询条件,查询产自欧洲的产品  在页面上显示,这样怎么进行分页才能提高效率呢?
      

  4.   


    先根据你的商品产地ORDER BY 然后再取ROWNUM 如二楼所说.
      

  5.   

    什么条件都不需要考虑,你的sql如下select t.*,rownum rn from table t where xxx order by XXX,--必须有排序
    select * from (
    select * from (select t.*,rownum rn from table t where xxx order by XXX)
    where rn<=...)--数字需要你计算
    where rn>...--数字需要你计算