解决方案 »

  1.   

    已经用ADOConnection连接数据库了吗?
    连接数据库会很长时间.Adoquery.open正常不会出现这么严重的延迟.另外:
    你的sql语句也可以做出优化:
    1对涉及的查询条件字段建立索引
    2表关联时使用left join, right join, inner join, 减少外联.
      

  2.   

    问题出在exists 
    如果可以用join就不要用exists,影响效率
      

  3.   

    select   top 20  *
    from     (select   sum(xssl) as sl
                       ,sum(xssl * xsdj) as xf
                       ,sum(xssl * (xsdj - dqdj)) as yh
                       ,sum(xfje) as sf
                       ,Re
              from     lbxf
                       ,xmlb
              where    lbbm = kinid
              and exists (select   top 10000   fkZdh
                          from     fkmx
                          where    jZdh = fkZdh
                          and jbbc = @CD_jbbc
                          and Users = @CD_Users
                          and Created <= @CD_end
                          and Created > @CD_Start
                          order by Created desc)
              group by Re) a
             ,xmlb b
    where    a.Re = b.kinid
    order by a.Re
    exists的确 该改用 join
    不同,同样的sql,返回量只是20条
    查询分析器执行 和 程序执行,效率不同,也是不正常
      

  4.   

    据说这是Delphi调用ADO的BUG之一
    加上Adoquery.Prepared := True;试试顺便看看星星
      

  5.   

    exists (select top 10000  fkZdh from fkmx where jZdh=fkZdh and jbbc=@CD_jbbc and Users=@CD_Users and Created<=@CD_end and Created>@CD_Start order  by Created desc) 
    exists后的查询只要返回一条记录也是“True“,没必要使用top 10000,用一个“*”或用“1”等常数都可。
      

  6.   


    Prepared 只是 sql的要不要编译 的差异
    这个时间是很短的,除非是重复执行成千上万次,才有明显差别
      

  7.   

    多用临时表,不要select嵌套.
    临时表可以最大化筛选记录,减少查询次数