求大神分析下这条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)
展开
 我来答
hcao_sz
2012-12-17 · TA获得超过173个赞
知道答主
回答量:124
采纳率:0%
帮助的人:95.4万
展开全部
left join的sql写法倒是没有什么大问题,我想到的是以下三点:

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列加索引试试。
视图的语句也没什么问题
晕逍遥
2012-12-17 · TA获得超过457个赞
知道小有建树答主
回答量:250
采纳率:0%
帮助的人:273万
展开全部
主要的cost集中在那个tborder的全表扫描了,在这个表上面建个索引会好些
还有你这个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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
szm341
2012-12-17 · TA获得超过6725个赞
知道大有可为答主
回答量:5005
采纳率:100%
帮助的人:5087万
展开全部
去掉order by,外层的count(*)换到内测
追问
把外层count(*)放到内侧,在不去排序前是很快的,去掉排序反而非常慢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gy93108083
2012-12-17 · TA获得超过283个赞
知道小有建树答主
回答量:665
采纳率:50%
帮助的人:269万
展开全部
有两个LEFT JOIN ,先查下是不是数据量太大,然后再看left join 的速度,而且你求合计的话 字段的排序好像是没有用的吧~
追问
其实这个是分页语句查询总数语句。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式