下面的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)) 
 

解决方案 »

  1.   


    把执行计划贴出来看看..
    ------------------------------------------------------------------------------
    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
      

  2.   


    --这样也许能快点,还有 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 
      

  3.   

    楼上的说效率高在哪?(除了索引外)
    我建议楼主用绑定变量的形式做。这样SQL解析效率变高
      

  4.   

    举个例子:
         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中,分析一个带有硬编码变量的语句(称为硬分析)要明显的比重用一个已经分析过的查询方案(软分析)要花费更长的时间和耗费更多的资源。如果使用绑定变量,提交引用相同变量的完全相同的查询的人将会使用共享池中的编译方案,只需编译子例程一次,就可以重复使用。这样不仅可以使用较少的时间,而且可以减少锁存时间,降低锁存频率。这将会提高软件性能,大大提高可伸缩性。
      

  5.   


    条件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
      

  6.   

        优化文档   http://download.csdn.net/source/1820881  ,http://download.csdn.net/source/1820888,
      

  7.   

    像这种sql优化,一定要贴出执行计划的,这样大家才能帮你找原因
      

  8.   

    用“<>”是限制了索引使用,全表扫