谁能帮我优化这条sql语句?

rottenapple 2007-12-05 05:13:00
我知道它可以优化,至少in关键字就可以。但是我觉得还应该有更好的。。
谁来试试看?
SELECT MODID,MODNAME,PARENTMODID,RELATIVEURL,DISPLAYORDER,MODLEVEL,max(CANEDIT) as CANEDIT,MODSORT
FROM (
SELECT AA.*,BB.CANEDIT
FROM(
SELECT a.MODID,a.MODNAME,a.PARENTMODID,a.RELATIVEURL,a.DISPLAYORDER,b.MODLEVEL,b.modsort
FROM AP_MODS a, TEMP_MOD b
WHERE a.MODID = b.MODID(+)
) AA,AP_MODS_ROLES BB
WHERE AA.MODID = BB.MODID(+)
AND BB.ROLEID in (select ROLEID from AP_USERS_APPS where USERID='1111') -- role

)
GROUP BY MODID,MODNAME,PARENTMODID,RELATIVEURL,DISPLAYORDER,MODLEVEL,MODSORT
ORDER BY MODLEVEL,MODSORT;
...全文
200 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rottenapple 2007-12-12
  • 打赏
  • 举报
回复
物理视图是肯定不行的。。
最里面的selece就是最少的检索而且是最基本的。
看来也只能如此了。
揭帖
xiequanqin 2007-12-12
  • 打赏
  • 举报
回复
SELECT a.MODID,a.MODNAME,a.PARENTMODID,a.RELATIVEURL,a.DISPLAYORDER,b.MODLEVEL,b.modsort,
max(c.CANEDIT) as CANEDIT
FROM AP_MODS a
LEFT JOIN TEMP_MOD b ON a.MODID = b.MODID
LEFT JOIN (SELECT CANEDIT,MODID FROM AP_MODS_ROLES m
WHERE EXISTS (select 1 FROM AP_USERS_APPS
WHERE ROLEID=m.ROLEID AND USERID='1111'
)
) c ON a.MODID=c.MODID
GROUP BY a.MODID,a.MODNAME,a.PARENTMODID,a.RELATIVEURL,a.DISPLAYORDER,b.MODLEVEL,b.modsort
ORDER BY b.MODLEVEL,b.MODSORT;
goodsong 2007-12-11
  • 打赏
  • 举报
回复
视图只是让你理解起来清楚一点儿,对提高效率没有用,除非建物理视图,那样又不能实时。

我觉得你还是先搞清楚到底要做什么
然后找一个等价的做法
比如调整select的顺序
让可以减少记录数的select 先执行
rottenapple 2007-12-11
  • 打赏
  • 举报
回复
上面的能不能做成一个view,然后把USERID='1111'拿出来做成一个参数?
不知道oracle中view可不可以做到这点。。。
Croatia 2007-12-10
  • 打赏
  • 举报
回复
给个表结构,一点测试数据看看。
rottenapple 2007-12-10
  • 打赏
  • 举报
回复
no way?
ding...
rottenapple 2007-12-07
  • 打赏
  • 举报
回复
TEMP_MOD 是个临时表,是存储过程中保存检索数据的。
至于order by,group by,左连接 不用不行啊。。。
因为最内的select是检索临时表,不知道能不能建view 或者其他什么东西优化。。
我的版本是9i
Croatia 2007-12-06
  • 打赏
  • 举报
回复
你现在这样的写法,不要说3个表,你用到的全部4个表和起来,也一样。

你的数据库是什么版本的?
rottenapple 2007-12-06
  • 打赏
  • 举报
回复
三个select可不可以合并呢?
mantisXF 2007-12-06
  • 打赏
  • 举报
回复
呵呵,你把所有的“大家伙”全用上了 ...

最好少用order by,group by,左连接

相关表字段建索引 ...

HelloWorld_001 2007-12-05
  • 打赏
  • 举报
回复
不改结构的话就这样改,结构估计不好修改
就按照楼上的做
wdswcy 2007-12-05
  • 打赏
  • 举报
回复

BB.ROLEID in (select ROLEID from AP_USERS_APPS where USERID='1111')

改为
exists (select 1 from AP_USERS_APPS ap where bb.roleid=ap.roleid and USERID='1111')


17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧