求大神分析下这条sql语句为什么执行很慢?
selectcount(*)from(select*fromtbmissionmleftjointborderoonoid=moidleftjoinlast_dispos...
select count(*)from (select *
from tbmission m
left join tborder o
on oid = moid
left join last_dispose_of_mission d
on dmid = mid
left join full_depart f
on obookdid = f.did
where ocategory = 1
and mstate = 8
and ostate = 2
and mtrace = 1
order by ddisposetime desc, oid desc) 展开
from tbmission m
left join tborder o
on oid = moid
left join last_dispose_of_mission d
on dmid = mid
left join full_depart f
on obookdid = f.did
where ocategory = 1
and mstate = 8
and ostate = 2
and mtrace = 1
order by ddisposetime desc, oid desc) 展开
展开全部
left join的sql写法倒是没有什么大问题,我想到的是以下三点:
1.既然表有了别名,引用列的时候就应该采用别名的方式,如:mid->m.mid,这样可以一定程度上避免不必要的解析所花费的开销时间。
2.看你的执行计划,发现好多表都是全表扫描,在这些表的关联列上建好合适的索引。
3.最后,不要忽视你视图所关系表的优化。
先就这么多吧,你先试试看
1.既然表有了别名,引用列的时候就应该采用别名的方式,如:mid->m.mid,这样可以一定程度上避免不必要的解析所花费的开销时间。
2.看你的执行计划,发现好多表都是全表扫描,在这些表的关联列上建好合适的索引。
3.最后,不要忽视你视图所关系表的优化。
先就这么多吧,你先试试看
更多追问追答
追问
last_dispose_of_mission 视图
select dmid, did, ddisposeresult, djbrmc, djbrdh,(case when trunc(ddisposetime)=trunc(sysdate)
then ddisposetime else sysdate-1 end) ddisposetime from tbdispose
where did in (select max(did) from tbdispose where ddisposetype 2 group by dmid);
追答
tbdepart表大吗?在表tbdepart的dparent列上加索引。
表tbdispose的did和dmid列加索引试试。
视图的语句也没什么问题
展开全部
主要的cost集中在那个tborder的全表扫描了,在这个表上面建个索引会好些
还有你这个SQL不全,底层的视图sql都没贴上来,如果业务没错的话,left join写法就是这样了
还有你这个SQL不全,底层的视图sql都没贴上来,如果业务没错的话,left join写法就是这样了
追问
full_depart视图
select did,ltrim(sys_connect_by_path(dname,'->'),'->') full_departname
from tbdepart connect by prior did=dparent start with length(did)=4
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去掉order by,外层的count(*)换到内测
追问
把外层count(*)放到内侧,在不去排序前是很快的,去掉排序反而非常慢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有两个LEFT JOIN ,先查下是不是数据量太大,然后再看left join 的速度,而且你求合计的话 字段的排序好像是没有用的吧~
追问
其实这个是分页语句查询总数语句。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询