首页 > oracle的sql优化问题

oracle的sql优化问题

数据库为oracle,若干张表关联,要查询每页10条的分页数据

sql如下:

    select * from (select t.*, rownum rn from (select 
*
 from 
V_MANAGE_NORMAL_WOMAN W
left join MARRIAGE_INFO M on (W.ID=M.WOMAN_ID)
LEFT JOIN MAN N on (M.MAN_ID=N.ID)
left join org o1 on (o1.id=w.MANAGE_UNIT_ID)
left join s_code c on (c.typecode='SYNCHRONIZE_STATE' AND C.CODE=W.SYNCHRONIZE_STATE)
 where m.STATE='COMMON'
 and o1.inner_code like
'310%'

 order by W.id) t where rowNum <= 10) where rn > 0

explain这条sql:

表结构说明

现在的情况是,310这个单位下面的数据有大约30w条数据,要大约40s才能取到这10条数据。
如果改为查询下级单位,如310001001,这个单位下只有大约1000条数据,取前10条就可以在0.1s以内。

请问大家,怎样能把所有的查询都优化到1s以下?


我的思路是在逻辑上对sql进行重写,根据执行计划,过多的NL循环是造成大数据量时速度慢的原因。
1、MARRIAGE_INFO,org,s_code这三张表,尽管写的是left join,但在where条件中有这三个表字段的限制条件,因此可以改成inner join。
2、LEFT JOIN MAN的语句,对输出结果的行数无影响,为减少NL循环的次数,可以在限制在10条记录之后再做关联。

【热门文章】
【热门文章】