现在分页已经有了。但是如果查询的数据量超过10万的话,那么速度就很慢了。
有没有高手可以给点提示,如何解决一下,比如一次查询就差出来一页的数据量,10条,那么翻页就查出来下一个10条,这样速度就提上去了。不知道如何实现,在那里突破;现在的每次翻页都是把数据库里面的全部查询一次,只是显示选择的页而已。

解决方案 »

  1.   

    mysql limit 
    sql2000 top
    oracle rownum
      

  2.   

    http://zhidao.baidu.com/question/70930846.html 百度知道
      

  3.   

    select top页面 ×显示数 where id not in (select top (页面-1) ×显示数)
      

  4.   

    第n页. 每页显示x条
    mysql: SELECT * FROM  USER limit (n - 1) * x, x
    sql2000: SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER);
    oracle: SELECT * FROM (
    SELECT users.*, ROWNUM RN FROM (SELECT * FROM USER) users 
    WHERE ROWNUM < (n * x)
    )
    WHERE RN >= (n - 1) * x
    USER
    id | username | password
    ------------------------
       |          |         
       |          |         
       |          |         
      

  5.   

    hibernate: getSession().createQuery("FROM User").setFirstResult(开始记录数).setMaxResults(每页显示多少条);
      

  6.   

    每次翻页的时候,就去查询一下数据库,给一个查询的范围,比如从21——30条,这个应该很好实现啊~~
    楼主不会是直接把所有的数据全部都load出来了吧~~
      

  7.   

    分页一般有两种 一种就是楼主这样的
    适合于数据量小 并且适合换数据库
    第二种就是每次只查询每页显示的条数
    第二种方法实现的方式有很多 我最喜欢用的就是
    搞一个自定义分页标签 这样每次查询的时候只要直接拿过来
    修改表名等信息 就可以了
    但是自定义标签好像不可以和ajax做集成(数据展示用到ajax)
    至于具体的自定义标签网上一大把
      

  8.   

    我用的是sql2000 ,这个运行的时候说有语法错误;
    java.lang.RuntimeException: Error in [Microsoft][SQLServer 2000 Driver for JDBC]
    [SQLServer]在关键字 'FROM' 附近有语法错误。
      

  9.   

    在企业管理器里面用这个语句执行,也是有错误,就是在第一个 from 附近有错误。
      

  10.   

    我处理过最多的数据时45万条,SqlServer2005 不能使用top  使用top超慢,还不如使用结果集分,
    9楼和10楼 是目前最好的解决办法了
      

  11.   


    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Vector;/**
     * Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.
     * 
     */
    public class Pager {
    /** Used database connection */
    Connection conn = null;
    public Pager() {
    }
    /**
     * 
     * 分页功能, 返回当页的数据(JDBC 2.0 实现).
     * @param currentPage
     * 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)
     * @param pageCount
     * 每页显示记录
     * @return a Vector - 数据列表
     */
    public Vector pageData(int currentPage, int pageCount) {

    Vector results = new Vector();
    String tableName = "table_name";// 要处理的表格名
    ResultSet rs = null;
    String sql = "SELECT * FROM " + tableName;
    Statement stmt = null;
    try {
    // 生成可滚动的结果集表达式
    stmt = conn.createStatement(ResultSet.
    TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_READ_ONLY);
    rs = stmt.executeQuery(sql);
    int count = recordCount(); // 总记录数
    int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数
    if (currentPage <= 0) {
    currentPage = 1;
    }
    // 超出页码范围, 不返回数据
    if (currentPage > totalPage) {
    currentPage = totalPage;
    return results;
    }
    if ((currentPage - 1) * pageCount > 0) {
    // 移动结果集数据到当前页
    rs.absolute((currentPage - 1) * pageCount);
    }
    // rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor
    // position (0) is invalid
    int i = 0; // Readed pages
    while (rs.next() && i < pageCount) {
    i++;
    }
    } catch (Exception exception) {
    System.out.println("Occur a error in " + getClass()
    + ".pageData() : " + exception.getMessage());
    } finally {
    closeJDBCResource(stmt);
    closeJDBCResource(rs);
    closeJDBCResource(conn);
    }
    return results; } /**
     * 
     * 返回当前数据库中记录的总数.
     * @return int 记录总数
     */
    public int recordCount() {
    int allCount = -1;
    String tableName = "table_name";// 要处理的表格名
    String sql = "SELECT COUNT(*) FROM " + tableName;
    ResultSet rs = null;
    Statement stmt = null;
    try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    if (rs.next()) {
    allCount = rs.getInt(1);
    }
    } catch (Exception exception) {
    System.out
    .println("Occur a error in " + getClass()
    + ".recordCount() : " + exception.getMessage());
    } finally {
    closeJDBCResource(stmt);
    closeJDBCResource(rs);
    closeJDBCResource(conn);
    }
    return allCount; } /**
     * Close a jdbc resource, such as ResultSet, Statement, Connection.... All
     * these objects must have a method signature is void close().
     * @param resource -
     * jdbc resouce to close
     * 
     */
    public static void closeJDBCResource(Object resource) {
    try {
    Class clazz = resource.getClass();
    java.lang.reflect.Method method = clazz.getMethod("close", null);
    method.invoke(resource, null);
    } catch (Exception e) {
    e.printStackTrace();
    } }
    /**
     * 
     * Test page.
     * @param args
     * 
     */
    public static void main(String[] args) { // 分页, 读取第一页数据, 共读取5个记录
    Vector data = new Pager().pageData(1, 5);
    // TODO: process value object, 更改类名
    /*
     * for(int i = 0; results != null && i < data.size(); i++) {
     * 
     * ValueObject bean = (ValueObject)data.get(i);
     *  }
     */
    }}
      

  12.   

    假设是User表
    主键是id
    当前要查询第2页, 每页显示5条数据
    sqlserver 环境
    SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER); FROM子句中的n*x 就等于2 * 5 = 10;
    WHERE子句中的(n - 1) * x 就等于(2-1)*5 = 5;
    最后得到的sql(呵呵..不好意思...上面的语法有点问题.)SELECT * FROM (SELECT TOP 10 * FROM user) AS users WHERE users.id NOT IN (SELECT TOP 5 id FROM user); 这里是使用了主键...其实...任何的unique的列都是可以作为WHERE子句中的那个集合条件的....当然..如果你的数据库设计的够规范(主键与业务无关)....那么用主键是最好不过了....毕竟, 其他与业务有关的东西是可能会变更成为非unique的列的.
      

  13.   

    SQL 2000 里面用 top 这个关键字,确实数据量和大的时候也不能较快的执行。
    不过还是谢谢各位的经典回帖。
    谢谢!
      

  14.   

    假如java和sqlserver,只能用top n方式分页,如果是.net与sqlserver,那就可以用数据库分页了,
    top n方式分页,关键是表中 要有一个不重复的数值型字段,一般用主键,有时有些表没有这样的设计,可以加个字段,我通常加个recnum字段(整型,标识为一,自动增量),如条数i,页数n,则语句如下:select top i * from tab where recnum not in (select top (n-1)*i recnum from tab)
    其中的运算主要是recnum整型字段,速度一般很快,即使数据量大负荷也不是很大,占用负荷的主要是“not in”这个运算,但在sqlserver中没有办法。要么换成.net要么换成oracle,它至少每个结果集都有一个隐藏字段--记录数,可以用where rec<n*i and rec>(n-1)*i取得
      

  15.   

    hibernate可以分页,在中数据库也可以分页
      

  16.   

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
      

  17.   

    分页技术有三种,一种是用sql语句 ,但速度慢不过容易理解,第二种是存储过程来做,速度快,第三种是用分页的插件来做
    下面的是第一种方法,可用来参考:pageRow:当前的行数,pageNum当前的行数的页数
    public List<Topicsinfo>cutPage(String pageRow,String mid,String pageNum)
    {
    String sql="select top "+pageRow+"  * from topicsinfo where modid="+mid+" and topid not in(select top "
    +(Integer.parseInt(pageNum)-1)*Integer.parseInt(pageRow)+" topid from topicsinfo where modid="+mid+")";
    return RunSeal.query(Topicsinfo.class, sql);
    }