下面的sql语句性能很低,查询效率很慢,请大侠帮我优化下,谢谢,也可以帮我分析下sql的功能:
select t.org_id, t.org_name, w.parent_org_id, w.denorm_level from dfnd_org_msg
t,dfnd_org_info w, (select org_id from dfnd_org_info where parent_org_id ='50000000' ) x
where x.org_id = t.org_id(+) and x.org_id = w.org_id(+)
and ((t.org_id<>'50000000' and w.denorm_level='1' ) or (t.org_id='50000000' and w.denorm_level=0))
select t.org_id, t.org_name, w.parent_org_id, w.denorm_level from dfnd_org_msg
t,dfnd_org_info w, (select org_id from dfnd_org_info where parent_org_id ='50000000' ) x
where x.org_id = t.org_id(+) and x.org_id = w.org_id(+)
and ((t.org_id<>'50000000' and w.denorm_level='1' ) or (t.org_id='50000000' and w.denorm_level=0))
解决方案 »
- 大师请进如何按周进行分组
- oralce 新建用户grant dba 然后revoke DBA后为何还能登陆?
- oracle11g 如何 禁止用户导出数据
- START WITH CONNECT BY 棘手问题
- 求助,如何写oracle存储过程来读取excel文件!
- oracle中是否可以像SQL Server2000一样开发扩展存储过程调用外部DLL?
- 在windows下如何启动数据库?
- 请教:语句级触发器中能够获得被影响的记录数吗?
- Oracle与Sql Server的性能测试比较
- 安装oracle10g在window server 2008 r2 出现
- 请教一条查询语句(建表语句,初始化数据已做好)
- 关于一个用户操作日志记录分类插入Oracle数据库的问题
把执行计划贴出来看看..
------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
--这样也许能快点,还有 dfnd_org_info 的 parent_org_id 最好有索引
--因为看不到执行计划,只能大致了
select
t.org_id,
t.org_name,
w.parent_org_id,
w.denorm_level
from
dfnd_org_msg t,
dfnd_org_info w,
(select org_id from dfnd_org_info where parent_org_id ='50000000' ) x
where
x.org_id = t.org_id(+)
and x.org_id = w.org_id(+)
and t.org_id <>'50000000' and w.denorm_level='1'
union all
select
t.org_id,
t.org_name,
w.parent_org_id,
w.denorm_level
from
dfnd_org_msg t,
dfnd_org_info w,
(select org_id from dfnd_org_info where parent_org_id ='50000000' ) x
where
x.org_id = t.org_id(+)
and x.org_id = w.org_id(+)
and t.org_id='50000000' and w.denorm_level=0
我建议楼主用绑定变量的形式做。这样SQL解析效率变高
1、select * from emp where empno=123;
2、select * from emp where empno:=emp_no; 1句中查询员工编号是123的员工信息,Oracle第一次经过分析编译后执行。但如果下次还要再查询编号为456和789的员工信息时,Oracle将会再将这句SQL分析编译,然后再执行。 再看2句,首先定义变量emp_no,我们将123赋给变量,第一次的时候也是经过分析编译后再执行,但是到了接下来再想查询其他员工编号的信息时,Oracle会将第一次编译后的查询方案(在第一次编译执行之后已经储存在共享池中)用来进行下一次的查询。 在Oracle中,分析一个带有硬编码变量的语句(称为硬分析)要明显的比重用一个已经分析过的查询方案(软分析)要花费更长的时间和耗费更多的资源。如果使用绑定变量,提交引用相同变量的完全相同的查询的人将会使用共享池中的编译方案,只需编译子例程一次,就可以重复使用。这样不仅可以使用较少的时间,而且可以减少锁存时间,降低锁存频率。这将会提高软件性能,大大提高可伸缩性。
条件x.org_id = t.org_id(+) and x.org_id = w.org_id(+)根本不能将这两张表 dfnd_org_msg t,dfnd_org_info w关联起来.
我想首先要将这两张表正确关联起来.
然后试试将
((t.org_id <>'50000000' and w.denorm_level='1' ) or (t.org_id='50000000' and w.denorm_level=0))
改成
decode(t.org_id, '50000000', 0, 1) = w.denorm_level