一个程序中,有一模块,要实现软件一个商品的拼音,就出现商品名称供选择。
有用单键提示,就是说,按一个键,就查询一次,得到拼音中含此键的商品列表,有两种方法。
方法A:var str:string;
procedure TFrm.EditChange(....)
begin
  str:='select * from goods where goodspinyin like '+quotedstr(Edit.text);
  With Query do 
     close;
     sql.clear;
     sql.add(str);
     open;
  end;
end;方法B:
窗口Create 的时候就 select * from goods
然后在 EditChange时使用Filter进行查询。我以为方法B中所有数据在Create时就已经得到了,后面再进行Filter是在本机上,速度应该很快,可是事实却事与愿违。方法A明显比方法B快(在赛扬800上做的测试,在我的P4上查觉不到差别)。方法B中每输入一个字母就停1,2秒左右,而方法A只停半秒左右。为什么呢?

解决方案 »

  1.   

    B  方法需要首先返回所有的数据才能进行下一步filter,如果数据很多,这个返回的过程的是非常耗时的。如果再由索引的情况下,A的速度会比B快至少一个数量级。
      

  2.   

    goods表确实有索引。
    B  方法需要首先返回所有的数据才能进行下一步filter
    <-- 在窗体Create的时候,已经取回所有的数据了,也就是所 DataSet已经打开了。
      

  3.   

    如果数据在客户内存,应使用过滤,可以减轻服务器的处理量,进而提高效率我把dataset open了,这时数据在哪呢?
      

  4.   

    你的C800 的机器内存增大点再看看,有可能内存不够。这有可能,他们只有64M的内存,在我512M的下面看不出差别的。
      

  5.   

    方法A是用了MS的技术,而方法B是用的BORLAND的技术,
    所以有差别也就正常了
      

  6.   

    filer 数据量全到流到前台,query,在后以执行sql,返回数据集,如查表的recordcount is very many,我健义用sql,减少网络负荷,
      

  7.   

    如此说来还真是第一种方法好,可是第一种方法会不会过多次地打开数据集而导致数据库服务器忙呢?每触发一次Edit的Change,就Close,open一次数据集,服务器这下累死了。还有我使用 filter,则是数据集第一次打开时下载到本机,就算这一次慢些,我可以忍受的,照理以后的filter应该很快才是呀,因为是本地的数据,而且数据量也不大(800条,每条约200字),为什么会慢呢?