看哪位高手~能解决这个捆饶小弟我好久的数据库查询速度和超时有关问题!专家进来啊
看谁~能解决这个捆饶我好久的数据库查询速度和超时问题!!!!!!!!!!专家进来啊~~~~~~~~~``
问题原因:
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当中也有这种情况,把记录数少的放在前面处理速度更快。
------解决方案--------------------
问题原因:
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当中也有这种情况,把记录数少的放在前面处理速度更快。
------解决方案--------------------