select security_report_resource.res_id
  from security_report_resource
 where security_report_resource.role_id in
       (select r.role_id
          from security_user_role r,security_report_resource
         where r.account = 'longnan')上面这局sql   其中 子查询的 数据量很小 
  但是 security_report_resource表的 数据量很大。 导致 查询速度很慢。
有什么好的优化方法吗。

解决方案 »

  1.   

    你这个肯定慢
    select security_report_resource.res_id
       from security_report_resource
      where  exists (select r.role_id
               from security_user_role r,security_report_resource
              where r.account = 'longnan' and  security_report_resource.role_id = select r.role_id)你这样试下
      

  2.   

    这SQL不对吧..子查询里的,security_report_resource有什么用,直接去掉好了啊
    select security_report_resource.res_id
      from security_report_resource
     where security_report_resource.role_id in
           (select r.role_id
              from security_user_role r
             where r.account = 'longnan')
      

  3.   

    发错了  
    select security_report_resource.res_id
      from security_report_resource
     where security_report_resource.role_id in
           (select r.role_id
              from security_user_role r
             where r.account = 'longnan')  sql就是这样的
      

  4.   

    select /*+ leading(b) use_hash(a)*/a.res_id
      from security_report_resource a, security_user_role b
      where b.role_id = a.role_id
      and b.account = 'longnan'
    试试这个呗,另外,返回的记录大概占security_report_resource 的多少,占的多用全表扫描,占的少就走索引.
      

  5.   

    security_report_resource  数据量1100W  我查到了 30多W 有索引的
      

  6.   

      这个sql 我之前试过,效率基本相同
      

  7.   

    那看看执行计划有没有走索引,没有的话就加个hint上去让他走索引试试
      

  8.   

    那就坐等大神出现了......个人觉得SQL没地方优化了,剩下是DBA的事了,搞搞高水位,群集因子神马的..