起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 193|回复: 1

保存速度慢的问题[请求]

[复制链接]
发表于 2009-9-22 12:17:30 | 显示全部楼层 |阅读模式
有多个模块保存速度很慢,
在测试上没有问题,保存速度都是0-1秒,
更新到正式服务器后查询速度没影响,但是保存速度特别慢,一般在15秒左右,
如果说是正式服务器的问题,但是有些模块又没有问题。
请帮我分析下可能的原因。

下面是保存速度慢的某一个模块的保存代码:
procedure TGENERATE_CITIBANK_CHEQUE_TXT.Button_SaveClick(Sender: TObject);
var
  i,j:integer;//i:新增记录条数,j:修改记录条数;
  lDataSet:TCloneDataSet;
  sBatch_no,temp,sFLOW_NO :string;
begin
  if PAY_CHEQUE_DT.DataSet.Active and ( not PAY_CHEQUE_DT.DataSet.IsEmpty ) then
     begin
             i:=0;
             j:=0;
             PAY_CHEQUE_DT.DataSet.Edit;
             PAY_CHEQUE_DT.DataSet.Post;
            lDataSet:=TCloneDataSet.Create(nil);
        try
            lDataSet.CloneCursor(PAY_CHEQUE_DT.DataSet,false,true,false);
            lDataSet.First;
           while not lDataSet.Eof do
                begin
                   if ( not ((lDataSet.FieldByName('Ref_No').AsString='') and (lDataSet.FieldByName('PAY_DATE').AsString='') and (lDataSet.FieldByName('PAY_AMT').AsString=''))) and
                     ( ( lDataSet.FieldByName('Ref_No').AsString='') or ( lDataSet.FieldByName('PAY_DATE').AsString='' ) or ( lDataSet.FieldByName('PAY_AMT').AsString='')) then
                      begin
                          if temp ='' then  temp := lDataSet.FieldByName('INV_NO').AsString  else  temp := temp + ','+ lDataSet.FieldByName('INV_NO').AsString;
                      end;
                       lDataSet.Next;
                end;
            if temp <>'' then
                begin
                   Jsdialogs.ShowMsg('Inv No in '+'【'+ temp + '】'+' was not completed,Please check it before operated!','');
                   SysUtils.Abort;
                end
             else
                begin
                   lDataSet.Last;
                  while not lDataSet.Bof do
                     begin
                          if (lDataSet.FieldByName('Ref_No').AsString<>'' ) and  ( lDataSet.FieldByName('PAY_DATE').AsString<>'' ) and ( lDataSet.FieldByName('PAY_AMT').AsString<>'') then
                            begin
                               if (lDataSet.FieldByName('BATCH_NO').AsString='') then
                                  begin
                                     if ( i=0 ) then
                                        begin
                                           Query.Close;
                                           Query.CommandText:='SELECT BF_PAY_BATCH_SEQ.NEXTVAL AS BATCH_NO FROM DUAL';
                                           Query.Open;
                                           sBATCH_NO:= Query.FieldByName('BATCH_NO').AsString;
                                         end;
                                     Query.Close;
                                     Query.CommandText:='SELECT BF_PAY_CHEQUE_SEQ.NEXTVAL AS FLOW_NO FROM DUAL';
                                     Query.Open;
                                     sFLOW_NO:= Query.FieldByName('FLOW_NO').AsString;
                                     Query.Close;
                                     Query.CommandText := 'insert into BF_PAY_CHEQUE (FLOW_NO,VENDOR_NO,VENDOR_NAME,INV_NO,CUR,INVDATE,DUEDATE,INVAMT,INVOUTAMT,SERIALCOLUMN,REF_NO,PAY_DATE,PAY_AMT,CITI_BANK_NO,DELIVERY_METHOD,PAY_STATUS,TXT_STATUS,STATUS,FILLER,FILL_DATE,MAIL_ADDR1,MAIL_ADDR2,MAIL_ADDR3,MAIL_ADDR4,MAIL_ADDR5,BATCH_NO) values ('''+sFLOW_NO+''','''
                                                        +lDataSet.FieldByName('VENDOR').AsString+''','''+lDataSet.FieldByName('VNAME').AsString+''','''+lDataSet.FieldByName('INV_NO').AsString+''','''+lDataSet.FieldByName('CUR').AsString+''','''
                                                        +lDataSet.FieldByName('INVDATE').AsString+''','''+lDataSet.FieldByName('DUEDATE').AsString+''','''+lDataSet.FieldByName('INVAMT').AsString+''','''+lDataSet.FieldByName('INVOUTAMT').AsString+''','''
                                                        +lDataSet.FieldByName('SERIALCOLUMN').AsString+''','''+SYSutils.StringReplace(lDataSet.FieldByName('Ref_No').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''','''+lDataSet.FieldByName('PAY_DATE').AsString+''','''+lDataSet.FieldByName('PAY_AMT').AsString+''','''
                                                        +lDataSet.FieldByName('CITI_BANK_NO').AsString+''','''+lDataSet.FieldByName('DELIVERY_METHOD').AsString+''',0,0,1,'''+Variants.VarToStr(sLOGIN_USER_ID.Value)+''',sysdate,'''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR1').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])
                                                        +''','''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR2').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''','''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR3').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])
                                                        +''','''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR4').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''','''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR5').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''','''+sBATCH_NO+''')';
                                     Query.Execute;
                                     lDataSet.Edit;
                                     lDataSet.FieldByName('FLOW_NO').AsString:=sFLOW_NO;
                                     lDataSet.FieldByName('BATCH_NO').AsString:=sBATCH_NO;
                                     lDataSet.FieldByName('FILLER').AsString:=Variants.VarToStr(sLOGIN_USER_ID.Value);
                                     lDataSet.FieldByName('FILL_DATE').AsString:= SysUtils.DateToStr(SysUtils.Now);
                                     i:=i+1;
                                  end
                               else
                                  begin
                                      Query.Close;
                                      Query.CommandText:=' SELECT B.REF_NO,B.PAY_DATE,B.PAY_AMT,B.CITI_BANK_NO,B.DELIVERY_METHOD,B.MAIL_ADDR1,B.MAIL_ADDR2,B.MAIL_ADDR3,B.MAIL_ADDR4,B.MAIL_ADDR5 FROM  BF_PAY_CHEQUE B WHERE B.INV_NO= '''+lDataSet.FieldByName('INV_NO').AsString+''' AND STATUS=1 AND PAY_STATUS=''0'' ';
                                      Query.Open;
                                    if  (SysUtils.Trim(lDataSet.FieldByName('REF_NO').AsString) <> SysUtils.Trim(Query.FieldByName('REF_NO').AsString)) or (lDataSet.FieldByName('PAY_DATE').AsString <> Query.FieldByName('PAY_DATE').AsString) or (lDataSet.FieldByName('PAY_AMT').AsString <> Query.FieldByName('PAY_AMT').AsString) or
                                        (SysUtils.Trim(lDataSet.FieldByName('CITI_BANK_NO').AsString) <> SysUtils.Trim(Query.FieldByName('CITI_BANK_NO').AsString)) or (SysUtils.Trim(lDataSet.FieldByName('DELIVERY_METHOD').AsString) <> SysUtils.Trim(Query.FieldByName('DELIVERY_METHOD').AsString )) or
                                        (SysUtils.Trim(lDataSet.FieldByName('MAIL_ADDR1').AsString) <> SysUtils.Trim(Query.FieldByName('MAIL_ADDR1').AsString)) or (SysUtils.Trim(lDataSet.FieldByName('MAIL_ADDR2').AsString) <> SysUtils.Trim(Query.FieldByName('MAIL_ADDR2').AsString)) or
                                        (SysUtils.Trim(lDataSet.FieldByName('MAIL_ADDR3').AsString) <> SysUtils.Trim(Query.FieldByName('MAIL_ADDR3').AsString)) or (SysUtils.Trim(lDataSet.FieldByName('MAIL_ADDR4').AsString) <> SysUtils.Trim(Query.FieldByName('MAIL_ADDR4').AsString)) or
                                        (SysUtils.Trim(lDataSet.FieldByName('MAIL_ADDR5').AsString) <> SysUtils.Trim(Query.FieldByName('MAIL_ADDR5').AsString))  then
                                      begin
                                        Query.Close;
                                        Query.CommandText := 'update BF_PAY_CHEQUE set REF_NO ='''+SYSutils.StringReplace(lDataSet.FieldByName('Ref_No').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''',PAY_DATE='''+lDataSet.FieldByName('PAY_DATE').AsString+''',PAY_AMT='''+lDataSet.FieldByName('PAY_AMT').AsString
                                                         +''',CITI_BANK_NO='''+lDataSet.FieldByName('CITI_BANK_NO').AsString+''',DELIVERY_METHOD='''+lDataSet.FieldByName('DELIVERY_METHOD').AsString+''',UPD_PERSON='''+Variants.VarToStr(sLOGIN_USER_ID.Value)
                                                         +''',MAIL_ADDR1='''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR1').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''',MAIL_ADDR2='''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR2').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''',MAIL_ADDR3='''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR3').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])
                                                         +''',MAIL_ADDR4='''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR4').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''',MAIL_ADDR5='''+SYSutils.StringReplace(lDataSet.FieldByName('MAIL_ADDR5').AsString,'''','''''',[TReplaceFlagsEnum.rfReplaceAll])+''',UPD_DATE=sysdate where FLOW_NO='''+lDataSet.FieldByName('FLOW_NO').AsString+''' ';
                                        Query.Execute;
                                        lDataSet.Edit;
                                        lDataSet.FieldByName('UPD_PERSON').AsString:=Variants.VarToStr(sLOGIN_USER_ID.Value);
                                        lDataSet.FieldByName('UPD_DATE').AsString:= SysUtils.DateToStr(SysUtils.Now);
                                        j:=j+1;
                                      end;
                                  end;
                            end;
                               lDataSet.Prior;
                     end;
                     if (i+j)<>0 then
                       begin
                         JsDialogs.ShowMsg('Update success!','');
                         PAY_QUERY_DT.DataSet.FieldByName('BATCH_NO').AsString:= sBATCH_NO;
                       end
                     else JsDialogs.ShowMsg('No data change!','');
                end;
        finally
          lDataSet.Free;
        end;
       if PageControl.ActivePage = TabSheet_Diary then
          PageControl.ActivePage := TabSheet_master;
     end
     else JsDialogs.ShowMsg('No data!','');
   S_STATUS:=1;
end;

只是在数据库做了insert 和 update的操作!
测试上处理几十条数据速度也不会超过2秒,
更新到正式至少要15秒的时间。
回复

使用道具 举报

发表于 2009-9-22 14:08:09 | 显示全部楼层
楼主,你在Query.open和Query.execute执行前后记录日志,看看释放这些语句执行时间过长。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-16 01:43 , Processed in 0.038986 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表