一个程序循环读取某个文件夹下的文件(一万多个文件),对每个文件和数据表的内容进行比较,数据符合再插入到另外一个表中.
  //循环读取某个文件夹下的文件
  allfile:=tstringlist.Create;
  if findfirst('d:\file\*.*',not faDirectory,findresult)=0 then
  begin
    allfile.Add('d:\file\'+findresult.name);
    while findnext(findresult)=0 do
    begin
      allfile.Add('d:\file\'+findresult.name);
    end;
    findclose(findresult);
  end;
  count:=allvod.Count; //count约为15000
  for i:=0 to count-1 do
  begin
   //从表table1中查找是否存在文件夹中的文件
   filename:=extractfilename(allfile.Strings[i]);
   temp.SQL.Clear;
   temp.SQL.Add('select * from tabel1 where f_name=:f_name1');
   temp.ParamByName('f_name1').AsString:=filename;
   temp.Open;   //如果找到一条满足要求的记录则写入到表table2中
   if temp.RecordCount=1 then
   begin
     qsql:='insert into table2(no,name,f_name) values(';
     qsql:=qsql+temp.fieldbyname('no').AsString+',';
     qsql:=qsql+ QuotedStr(temp.fieldbyname('name').AsString)+',';
     qsql:=qsql+QuotedStr(allfile.Strings[i])+',';
     inserttemp.SQL.Clear;
     inserttemp.SQL.Add(qsql);
     inserttemp.ExecSQL;
   end;
 end;这个过程需用30-40分钟,怎样才能提高效率?

解决方案 »

  1.   

    select 和 insert 配合在程序中,很慢的。建议一:
    把select中的数据一次读入到本地内存中(建一个本地的缓存变量,如数组、列表等)
    每次在本地比较数据再插入数据库建议二:
    把select和insert都写入存储过程,放在服务器上执行,
    同时合理调整select表的关键字、索引,加快检索的速度
    insert也可以采用一些加快插入速度的处理方法
    如:先去掉关键字、索引,在全部加入完成后在加上关键字和索引等
      

  2.   

    没有服务器,全部是在本地执行,也没有sql server,所以存储过程用不了.
      

  3.   

    从文件夹读取文件时间很少,约三秒,从表table1中查找是否存在文件夹中的文件,即使不插入数据,也要很久很久.temp.open 执行一万多次需要很长时间,这个问题不知如何解决?
      

  4.   

    根据你的描述,应该是以下两个过程非常耗费时间,所以可以针对这两个过程进行优化
      for i:=0 to count-1 do
      begin          
       //从表table1中查找是否存在文件夹中的文件
       filename:=extractfilename(allfile.Strings[i]);
       temp.SQL.Clear;
       temp.SQL.Add('select * from tabel1 where f_name=:f_name1');
       temp.ParamByName('f_name1').AsString:=filename;
       temp.Open;
    -------------------------------------
    不要使用Sql来查询,一次把所有的记录都查出来,放到Table或者Query中,
    然后使用Query中的方法来匹配记录,这样应该会快很多的。匹配记录时,可以
    设置Query.DisabledControls,整个记录匹配完毕时,再恢复。
    -------------------------------------
       //如果找到一条满足要求的记录则写入到表table2中
       if temp.RecordCount=1 then
       begin
         qsql:='insert into table2(no,name,f_name) values(';
         qsql:=qsql+temp.fieldbyname('no').AsString+',';
         qsql:=qsql+ QuotedStr(temp.fieldbyname('name').AsString)+',';
         qsql:=qsql+QuotedStr(allfile.Strings[i])+',';
         inserttemp.SQL.Clear;
         inserttemp.SQL.Add(qsql);
         inserttemp.ExecSQL;
       end;
    -------------------------------------
    这儿也不要找到一条加一条,找到后,生成insert语句,先放置在另一个TStringList中,
    等到有一定的数量(例如达到100条)再递交,其他结束时递交。