用ClientDataset连接一50万记录的TABLE,程序在激活时(ClientDataset.Active:=True)怎么会这么慢??(100分)

  • 主题发起人 主题发起人 dedema
  • 开始时间 开始时间
D

dedema

Unregistered / Unconfirmed
GUEST, unregistred user!
用ClientDataset连接DcomConection且对应服务应用程序的Providerset(对应AdoTable,此表有近50万条记录).第一次激活此控件时ClientDataset.Active:=True
会等待十几秒钟,实在让人受不了。不知大家有没有办法将其速度提快?
 
才十几秒!已经算是快的了
为什么一次性要将表中所有数据都抓出来,应该用SQL将要用到的数据取出来嘛
如果是ADO的话,也可采用异步模式来提一点速度了
 
取这么多数据给谁看?
 
你可尝试使用无状态方式取数据,要知道取1000条和取50万条是两个概念.
 
你取来了所有的数据,当然慢了,看看ClientDataSet的属性
 
设置客户端的DataSet的PacketRecord数量,不要为-1,(表示将数据库中的数据一次传到客户端,肯定慢)
设为一个合适的大小,如50~100等。指定一次传输的数据条数。
 
(1)设置ClientDataSet的PackerRecord为一个理想值,不必把所有数据都load过来
(2)在select 的时候加条件,如select top 50 * from table1;只返回前50条,然后找出
最后一条记录的ID,假设为lastid,下一屏时select top 50 * from table1 whee id>:lastid
 
当然慢了,那么大的数据量,再快的计算机也得好长时间才能取到所有数据
 
当然很慢了,那么多的数据,而且你又用Table控件,可以换一下ADODataset控件,当然
上面所说的方法也很重要
 
主要原因就是数据太多了,
就是用SQL语句在查询分析器中查询都需要好久,
像楼上各位说的一样,不要一次全部取过来,
根据需要去取,如果表没有建立索引的话可以考虑创建索引!
 
你的数据还是少呀,才让你等10多秒,我刚开始反这个错误的时候总以为是死机靠
话又说回来,你的程序处理的时间肯定也比较长了,不然的话看看你的50多万条记录的大小
sizeof 然后跟网速比一下,如果相去甚远程序也就有问题了(现在就有问题呵呵呵)
 
有没有从表啊?从表记录多,也会出现这种情况的。
 
去看看李维的Delphi5x分布式多层应用系统编就明白了
 
设置ClientDataSet属性,让它每次少取一点数据
 
做中间层很要不得的做法其中一条是:不要直接下表,否则不叫中间层!
最好先传递过滤条件或SQL语句给TClientDataSet的CommandText,或者调TClientDataSet
和DataSetProvider的接口OnDataRequest去查询数据!
 
取200就不少了。
 
加一progressBar,叫user等,hehe
 
to rainqueen
ID 是怎么回事情 能给我解释一下吗
 
就在中间层写方法,让客户端直接调用。
这样才叫三层。
先结了吧!
 
后退
顶部