代码,从表biao中根据ziduan查找,并返回x1,x2两个值,赋给jieguo1,jieguo2a:='emample';
for i := 1 to 400 do//测试运行400次
 begin 
  ADOQuery1.Close;
  ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
  ADOQuery1.Open;  jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
  jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化 end;biao大概有2万条数据,ziduan,x1,x2都是长度不超过5的字符。
测试上面的代码,要运行3秒半。
这个速度实在太慢了,大牛,帮忙看一下如何解决

解决方案 »

  1.   

     ADOQuery1.Close;
      ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
      ADOQuery1.Open;  jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
      jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化
    ------------------------------------------
    执行一次3秒钟? 
      

  2.   

    对ziduan字段建立非聚簇索引 索引, 看看速度有提升么 
      

  3.   

    a:='emample';
    for i := 1 to 400 do//测试运行400次
     begin 
    //下面三行为何写在循环里面?一次查出需要的再分别赋值不行吗?
      ADOQuery1.Close;
      ADOQuery1.SQL.Text:='select x1,x2 from biao where ziduan ='''+a+'''';
      ADOQuery1.Open;

      jieguo1:=ADOQuery1.FieldByName('x1').AsString;//这句去掉,对运行时间没啥优化
      jieguo2:=ADOQuery1.FieldByName('x2').AsString;//这句去掉,对运行时间没啥优化 end;
      

  4.   

    嗯,是啊,上面这段就是测试的代码,相当于访问了数据库400次,花了3秒钟。
    (实际上,在交给客户的程序中,他输入一个值,要查数据库1200次,我用的就是上面的代码,要大概9秒钟,这个时间太长了)。刚才在access里给“ziduan”建了个索引,速度快了些,运行400次大概1.5秒。
      

  5.   


    这个时间正常.
    建议你调整优化的方向实际应用中, 1200次查询是一次完成的吗?
    --------------------------------------
    1 用户操作一次, 执行少量查询, 速度延滞不会太大.
    2 用户操作一次, 执行多次查询, 先把查询语句拼接好了-> 执行一次查询-> 分配查询结果, 这样就快了
      

  6.   

    写存储过程会不会快一点,把查询语句在sql执行,只返回结果,这样就不需要不停和数据库交换数据。存储过程怎么写,就不要问我了,还不会,没学到哪里。
      

  7.   

    速度慢跟delphi没太多关系。你得把重点放在sql上,要快首选建索引是必不可少的,再一个你用循环来不断open/close这花费大量时候在IO上了。最好最大程度上把可以筛选的范围提取出来放在内存表中,然后再查询内存表。
      

  8.   

    一般说来,odbc数据库驱动比专用驱动要慢一个数据级。
      

  9.   

    這個查詢400次3S  不怎麼長………… 這個速度與DELPHI 重點在後台
      

  10.   

    如果是access数据库,优化的地方不怎么多了。
    你那里速度慢的地方,一个是频繁的open,close,第二个,就是每次都需要编译、运行sql语句。
    如果想要速度快,采用存储过程吧,存储过程只需要传入参数,不需要open,close,也不需要每次都编译语句。
    但是access不支持存储过程,想要高性能,采用更好的数据库吧。
      

  11.   

    刚才在access里给“ziduan”建了个索引,速度快了些,运行400次大概1.5秒。【ACCESS】还是2万条记录,有3秒已果不错了。
      

  12.   

    瓶颈是数据库或者数据库引擎网络通讯,Delphi数据库查询几百万记录也比你那个快
      

  13.   

    建议采用三层构架,使用ClientDataSet.
      

  14.   

    数据集每次Close和Open的开销远大于查询的开销,在不优化数据表的情况下,建议把查询语句写成select * from biao where ziduan1 in ('vlu1','vlu2'),一次性把你要的数据全部查询出来,然后在query中循环,效率会远高于你现在的写法进一步的优化效率,就是在biao里面创建ziduan1的非聚集索引,索引中再include你要用的几个字段,又可以提高查询的效率基本上一个几万数据的表查询,一次查询,内存中循环300次,也就不到1秒的效率
      

  15.   

    你们是不是都理解错误了呢?我觉得这个不是优化数据库的问题,而是逻辑概念的问题啊?
    你可以这样做:
        
      ADOQuery1.Close;
      ADOQuery1.SQL.Text:='select x1,x2 from biao ‘; //我想打开一个2万笔的数据表应该慢不到哪里去吧?
      ADOQuery1.Open;a:='emample';   // a 的值需要改变400次,这里就不模拟了,就默认都是这个值
    for i := 1 to 400 do//测试运行400次
     begin
        //查找定位记录
        ADOQuery1.locate('ziduan',a,[]);  //这条语句就是在内存里找了,不关数据库的事了,所以速度会很快。    //返回需要的结果
        jieguo1:=ADOQuery1.FieldByName('x1').AsString;
        jieguo2:=ADOQuery1.FieldByName('x2').AsString;  end;
      

  16.   

    用Filter := true过滤试试
      

  17.   

    你可以一次查出所有的数据,不需要用循环,然后把数据放到一个dictionary里,再用dictionary访问你要的字段
      

  18.   

    我们的产品经常要在上千万数据的表里面查询,一次返回100条记录,也就要求2、3秒就出结果,你说2万条数据,这样的速度可以了?我们要不要活了啊?这个慢跟DELPHI没有关系吧
    事实上,你的select 语句执行后,不是所有的数据都在本地内存的,DEPHI只会把其中的一部分调到内存,觉得楼主在这里钻牛角了。
    所以,把所有的数据SELECT回来,然后LOCATE的方法是可行的。没有必要进行400个CLOSE和OPEN。
    看一下效率是不是提高了?
    对比一下索引前和索引后需要的时间?
    最重要的是减轻了服务器的负担,如果楼猪的原本方法,有几个客户端的话,服务器不都把资源浪费在查询中
      

  19.   

    从头到尾看了一遍。给一个建议:
    1、SQL查询的速度,基本上就是如此了。
    2、你编写一个函数,将查询的结果存入过度性的DataSet中。
    3、此函数定时生成结果。 或在服务器端定时生成。
    4、用户读取DataSet中的值。这样,用户感觉非常快了。只是建议而已!
      

  20.   

    SQL语句的基础还要多练习
    SELECT A.*
    FROM Table
    WHERE EXISTS(SELECT TOP 1 1 FROM biao);
    Exists里面就是你要过滤的条件
    原则,尽量一次性把你需要的数据找出来,返回的字段只要你需要的字段,少用IN,或者LIKE '%SSSS'这样的语句。