为什么这么慢?(100分)

  • 主题发起人 主题发起人 wallis
  • 开始时间 开始时间
W

wallis

Unregistered / Unconfirmed
GUEST, unregistred user!
现有access数据库表一张,记录六万多条,每条记录需修改变换后再写进去。我用ADO连接,
CPU是P41.7,居然需要3个小时。如果简单的把记录读出不加修改再写进去的话,一个多小时
还没完成。请问有什么方法加快速度呢?ADOTABLE中我已把LOCK TYPE设成ltBatchOptmistic,
使用了UdateBatch方法。请大虾们指点指点!
 
看李维的'ADO..............'的书吧,上面的详细的说明
 
建议先看看你的代码,然后再考虑改变 属性。

很多时候,代码的效率也有关系。
 
改用UPDATE语句来修改,把你要修改的表的结构、内容及条件列出来看看。
 
数据库的设计也很关键
 
需要你更详细的说明,正常情况下不会这么慢的.
 
我想这应该跟我的代码关系不大吧。上面我也提过,我尝试着仅把记录读出再post进去,
中间没有别的运算,也需要很长时间(1个多小时还没完)。
用update是不可能的,我要修改的字段是字符型的,要判断其中的某写字串是否合符要求
而进行删除或更正此子串。下面是此表的结构:
字段名 类型 长度 索引
bh text 8 否
kh 长整型 是(有重复)
sj text 42 否
没有关键字。要修改的正是sj字段,此字段由7个字符为单位,需判断此单位是否需要
而或删或该。请大家多给点意见!共同探讨!
 
能否列出字符串删除或更改的条件,我想试试SQL语句如何实现。
 
没有关键字?有索引吗?
如果都没有那就慢了!
 
用ADOTable+DBGrid显示和修改六万多条记录?那速度慢的一定没话说。
如确实不能用adoquery(SQL)来实现,建议试试下列(蹩脚的)方法:
 1、不要用DBGrid,改用DataSource+DBEdit (逐条显示和修改)
 2、将那六万多条记录的table分成若干部分,最后合并
 
问题关键是做为查询修改所用到的条件的字段是否有索引,有索引肯定快
 
各位:
有索引,但不在修改的字段上。我这里不需要DBGrid等任何显示控件。而需要遍历每条记录,
检查其中‘sj’字段进行或删或改。‘sj’字段有42个字符长,每七个字符为一个有意义单元。
其中前4个位是时间,后三个为特殊字符。如:0823abc1612adf1745abc2030abc2156add2301ccc。
需要判断字符单元是否在指定时间范围内,是就保留,不是就删除。肯定是需要遍历所有记录的。
我想慢是应该慢在读写记录方面的,到底有什么好方法呢?
 
UPDATE table1
SET sj = iif(cint(left(right(left(sj, 7),7),4))>1200 and len(sj)>= 7,right(left(sj, 7),7),'')+
iif(cint(left(right(left(sj,14),7),4))>1200 and len(sj)>=14,right(left(sj,14),7),'')+
iif(cint(left(right(left(sj,21),7),4))>1200 and len(sj)>=21,right(left(sj,21),7),'')+
iif(cint(left(right(left(sj,28),7),4))>1200 and len(sj)>=28,right(left(sj,28),7),'')+
iif(cint(left(right(left(sj,35),7),4))>1200 and len(sj)>=35,right(left(sj,35),7),'')+
iif(cint(left(right(left(sj,42),7),4))>1200 and len(sj)>=42,right(left(sj,42),7),'')

CINT 将数字字符串转为数字
LEFT 从源字符串左起取出指定长度字符串
RIGHT 从源字符串右起取出指定长度字符串

上面的是比较时间是否大于12:00点(13:34表示为1334),是就保留,否就用''代替。
加入len判断是为防因字符串长度不符而导致数据出错
 
to QuickSilver:
这些语句能不能在delphi上使用的
 
可以的,上面的那些函数是ACCESS数据库本身支持的。
你可以先在ACCESS中建立查询先试试。
 
如果你的索引不在修改条件上,这个索引是没有用的,你给sj建个索引就快了
 
to QuickSilver:
非常感谢您的帮忙!不过还有个问题请教。就是参数怎么设定,也就是说当符合条件时
保留,不符合使用参数提供修改值,但我怎么设怎么不对。
 
自己相应修改一下,我已验证过。

procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
begin
str:='1200';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('UPDATE table1 SET sj = ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj, 7),7),4))> '+str+' and len(sj)>= 7,right(left(sj, 7),7),:para1)+ ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj,14),7),4))> '+str+' and len(sj)>=14,right(left(sj,14),7),:para1)+ ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj,21),7),4))> '+str+' and len(sj)>=21,right(left(sj,21),7),:para1)+ ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj,28),7),4))> '+str+' and len(sj)>=28,right(left(sj,28),7),:para1)+ ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj,35),7),4))> '+str+' and len(sj)>=35,right(left(sj,35),7),:para1)+ ');
adoquery1.SQL.Add('iif(cint(left(right(left(sj,42),7),4))> '+str+' and len(sj)>=42,right(left(sj,42),7),:para1) ');
adoquery1.Parameters.ParamByName('para1').value:='0000000';
adoquery1.ExecSQL;
end;
 
to QuickSilver:
我的参数里需要加上一些数据才行的,怎么办呢?
例如:'iif(cint(left(right(left(sj, 7),7),4))> '+str+' and len(sj)>= 7,
right(left(sj, 7),7),:para1+right(left(sj, 7),3)
但就是出错。还有,在sql语句里要判断一个字符串是否包含在另一个字符串里,
该怎么做?在delphi里用pos,但access怎么做?谢谢!
 
看李维的书也没有用,ADO就是这么慢的,我实际用了才知道,ADO比BDE慢的多,绝不仅仅
是李维说的那么点,我照他说的去优化,是快了点,但比起BDE,还是慢很多!

我是SQL Server7
 
后退
顶部