向大家求助,一个关于取得查询结果记录数目的问题(100分)

  • 主题发起人 主题发起人 valatine
  • 开始时间 开始时间
V

valatine

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用paradox表约2万多条记录使用Query组件查询,(RequitLive=true,CatchUpdate=false),
查询速度也还算快,但使用Query1->RecordCount取记录数目时特别慢
甚至记录数为0也是一样慢,不知是为什么?

我自写了代码 i=0; while(!Query->Eof){ i++; Query->Next} return i;
来取得查询记录总数,当总数较小时还算快,可总数大时,就特别慢,
不知哪位高手有更好的办法解决该问题?(另外,为什么查询结果为0时,查询特别慢?)

 
select count(*) from XXX
 
我用SQL SERVER。PARADOX不是很熟悉
按理说记录数为0时不该慢才对
因为TQuery 在使用RecordCount 时,会将查询结果集读到本地。
在读的过程中BDE会按Cursor 位置数数
其实和你的 while(!Query->Eof)(i++;Query->Next} return i;
差不多的意思。
你能肯定是查询慢还是RECORDCOUNT慢吗?

 
我是一步步的调试的,Query.Open快, 是i=Query.RECORDCOUNT那一句特别慢;
若使用select count(*) from XXX,需另外再做多一次查询,我比较过跟RecordCount比
也快不了多少。

 
query1.open
if not query1.eof then
begin
query1.last;
i:=query1.recno
end;
行吗?
 
>> 查询速度也还算快,但取记录数目时特别慢
数据库引擎并没有一次把所有行都取回本地,而是一次取回若干,这样响应速度就会相对较快,
20000 条数据一般不会返回太快的,你所说的现象“查询速度也还算快”恰好说明了这一点,由
于取记录数目需要对所有的行进行一次计数,所以必须等待全部行都返回之后,才能得到正确的
值,因此“取记录数目时特别慢”。
我相信“取记录数目时特别慢”的现象只会出现在第一次,第二次应该就比较快了,而且即使
重新“Select Count(*) ”一次,我想也会比原来的方法快,不信试一试。
如果你确实需要马上显示返回的记录数,对于 SQL Server ,可以用 SQL 语句直接访问
@@RowCount 系统变量:“Select @@RowCount”,可以得到上一次 SQL 语句影响的行数。
Lucky !
From: BaKuBaKu
 
>>我是一步步的调试的,Query.Open快, 是i=Query.RECORDCOUNT那一句特别慢;
>>若使用select count(*) from XXX,需另外再做多一次查询,我比较过跟RecordCount比
>>也快不了多少。


用recordcount时,系统会重新循环一次数据表,当表很大时,肯定很慢,有时结果会为0(当表中有
memo类字段时)

使用select count(*) from XXX速度肯定快
 
Query1->RecordCount是有问题的,我发现有时取不到记录数
最好不用,其实用select count(*) as number from 表 where 条件
最后由query.fieldbyname('number').value得到记录数
 
伙计,来点新鲜的
 
with query1 do
begin
close;
sql.clear;
sql.add('select count(*) as ii from XXX');
open;
i:=fieldbyname('ii').value;
close;
sql.clear;
sql.add(''select * from XXX');
open;
end;
 
Tyrael和zwma的是对的。
 
var
i:integer;
begin
with query do
begin
close;
sql.clear;
sql.text:='select count(*) as ss from table';
open;
end;
i:=query.fieldbyname('ss').asinteger;
end;
 
在query中最好不要用recordcount!而应当用select count(*) from ... where ...语句。
recordcount只能用于Paradox 和 dBASE的table中,用在query上会使性能严重下降,
且recordcount在其他的数据库上返回的值不一定正确(如SQL Server总返回-1)
zwma的写法是对的。以下是DELPHI帮助中的原话:
“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.”
 
多人接受答案了。
 
后退
顶部