有20w数据
然后用datagrid自动分页我试了一下,比如查询出来结果,如select * from company where name like '%深圳%'
然后有4000多条,查出来,datagrid自己分页,我试了,速度还可以接受,不慢当然,全部数据的时候,分页就相当慢了,所以我考虑其实一般也不可能去拿20w一块分页
所以我用查询 select top 500 from company order by id
但是,就是这500条,分页就很慢,不知道怎么回事??我改成top 300还是慢,不知道datagrid是怎么处理的啊??
有没有什么好办法,马上要给别人交东西了?

解决方案 »

  1.   

    public DataSet GetBooksList(int startIndex, int recordNum, string Keyword)
    {
    Open();
    DataSet myDS = new DataSet();
    string sqlStr = "Select * From V_STY_LIBRARY_BOOKS Where (TYPE_NAME Like '%"+Keyword+"%') Or (NAME Like '%"+Keyword+"%') Or (AUTHORS Like '%"+Keyword+"%') Or (PUBLISHER Like '%"+Keyword+"%') Or (EXPLAIN Like '%"+Keyword+"%')";
    myAdapter = new OleDbDataAdapter(sqlStr, conn);
    myAdapter.Fill(myDS, startIndex, recordNum, "Books");
    Close();
    conn = null;
    myAdapter = null;
    return myDS;
    }
    如上,因为DataSet是存在于内存中的,所以你选出数据后不要一下都填充到DataSet里面而是分段添加,startIndex是记录起始位置,recordNum是数量,上面的代码在3000多条数据,每页10条,没有任何问题。
      

  2.   

    我用select top 50 from company order by id,就是不分页了
    它也还是慢,是不是acess的什么问题呢?但是我在access里面,新建查询,然后执行各种select语句,它都挺快的
    为什么,在web里面就这么慢呢?
      

  3.   

    4000多条查出来都不觉得慢,你就丝毫不应该怀疑datagrid分页的问题了!看看你的id是否是索引键。
      

  4.   

    我用select top 50 from company order by id,就是不分页了
    它也还是慢,是不是acess的什么问题呢?
    =======================================================
    你的数据表建立主键或索引了吗?如果是这样,那就得在查询优化上多下点工夫了。
      

  5.   

    但是,我用select top 50 from company order by id,还是慢啊
    我一页就是50条,这样其实已经没有分页了,但是还是慢最早主要是图省事,因为数据只有1w,而且局域网用,所以没有什么问题现在要改改给其他人用,但是数据多了,就出问题了
      

  6.   

    我就是id这列建的主键,不过查询,其实并不固定查那个字段,所以其他索引就没有建了但是我不解的是select * from company where name like '%深圳%' order by id
    这样结果是有4000多条,这样不慢啊但是,我用select top 50 * from company order by id
    就慢得很明显了,实在不能理解,呵呵
      

  7.   

    哦,我用的是select * from company where name like '%深圳%' order by name查深圳然后by id我我还没试,难道是这个问题?
      

  8.   

    order by id在4000条的时候,如果每条记录短,那么也不过只需要读入几十个磁盘块,占用几兆内存查找排序。但是读入20w记录到内存里排序,你的内存不够大,需要动用磁盘交换内存块。access与SQL Server不同。access基于文件服务器系统的设计思想,大量依赖内存。如果你建立的索引,那么只有索引所在磁盘块被读入内存,量少多了。
      

  9.   

    http://xml.sz.luohuedu.net/xml/ShowDetail.asp?id=108B1516-53CE-4357-B061-17295AF9689F
      

  10.   

    我在id上面建了主键,索引也就有了但是我用select top 50 * from company order by id,就很慢我在另外一个最后更新时间上也见索引,然后用top 50 order by lastupdate来查,还是慢
    我现在这个问题感觉和索引没啥关系了而且,我比较奇怪的是,如果在acces里面,在你建一个查询的时候
    这个时候可以相当于测试select语句吧
    这个时候我用select top 50 * from company order by id,或者top500都很快
    所以我觉得20w也不是很多,只是不知道问题出在哪儿
      

  11.   

    jimmyzhu25,谢谢不过我现在不是分页的问题了,不分页也很慢我用select top 50 * from company order by id,就很慢但是我在1w左右总数据的时候就没有问题
    所以肯定和数据总量还是有关系,只是我不清楚为什么我在access里面查询就很快
    用asp.net来就很慢了
      

  12.   

    select top 50 * into company in 'c:\template.mdb' from company order by id
    然后:
    select * from company in 'c:\template.mdb'
    试试。有五六年没用access了,可能in语法有点问题。你自己查一下联机帮助。“in”的意思是另外一个数据库。
      

  13.   

    我想主要是数据库方面的问题.
    如果你有条件,你可在SQLSERVER里面建立一个完全相同的表及数据,然后用完全相同的SQL语句进行测试,SQLSERVER里面应该不会出现类似问题.
      

  14.   

    你在asp.net中又不是使用access数据库操作环境所用的引擎程序,他们只是公用同一数据文件而已。所以,如果你开发单机程序,使用ADO(注意不是DAO也不是ADO.net),才会快,即使在少量数据下也至少快近一倍。问题是ADO功能弱,网络应用不合理,多用户环境下随时会毁坏数据库,几乎被淘汰了。
      

  15.   

    对不起,上面名词搞反了。Access默认的引擎程序是 DAO,不是ADO、RDO、ADO.net。
      

  16.   

    手工分页
    用DataReader而不用DataSet,因为一般分页的数据只读
      

  17.   

    嗯,好的,我用sqlserver试过了只要建了索引,就快,但是access我再研究一下,毕竟换数据库也比较麻烦
      

  18.   

    这个已经不是分页的问题了,也不是用DataReader而不用DataSet的问题基本上感觉,我用select top 50 * from company order by id,这种,不分页,就非常慢但是只要加上条件,比如select top 50 * from company where name like '%深圳%' order by id
    就快了,哪怕是用select * from company where name like '%深圳%' order by id
    结果出来有4000多条,然后用datagrid自己的分页
    也非常快唉,郁闷啊
      

  19.   

    你可以这样尝试一下
    select top 50 * from company where 1=1 order by id
    后面加个无谓的条件,看看会不会有变化?如果可以那就简单多了.