有人说要分页查询,但要如何解决,另会对我在查询结果集中还有一个过滤功能有影响

解决方案 »

  1.   

    用ClientDataSet1.PacketRecords:=50;看看
      

  2.   

    ClientDataSet1,好像应用于三层的。我用的是两层架构
      

  3.   

    那就用这个SimpleDataSet1.PacketRecords:=50;
      

  4.   

    双击他->输入用户名,密码,数据库名称 就ok了
      

  5.   

    同意aiirii(ari-求职广州中) 的说法,不能全部提到前台来,应该有效的提取检索信息,分两次或多次提取,每次提取的内容从简到细。
      

  6.   

    dbexpress,我看到过这种效果不错,但是自己没有亲自用过啊!~
      

  7.   

    军哥说的对呀,对于我们coder来说应该从优化查询来做吧!建索引是好的做法! :)
      

  8.   

    应该分页,ADO本身就有分页功能!
      

  9.   

    分页显示;过滤功能就别用组件的,直接用sql 去查
      

  10.   

    要是在SQL查询分析器中也很慢,就是数据库设计上有问题,建议拆分表。
    如果是delphi中慢,建议取数的时候,把对应的大字段去掉,千万别用select * from ...,C/S结构按道理应该不慢的。
      

  11.   

    这个问题的关键应该在于一次性提取内容之后,在客户端内存当中的存储的瓶颈。不信可以试一下,其实查询几十万记录,如果没有特别复杂的过滤条件的话,这速度超快,问题在于传输这几十万记录需要一定网络延迟,并且这个延迟在大数据量的情况下还是挺可观的。另外就是当你检索到如此大量数据之后,你可以监视客户端的内存利用率,此时会大大提升对内存的消耗,就算在大内存的服务器,以及SCIS硬盘,也会很吃力。所以我们一个是对索引进行优化,这种优化的复杂度可大可小,若能根据常用性进行优化最好。另外就是前面所进到的使用分包进行索引例Top 100,当然这需要关键字的支持。也就是当需要提取第101~200的记录时,那么就需要再加条件,比如现在是以uid顺序索引的,那么就可以如此写select top 100 * from tablename where uid>前面第100笔的uid
      

  12.   

    这个问题的关键应该在于一次性提取内容之后,在客户端内存当中的存储的瓶颈。
    我这个表其实是一个基础资料表tProduct ,关键字为ID (int) 并建立了索引
    我在客户端,是做一个select * from tProduct 也就是一次性把所有记录提取到前端,进行增加,编辑,查询。。这样子,提取大量数据,就会感觉延迟时间长。。
    有没有解决方案呢。
      

  13.   

    解决的方案,其一是将数据表项(字段)切表,把非常用的再建立一个关联表,以减轻这种常用性表检索带给数据库的资源压力,其二,不管你现在是需要做什么操作,也没有必要将所有资源一次性提取到前端,而是分批处理。不管是C/S还是B/S,现在大家都提倡使用nTier架构,也就是实行瘦客户机的,运行模式,这里面的种种就不多说了,那么现在问题就是这个瘦客户机,就不应该对其性能要求过高。
    我们做个假设,我现在有一个料品基本资料表,里面有N多个字段,但是我的关键字段就只有料号、版别和料品分类,那么我们提取资料时就只提取这三个字段,至于其它如品名呀,规格呀,就要需要显示到用户界面时再提取,这不就方便多了。一个料号算你编码20位,版别5位,分类5位,也才30位,就算是30W笔也不到10MB的数据,这样子内存还会成为很大瓶颈么?而这其中还可以进行分化,比如某个用户要操作之前先让他选分类,那么就只限该分类的料品,这时候就远远少于30W笔,而这当中又可以再次分段,例如,某某现在需要修改数据,既然需要修改,那么肯定就会知道是什么料品吧,那就一次提取100笔,显示在一个选框当中,此时对于用户来于,是不是相当于有着全部被列出来的假象,他如何翻系统就如何按照索引进行增强性检索,也就是比如他往后翻一页,假定最多给他保留三页信息的话,就可以把前面多余的内存占用释放,这种动态的检索方式,对于用户看来始终都是实时连续的。
      

  14.   

    User Interface             Application Memory Data
    Fist page                  Page          Data(ID)
    --------------------        1            001..100
    1                           2            101..200
    ...                         3            201..300
    100
    --------------------
    Next Page
    --------------------        No Changed
    101
    ...
    200
    --------------------
    Next Item
    --------------------       1            002..101
    102                        2            102..201
    ...                        3            202..301
    201
    --------------------
    Last
    -------------------        1            299701..299800
    299901                     2            299801..299900
    ...                        3            299901..300000
    300000
    -------------------
    ...
      

  15.   

    当然不能对这样的表的数据都拿到客户端来进行操作.
    我通常的做法是:
    只取一部分的数据到客户端,"select * from tProduct where ..." 
    要查询的时候,把条件传到服务端执行,把结果记录再传回客户端.(只把合要求的记录传回).
    新增的时候,不是直接在客户端把记录加到表(DataSet)里,是把新增的记录传回到服务端,进行操作(如唯一性的校验),没错误后,才加到数据表里,然后再把新增的记录传回客户端.
    删除及编辑的操作雷同.
      

  16.   

    用TADOQuery.CursorLocation = clUseServer试试?
    按这个属性的设计说明,应该是使用dbserver里的游标,每次只返回一条记录给客户端。
    没有测试过,我好像在用这个属性时,发现它不能使用Transcation了,不知为什么