读书人

看哪位高手~能解决这个捆饶小弟我好久

发布时间: 2012-03-04 11:13:33 作者: rapoo

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


将 ADOQuery 的cacheSize属性设为大一些, 如1000试试, 不用比这大了
[解决办法]
返回数据记录有多少?
将ADOQuery的CursorLocation 设置为 clUseServer 试试

[解决办法]
别用嵌套,用查询分析器分析下时间花在哪里了。
[解决办法]
将需要查询到的核心表增加适当的索引。
[解决办法]
楼主怎么这么写呢 一个视图不知多好用呢
[解决办法]
直觉:应用视图查询(这是WIN为数据查询供给的最好的方式)

读书人网 >.NET

热点推荐