提个郁闷的问题!BDE速度的问题!(有好的解决方案可以加分)

wf2091139 2006-03-25 09:45:16
现在遇到的问题其实很简单,就是要读取 DBGrid 中显示记录的记录数。
比如:
qry->Close();
qry->SQL->Clear();
qry->SQL->Add("Select * from ....");
qry->Open(); //(1)

int Count = qry->RecordCount();//(2)

1、奇怪的是,他执行第(2) 的时间比 第(1)步多出一倍多 。

我在局域网中,测试 20万 条记录,执行完全部花 4秒左右。
如果连到外网上远程服务器5多万条 要13秒左右,实在郁闷,
如果取消(2),就只要5秒左右。

尝试过用存储过程返回总记录数,结果耗时更多。

其实他的open过程还是很快的,对比了一下,比ado快,可是为什么取记录数却那么慢?
如果有办法直接读dbgrid的行数也好啊。








...全文
345 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dragonhux 2006-04-08
Note: Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.
回复
wf2091139 2006-04-08
一直没时间上网,今天终于可以回来结个帖!
回复
lurel 2006-03-28
我有亲身经历,一个16万条的记录表,我用BCB写了个导入数据的程序,用到了RecordCount(),结果发现少了200条记录,结果我最后用dts测试,发现确实是我说的问题,后来查了Borland的网站,他们已经说明了这种情况,这种现象同样适用ado
回复
wf2091139 2006-03-28
to:lurel(城市陌生人) ( )

其实在开始的时候我就试过用存储过程返回总记录数,但是效果并不是很好.似乎还不如用RecordCount();快,不过你提到的系统资源问题倒是我没注意到的,谢谢.

to :0delphi(睡个舒服觉)
因为bde 的 recno 无法正确取值,所以早先就是用你说的这种方法加动态数组来取总数,以及显示当前记录是第n条,不过这种办法只适合记录少与1000左右的,要是20w条,那可就等到花都谢了.
回复
aiirii 2006-03-28

select count(1) from

应该是比较好的选择
回复
Friecin 2006-03-26
lurel(城市陌生人) ( 一星(中级))说的我没有验证过,不敢妄加评论,不过感觉上有这个可能。

select count(*) from YouTable 肯定是个解决你现在问题的办法



回复
奥爸 2006-03-25
要看你的需求了,你如果是仅仅获得 记录的数目,那么楼上的办法不错
select count(*) from

不过如果循环读取内容的时候
for(int i =0 ; i< count ;ii)
count 可能会发生变化,那么循环时候就会出问题

如果不关心记录的数目,循环读取的时候用
while(!qry->eof)
{
qry->next;

}
回复
lurel 2006-03-25
不是,不要轻易执行qry->RecordCount();
用SQL Monitor检测一下,如果要是执行这句,就会遍利所有记录,耗时很长,而且如果数据量过大的话,因为这个查询要用到服务器的内存,直接会把服务器的内存耗干,记录就会不完整,造成数据丢失.

如果而qry->Open(); 它支返回一部分记录,不会遍利所有记录,随着DBGrid的滚动条的下拉,它会一部分一部分的取记录,这种方法是对的,所以耗时不会很长.

如果非要返回有多少记录,利用select count(*) from 来返回记录数.
回复
发动态
发帖子
数据库及相关技术
创建于2007-08-02

1156

社区成员

C++ Builder 数据库及相关技术
申请成为版主
社区公告
暂无公告