财管家 首页
当前位置:主页>delphi7/进销存和数据库> 文章内容

数据运算速度讨论

发布时间:2011-01-05 | QQ免费站
1楼: 客户端有一个须套用单价的DBF数据表(有一编码字段),有50万条记录。
SQL_2000上有一个单价表(有一编码字段并进行索引),有100万条记录.
现在要编码套用单价(即按编码去查找对应的单价).
方法一:
WITH TABLE1
BEGIN
FIRST
WHILE NOT EOF DO
BEGIN
ADOQUERY1.SQL.TEXT:='SELECT BH,DJ WHERE BH='+
''''+FIELDBYNAME('BH').ASSTRING+'''';
ADOQUERY1.OPEN;
IF ADOQUERY1.FIELDBYNAME('BH').ASSTRING<>'' THEN
BEGIN
EDIT;
FIELDBYNAME('DJ').ASFLOAT:=
ADOQUERY1.FIELDBYNAME('DJ').ASFLOAT;
POST;
END;
NEXT;
END;


方法二:
是将两个表全部打开,然后在ADOQUERY中用LOCATE查找,找到替换.
以上两个方法其速度慢,望大家指正或有更好的方法.谢谢大家!

2楼: 请大家指正,谢谢!

3楼: 怎么没人

4楼: 请大家指正,谢谢!如 管家婆软件

5楼: 你可以将DBF的表查询出来在SQL2000中写个临时表,然后多表连接查询

6楼: TO:chen_liang
谢谢,不过按你的方案速度还是慢!

7楼: 1. 不要在循环中下语法, 这样速度是最慢的。
2. 把需要的资料一次性全部取回, 如你的方法二, 但不要使用Local的查找资料
3. 把两个数据集排好序 用比较的方法让两边都只移动对应的数据, 这样两个数据集就只循环一次就可以了。

4. 如果可以的话使用ADODataset中的Recordset直接来操作这样速度会快上10以上。

其它第三点的简单示意如下:

//先排序
A.IndexFieldName = 'XX'
B.IndexFieldName = 'XX'

while not A.Eof do
begin
while not B.Eof do
begin
//使用比较方式来查找资料
I := compare(A.XX, B.XX);
while (I > 0) or not B.Eof do
begin


B.Next
I := compare(A.XX, B.XX);
end;
if not B.Eof and I = 0 then //在B中找到资料了。
 DoSomeThing
end
end;