问题原因:
1.由于数据量
2.表与表之间关系多.
3.总是需要关联查询.并汇集在一起显示出来.  如.1.销售商品明晰表
     2.销售主表表
     3.商品信息表
     4.单位表
     5.供应商表等
     6.......反正很多关系了.
 
提问: 当可户需要组合以上表中信息时,为何有时用ADOQuery 执行存储过程查询时,不超时,有时候超时. ADOQuery的timeout属性为0,SQL server 服务器内的超时设置为0,以上原因应该排除了.是我下面的存储过程效率不好么?但是在查询分析器下执行速度很快啊!!.ADOQuery还有一个准备属性.我望了什么英文了.也没有什么效果.
同样的存储过程 在Delphi的ADOQuery执行效果和PB下执行就不一样呢?
Delphi执行后有时候超时,有时正常.
PB下不超时但 SQL Server 数据库日志飞速增长!!! 郁闷啊~~~ 还的清理.下面是存储过程 .
大家帮我想象.我想是我的存储过程效率不高!!!
create    procedure Find_kc_pf_spxx
(
@KS datetime,
@JZ datetime
)
as --检索指定时间内批发商品信息
select  a.id,
a.C_code,
a.c_code_sp,
b.C_name,
d.C_name as 'C_Sort',
b.c_model as 'C_model',
c.C_name as 'C_unit',
e.c_name as C_code_gys,
a.dec_sum,
a.dec_jg,
a.dec_cb,
a.dec_zk,
a.dec_hj,
(a.dec_cb*dec_sum) as 'dec_cb_hj',
(a.dec_hj-(a.dec_cb*dec_sum)) as ml_hj,
f.c_name as 'C_pfs_name',
a.c_spph,
                b.c_add
from t_kc_pf_dec a 
inner join T_dia_spxx b
with (nolock)
on a.C_code_sp=b.C_code
inner join (select C_code,C_name from T_pub_dia where C_kind in (select C_code from T_sys_dia where C_name='单位信息定义')) c
--with (nolock)
on b.C_unit=c.C_code
inner join (select C_code,C_name from T_pub_dia_kind where C_kind in (select C_code from T_sys_dia where C_name='商品类别信息')) d
on b.C_Sort=d.C_code
inner join (select c_code,c_name from T_kc_dia_gys_xx) e  --供应商
on b.c_gys_code=e.c_code
inner join (select c_code,c_pfs_code from T_kc_pf_main) g
on a.c_code=g.c_code
inner join (select c_code,c_name from T_kc_pfs) f --批发商
on g.c_pfs_code=f.c_code
where a.C_code in (
 select c_code
 from T_kc_pf_main
 where (dt_pfrq between @ks and @jz) and (c_sh='1')
  )
order by a.id

解决方案 »

  1.   

    TADOStoreProc 也不行啊~~~
    不知道那里的原因.
    数据量一大就不稳定了.那为SQL 脚本专家帮我 看看啊~~~~~~~~~~~~~~~救命啊~~~~~~~~~~~~~~~~~~~```
      

  2.   

    首先,尽量少用inner join (根据情况用left join)第二就是尽量不要在查询条件里面用 where ... in (select ...) 记住,很多情况下,代码效率高的执行效率就低(你说的有时有问题有时没有,是根据你条件的结果集决定的,多的话就很慢,容易超时)
      

  3.   

    如果记录集相对固定的可以用snap,这样速度会大大提高。同时在查询语句是根据不同数据库解析的不一样,可把记录少的表放在前面,向后逐渐增多,或者相反,具体的得去测试就知道了。原理跟这个语句有点一样
    if 1<0 and 1<2 then 第一个条件已经是假的了,所以第二个条件就不去处理了。SQL当中也有这种情况,把记录数少的放在前面处理速度更快。
      

  4.   

    应该 用什么样语句来替换 where ...in (select ....)
    查询时间条件在主表上啊.明细表里只有..编号.. 不用 where...in (select ..)不知道怎么查?
     
    还有.上面的语句在查询分析器中非常快。可是到了ADOQuery里有时就超时.而同样的存储过程在PB的调用下没有出现过.但数据库日志增长很快。难道ADOquery没有处理优化?谢谢大家的回复.望高手指点...迷糊啊`
      

  5.   

    比如 A表有id  B表有id
    你要找A有并存在于B表的记录,通常用
    select * from A where A.id in (select id from B)
    当A表本身就是一个复合数据集并且A/B表的数据量都比较大的话,效率就很低了,可以改为下面的写法:
    select a.*,b.id from a left join b on b.id = a.id where b.id is not null
    写起来麻烦点,但效率就高了
      

  6.   

    非常,感谢,dabaicai(小老头) ,我正在重新编写存储过程进行测试...谢谢.
    如果大家还有更有效的解决方法.请在多说一些.我先给加分.
      

  7.   

    请问 我的脚本在 查询分析器下速度很好.就是Delphi调用后不稳定.为什么 ???
    同样的脚本在PB调用非常稳定...
    能有高手在说的仔细点么. 
     这里先 感谢 dabaicai(小老头) 的指点
      

  8.   

    将 ADOQuery 的cacheSize属性设为大一些, 如1000试试, 不用比这大了
      

  9.   

    返回数据记录有多少?
    将ADOQuery的CursorLocation 设置为 clUseServer 试试
      

  10.   

    说说你返回的数据量有多大,delphi用什么方法调用该存储过程的
      

  11.   

    返回的数据量在 50W左右. 
    我使用ADOQuery 执行exec Find_kc_pf_spxx :KS,:JZ我先按ourlin(寒江独钓) 说的方法试试还有我一直不明白将ADOQuery的CursorLocation 指针设置 详细的作用.能告诉我么?
      

  12.   

    直觉:应用视图查询(这是WIN为数据查询供给的最好的方式)