1.
var
  bh:string;
......
with query do
begin
  close;
  sql.clear;
  sql.add('select * from t');
  sql.add('where bh='+quotedstr(bh);
  open;
end;
2.
var
  bh:string;
......
with query do
begin
  close;
  sql.clear;
  sql.add('select * from t');
  sql.add('where bh=:bh');
  open;
  params[0].asstring:=bh;
end;以上两种方式在实现查询功能上是等价的,但是在系统开销上不一样,小程序根本就看不出来,最近我写了一个很复杂的多层嵌套查询,涉及到的数据表有几十个,查询的条件变量有很多。我先按照第二种方式做,系统老报错,说什么内存不足,我机子的内存有256M,CPU是P4-1.7G的。我用单步运行,并打开资源监视,前面的几层都没有问题,CPU占用率为5-10%左右,内存开销很小,但到第六层时,CPU占用率突然变为100%,然后就看着我的内存资源一步步锐减,直到程序报错,而上一层还好好的,一点迹象都没有就突然耗空了系统的资源。后来我想尽办法优化算法,但根本就解决不了问题。万般无奈之下,我抱着死马当活马医的心态,将查询的方式改为的第一种情况,调试竟然一切正常,而且CPU的占用率很低,内存的开销也很小。纳闷和惊喜之余,我写了这张贴,特来与各位探讨探讨,更希望高手能给我指点谜经:为什么这两种方式有这么大的差别?同时也推荐各位写程序的时候尽量用第一种方式。

解决方案 »

  1.   

    2.
    var
      bh:string;
    ......
    with query do
    begin
      close;
      sql.clear;
      sql.add('select * from t');
      sql.add('where bh=:bh');
      params[0].asstring:=bh;  //******
      open;                    //******end;
      

  2.   

    同意楼上chwdong(chwdong)的说法,这样改一下看看效果如何?
      

  3.   

    可能用参数的时候首先delphi先要生成完整的Sql 语句,然后再传送给DBMS,对于不用参数直接就传给DBMS了,这样当然节约时间了。以上是我的猜测,算给一个建议吧。呵呵,多交流。