oracle 统计查询效率问题

[size=large]select m.*,
ROUND(m.ywc / decode(m.sy, 0, 1, m.sy), 2) * 100 || '%' wcl
from (select distinct t.ssds,
c.corp_name,
(select count(*)
from mw_app.mwt_ud_jxgg_zjh@pms n
where 1 > 0
and n.ssds = t.ssds) sy,
(select count(*)
from mw_app.mwt_ud_jxgg_zjh@pms n
where 1 > 0
and n.ssds = t.ssds
and n.jhzt in
('B47871C3-8B00-42CE-A358-AEE9B24C8D9B',
'BF9803C9-FD26-4947-B7F9-1ED222E70207',
'22E8D811-D44A-4E72-9BBB-60AAE73238B9',
'12F96AD5-531A-4725-AF79-A0C80B57209D')) qx,
(select count(*)
from mw_app.mwt_ud_jxgg_zjh@pms n
where 1 > 0
and n.sfwc = 'T'
and n.ssds = t.ssds) ywc,
(select count(*)
from mw_app.mwt_ud_jxgg_zjh@pms n
where 1 > 0and n.sfwc = 'F'
and n.ssds = t.ssds) wwc
from mw_app.mwt_ud_jxgg_zjh@pms t,
brsys.tb_sys_corporation c
where t.ssds = c.corp_id) m
order by m.sy desc
这张表mw_app.mwt_ud_jxgg_zjh有几万数据,我的这个查询要用很长时间,导致前台的ajax请求失败,想问问师兄师姐们有什么办法[/size]

太多的子查询了,执行计划肯定不好。
即使是本地数据库表查询时间也不会短。
不知道需求是啥,这种查询改起来麻烦。

你这个mw_app.mwt_ud_jxgg_zjh@pms t是采用的DBLINK的方式来查询的,查询的是远程数据库上的表,查询速度本来就慢,这个是瓶颈。不过你这个表才几万条数据,太少了,我之前对几千万上亿条数据的远程数据库表进行过链接查询,如果采用远程数据库链接的方式来查询的话,速度是没有办法提高的,介绍一种解决方案给你吧,将远程数据库的表同步到本地,也就是在本地数据库建一个远程数据库表的副本,并且定时同步,但是这个方法只能针对实时性要求不高的查询。

1、where语句中的1>0不知道它存在的意义,建议删除
2、你的子查询太多了,而且都是操作同一张表的
3、建议你用DECODE函数代替子查询
4、把你的执行计划拿来看看,可以给你分析下

希望能对你有用。