最近做一个图形界面的数据库程序遇到一个难题,在这和大家讨论一下.我用的是ADOQuery来连接数据库的有一处界面切换的地方我用ADOQuery做了20次左右的Select查询,查询内容不一样的.其中界面和上面的控件都是动态分配内存的.其中一个listView动态分配50(10行*5列)个左右的SubItem.问题:通常情况下,以上界面切换只在3秒时间就可以完成(这已经有点不可认人接受了)
     但返复做以上动作的话,重复10来次就会一次特别慢(长达20秒,有时甚至死住了).
    
    本人学习delphi时间不长,只懂皮毛,希望大家提点建议,交流交流^_^补允:上面连续重复才会有一次特别长时间,如果以上动作间隔时间长一点,那么延时特长则很少出现,甚至不出现.

解决方案 »

  1.   

    加上
    Prepared;会好一点点。但还是要从你程序上去改。有必要每次都重新刷新所有的数据么?
      

  2.   

    你有以上几点不当:
      1.用adoquery直接连上数据库要花费好多时间和资源,用AdoConnection一次连接就可以了
      2.有20多个查询,你最好用存储过程吧
      3.listView加上好多subitem时会不停的刷新界面,增加系统负担,你用listview.Items.BeginUpdate和EndUpdate就行了,让它刷新界面一次就行了
      

  3.   

    to lyguo:
      确实没有没有用Prepared,学习学习下,看有没有提高效率.其实进度条是用了,
    但让用户等几秒还可以接受,十几秒就过份了to yagzh2000:
      ADOConnection是一次连的.
      20次查询是这样做的: ADOQuery.CLose;更改ADOQuery.SQL;ADOQuery.Open;(感觉这里重复多次就会
    有一次会缓存释放,时间特别长,用Prepared后不知会不会好点.)
      listView确实也是一大因素,不知可不可以一下分配50个subitem,现在是一个一个地分配的.
      

  4.   

    其实动态分配内存,我看别人的评论说效率是会低点,但不是太明显,主要是ADOQuery,我不太了解里面的机制,
    有没有人有这方面的资料供参考一下?
      

  5.   

    给自个顶个加上prepared后,是有点加快但我发现用下面代码测试,每100多次就会有一次延时达到10秒的数量级.
      for i := 0 to 999 do
      begin
        t := GetTickCount;//记录每次开始时间
        qry1.Close;
        qry1.Prepared := True;
        qry1.SQL.Clear;
        if b then
          qry1.SQL.Add(edt1.Text)
        else
          qry1.SQL.Add(edt2.Text);
        b := not b;
        qry1.Open;
        qry1.Prepared := False;
        lst1.Items.Add(FormatCurr('000',i) + '--' + IntToStr(GetTickCount - t));//显示每次时间
      end;edt1与edt2是内容不一样,返回结果一样,结果集是[13行*4列]的int.测试结果:  111--48672
              220--42812
              328--47031
              ..........
              979--46765
      

  6.   

    已经找到间隔性的延时的原因了,是因为数据库的tempdb满了需要清空所造成的延时
    增加tempdb的空间,优化一下服务端,个别长延时现象即消失.(原来与ADOQuery无关)下面就看看内存动态分配对性能的影响,大家多指点指点,说说经验,谢谢