一个关于SQL嵌套查询的问题(100分)

S

sanini

Unregistered / Unconfirmed
GUEST, unregistred user!
A表是主表,字段有:idn(关键字),产品名称,产品数量...
B表,有字段:idn,a_idn(记录A表的关键字),工序,工时...
A表与B表是一对多的关系,
我想取到A表的明细及B表相关的总工时
sele aa.* from a aa left outer join
(select a_idn,sum(工时) from b group by a_idn) bb on aa.idn=bb.a_idn
这样虽然取得到我要的结果,可是速度很慢,尤其是我还有其它的表需要这样连接,一层套一层,导致速度奇慢无比,二千多条数据,要七八分钟才得到结果.这样肯定不行.
请问应该怎么写才能提高查询速度?急盼高手提点
 
不应该啊,我觉得1s内就应该搞定,就这么一个查询,没有别的么。
还有你说的两千多条是之A表,还是B表?
 
语句并不复杂,不应该市语句的问题
 
A表加了条件才二千多条数据,今天客户打电话来说,查询时提示超时链接,我用SQL调试发现
就是这个问题,左链接套了六层,一层比一层慢,最后就超时了!
 
当然套一层左链接,慢是慢点,但还能出来,但是套多了就会链接超时!!!有没有改善办法?
实在没法子只好用循环了,惨~~~~~~
 
你用视图试试
 
你的业务逻辑很复杂么,应该不至于7,8分钟的,不行的话,你就建临时表吧,把中间结果放进去。
 
......如果只是单纯的表与表链接速度很快,可是与GROUP by的统计结果再左链接速度就明显慢,我试试把统计做成用视图后再链接会不会快
 
我的表不复杂,就是主表的[客户,加工类型,项目名称]都记的是代码,要中文信息,得在另三个对照表里取,还有要两个统计结果:到货数和加工工时,分别汇算自另外两个表.
所以左链接套了六层...
 
视图是不会提高效率的,它只是为了控制权限,或是查询格式。
 
不要使用LEFT OUTER JOIN
效率很低
你这样写吧
sele aa.* from a aa,
(select a_idn,sum(工时) from b group by a_idn) bb where aa.idn=bb.a_idn
 
sele aa.* from a aa,
(select a_idn,sum(工时) from b group by a_idn) bb where aa.idn=bb.a_idn
这样写有一个问题,不能把A表全部的数据显示出来呀
 
能不能用存储过程呢?
 
有这么夸张吗?感觉SQL语句不复杂,我更复杂的都写过,都用上游标了也没有这么慢啊。要不LZ用临时表试一下,临时表记录B表的总工时,这样可能会好一点把
 
这种情况有一个通用的解决办法:根据情况你建立一个或者多个临时表,因为每个临时表数据量都不多,所以不会出现数据库链接超时的情况,万一数据量比较大,执行时间比较久,你还可以用进度条标识进度.
 
可以这样
select a.产品名称,a.产品数量 sum(b.工时)
from A表 a,B表 b
where a.idn = b.a_idn
group by a.产品名称,a.产品数量
 
是不复杂,可能是左链接套得太多,尤其和GROUP by的子查询进行左链接,会影响查询速度.
临时表我一直没敢用,
SELECT * INTO #tmp FROM 表,
如果网络个多个用户同时查询,执得这条语句会不会冲突啊?临时表会自动删掉吧?
 
不会冲突的,会话结束就删除了。
 
临时表是微软都建议尽量避免使用,用了肯定慢
优化一下索引试试
用查询分析器的执行计划看看慢在哪儿
 
我试过了,普通表左链速度很快,就是和GROUP by的子查询进行左链接,会影响查询速度,
看来没有什么好办法了,我还是做循环得了~~~~~
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部