数据库为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:
表结构说明
woman表:妇女信息
v_manage_normal_woman:在woman表上建立的视图,where col1=xxx and col2=xxx,这两个字段都有索引
marriage_info:婚姻信息表,有womanId和manId字段,分别关联两张表,这两个外键id字段都有索引
man:男方信息表
org:组织结构表,其中inner_code表示代码,下级的代码以上级为前缀。woman表中有orgId字段与这张表关联,orgId字段有索引。
现在的情况是,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条记录之后再做关联。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。