我的一张视图(v_b_aj),sql如下:
select b.systemid,b.A1,b.A2,a.departmentcode,a.sszdcode from b_aj a,ps_aj b where a.systemid=b.systemid
其中ps_aj是一个同义词,通过数据链路链接(千兆网络)到其他物理数据库中的b_ab表。b_aj、ps_aj都有20万数据。然后我基于上述视图执行下列语句:
select * from v_b_aj where sszdcode='44060655'
非常慢,要160秒才能执行完成如果我执行下列语句,非常快,零点几秒就执行完成了,(返回17条记录)。
select * from b_aj where sszdcode='44060655'我单独执行下列语句也很快,也是零点几秒就完成,返回200条记录
select * from ps_aj where A1='13060351'
也就是单独查询b_aj,ps_aj都很快,就是执行关联查询就很慢
select * from v_b_aj where sszdcode='44060655'
非常慢,要160秒才能执行完成请问各位高手如何解决。

解决方案 »

  1.   

    那是自然,你视图也是句SQL,相当把所有数据全取出来,然后再取你需要的数据,当然慢喽
      

  2.   

    你这样查询,还不直接sql
    select b.systemid,b.A1,b.A2,a.departmentcode,a.sszdcode 
           from b_aj a,ps_aj b 
           where a.systemid=b.systemid 
            and  sszdcode='44060655' 
            这样远比你视图里取出来快
    你用视图相当于先取出20万条纪录,然后再取出17条纪录
      

  3.   

    select b.systemid,b.A1,b.A2,a.departmentcode,a.sszdcode 
          from b_aj a,ps_aj b 
          where a.systemid=b.systemid 
            and  sszdcode='44060655' 
    更惨,用了206秒。不知是何原因。
      

  4.   

    你把两个表的顺序换一下看看,另外sszdcode上面有索引吗?
    select b.systemid,b.A1,b.A2,a.departmentcode,a.sszdcode 
          from ps_aj b ,b_aj a
          where a.systemid=b.systemid 
            and  sszdcode='44060655' 
      

  5.   

    sszdcode字段以及ps_aj,b_aj两张表的systemid字段都建了索引,我把两张表的顺序换了一下,查询速度有所改善,可是还要141秒。
      

  6.   

    首先需要知道表结构、主键、索引等情况
    目前这个问题已经不是使用试图变慢的问题了,只就转换为SQL调优我看更合适。
      

  7.   

    20万数据不算多,160太慢了,不过还要考虑到网络延迟。systemid和sszdcode有没有建索引,有没有对表进行分析,最好把执行计划贴出来。
      

  8.   

    网络肯定没有问题,千兆网。systemid和sszdcode都有索引。还有如何查看执行计划?
      

  9.   

    如果是在sqlplus中的话可以这样:set autotrace on
      

  10.   

    我在sqlplus中敲入set autotrace on
    报下列错误:
    SP2-0613:无法验证PLAN_TABLE格式或实体
    SP2-0611:启用EXPLAIN报告时出错
      

  11.   

    请参照这个链接的做法:http://www.itpub.net/viewthread.php?tid=912622
      

  12.   

    connect sys  
    @$ORACLE_HOME/rdbms/admin/utlxplan.sql  
    create public synonym plan_table for plan_table;  
    grant all on plan_table to public;  
      
    @$ORACLE_HOME/sqlplus/admin/plustrce/plustrce.sql
    grant plustrace to public;  当执行grant all on plan_table to public;与grant plustrace to public;  时报错
      

  13.   

       關注,sql是否還可作優化呢
      

  14.   


    如果按楼主的说话:那就不要用VIEW
    把SQL写成select * from
    (
    select * from b_aj where sszdcode='44060655'..... ) a,
    ( select * from ps_aj where A1='13060351'..... ) bwhere a.XX=b.XXxa,b 表里的条件写多点,以减少a b表记录数为优先..
      

  15.   

    select * from
    (
    select * from b_aj where sszdcode='44060655'..... ) a,
    ( select * from ps_aj where A1='13060351' and sszdcode='44060655'..... ) bwhere a.sszdcode=b.sszdcode a.XX=b.XXx.....