开发者社区> 问答> 正文

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:
screenshot
表结构说明

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以下?

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

    2019-07-17 19:49:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像