如何提高ClientDataset的写入速度?(100分)

  • 主题发起人 主题发起人 kite20020304
  • 开始时间 开始时间
K

kite20020304

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:数据库为Oracle9i,中间层为 Tuxedo,客户端Delphi7
测试如下:3万行记录,30个字段(每行约800字节),写入ClientDataset(内存,非文件)约13s
请问如何提高写入速度?
 
你是如何写入的,贴上相应的代码。具体的解决方法应该有对sql的优化以及对循环过程的优化。
 
for ...
begin
ClientDataSet1.Append;
ClientDataSet1.Fields[0].Value := ...
...
ClientDataSet1.Fields[N].Value := ...
ClientDataSet1.Post;
end;
 
没有什么好办法,数据多了,怎么写都差不多.
 
如果用 AppendRecord,如何动态的构造一个 const Values: array of const ?

(AppendRecord(const Values: array of const);)
 
如果你采用单条写速度差不多了。可以采用存储过程同时写10条,这样速度立即快上来了。
你是与数据库进行数据交换3万次来回,如果采用上面方法,和数据库只交换3千次来回,知道么?
 
和数据已经无关了
数据已经通过中间件取到了客户端,我只是将数据打包到 ClientDataSet 中
 
这样吧(笨一点的方法),大家看行不行。
ClientDataSet有(AppendData)这个功能,
你开多个线程,多建几个ClientDataSet,把数要写入的数据从不同位置,分别同时向ClientDataSet追加。
然后再把数据追加到一起。
 
cds是内存里面的吧。最后一次applyupdate比较好。
Tuxedo好么?怎么用咧?
 
可不可以考虑在中间层接收数据时,直接把数据处理成ClientDataSet可以接受的格式,然后一次性的从内存流中加载 即ClientDataSet.loadfromstream,估计这样比一笔笔的添加要快的多

另外,加载时关闭数据感知控件;像你上面的代码中,不要在最后额外加POST等(因为APPEND之前会POST)或许均可以节省点时间吧
Array of const的方法如下

var abc:string;
begin
abc:='test';
ClientDataSet1.AppendRecord(['a',1,'bc',abc]);
end;

顺序与字段顺序要一一对应
 
建議用無態形式來做。從分利用存儲過程。
 
采用块写入法,一秒搞定
 
to zj_mpy:
请说的详细一点
 
applyDB,最快了
 
期待zj_mpy的块写入法,公报出来!
 
神奇,1秒钟,飞天哟。
那可是3万条记录也,大哥!
 
这么大数据,怎么写也快不了,还是改为存储过程吧
 
哈哈,建议你看看: Berkeley DB
 
感兴趣,顶一下!
 
想办法用“insert”或用“update”
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
777
import
I
后退
顶部