看哪位高手~能解决这个捆饶小弟我好久的数据库查询速度和超时有关问题!专家进来啊

看谁~能解决这个捆饶我好久的数据库查询速度和超时问题!!!!!!!!!!专家进来啊~~~~~~~~~``
问题原因:
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




------解决方案--------------------
首先,尽量少用inner join (根据情况用left join)

第二就是尽量不要在查询条件里面用 where ... in (select ...) 记住,很多情况下,代码效率高的执行效率就低(你说的有时有问题有时没有,是根据你条件的结果集决定的,多的话就很慢,容易超时)
------解决方案--------------------
如果记录集相对固定的可以用snap,这样速度会大大提高。同时在查询语句是根据不同数据库解析的不一样,可把记录少的表放在前面,向后逐渐增多,或者相反,具体的得去测试就知道了。

原理跟这个语句有点一样
if 1 <0 and 1 <2 then 第一个条件已经是假的了,所以第二个条件就不去处理了。SQL当中也有这种情况,把记录数少的放在前面处理速度更快。
------解决方案--------------------