问题原因:
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.由于数据量
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
不知道那里的原因.
数据量一大就不稳定了.那为SQL 脚本专家帮我 看看啊~~~~~~~~~~~~~~~救命啊~~~~~~~~~~~~~~~~~~~```
if 1<0 and 1<2 then 第一个条件已经是假的了,所以第二个条件就不去处理了。SQL当中也有这种情况,把记录数少的放在前面处理速度更快。
查询时间条件在主表上啊.明细表里只有..编号.. 不用 where...in (select ..)不知道怎么查?
还有.上面的语句在查询分析器中非常快。可是到了ADOQuery里有时就超时.而同样的存储过程在PB的调用下没有出现过.但数据库日志增长很快。难道ADOquery没有处理优化?谢谢大家的回复.望高手指点...迷糊啊`
你要找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
写起来麻烦点,但效率就高了
如果大家还有更有效的解决方法.请在多说一些.我先给加分.
同样的脚本在PB调用非常稳定...
能有高手在说的仔细点么.
这里先 感谢 dabaicai(小老头) 的指点
将ADOQuery的CursorLocation 设置为 clUseServer 试试
我使用ADOQuery 执行exec Find_kc_pf_spxx :KS,:JZ我先按ourlin(寒江独钓) 说的方法试试还有我一直不明白将ADOQuery的CursorLocation 指针设置 详细的作用.能告诉我么?