知道大家可能看得不太方便,简单一点就是有一个主表(appeal),和一个码表(tclass),主表和码表里面大慨有10次的关联,查询速度很慢,每一次查询大慨要花15钞左右,但数据量也不大,只有10条而以,为什么为这么慢!我已经把他做成一个视图了,但也很慢,盼能解决。
如果有更好的方法来解决这个问题,请高手给提示

解决方案 »

  1.   

    1.首先tuser s这个表没有关联条件。
    2.只有10条记录是指表中只有10条还是只查出10条?如果表tclass 中记录不是太多,并且在tclassid和tinnerid这两个字段上建有索引,应该不会太慢。
      

  2.   

    www.itpub.net上的一篇文章,不知道对于这个问题,有没有很好的参考。
    http://www.itpub.net/showthread.php?s=e8259361eca6e9870354a41793897&threadid=126541主题:关于CBO对于执行计划的影响,一个实际分析的过程
    大致的内容:
    因为oracle要进行CBO分析,并且依此选择最佳的优化计划,但是,如果连接的过多的表,会造成CBO分析速度很慢,导致查询变慢。解决方法,用ordered hints,简化,不让oracle进行优化,使用我们指定的顺序,然后快速的给出结果。然后问题迎刃而解。
    在有的系统视图查询中,很多时候会出现问题,比如以下的SQL: 
    select a.username, a.sid, a.serial#, b.id1 
    from v$session a, v$lock b 
    where a.lockwait = b.kaddr 
    / 这个语句用来查找锁,在Oracle7的年代,这样的SQL语句执行的很快,但是在Oracle8以后的数据库,如果碰巧你用的是CBO,那么这样的语句执行结果可能是Hang了(其实不是死了,只是很多人没有耐心等而已),在Oracle7里,这样的语句毫无疑问使用RBO,很快你就可以得到执行结果。可以对于CBO,你所看到的两个视图,对于数据库来说,实际上是6个表,单只6个表的可能顺序组合就有6!(720)种,数据库时间都消耗在计算这些执行路径上了,所以你得到的就是hang的结果。 
    最简单的解决办法就是使用rule提示,或者使用ordered提示
    初试化参数对于执行计划的影响 
    有几个初试化参数对于多表连接的执行计划有重要的关系。 在Oracle 8 release 8.0.5中引入了两个参数OPTIMIZER_MAX_PERMUTATIONS 和 OPTIMIZER_SEARCH_LIMIT optimizer_search_limit参数指定了在决定连接多个数据表的最好方式时,CBO需要衡量的数据表连接组合的最大数目。 
    该参数的缺省值是5。 
    如果连接表的数目小于optimizer_search_limit参数,那么Oracle会执行所有可能的连接。可能连接的组合数目是数据表数目的阶乘。 我们刚才有7张表,那么有7!(5040)种组合。 optimizer_max_permutations参数定义了CBO所考虑的连接排列的最大数目的上限。 
    当我们给这个参数设置很小的一个值的时候,Oracle的计算比较很快就可以被遏制。然后执行计划,给出结果。 optimizer_search_limit参数和optimizer_max_permutations参数和Ordered参数不相容,如果定义了ordered提示,那么optimizer_max_permutations参数将会失效。 
    实际上,当你定义了ordered提示时,oracle已经无需计算了。
      

  3.   

    多谢楼上几位说明,
    首先我的tuser s已和主表相关联u.writer=s.user_id 
    第二我主表数据里面只有10条数据,tclass表里面也不是很多,只有70几条数据
      

  4.   

    应该不会很慢啊,7表关联,每表100条数据,应该不超过1秒钟。
    注意,表连接放在最前面,其他的过滤条件放在后面,大的表发在前面,检查7个表上的索引情况。
     WHERE d.tclassid=3 and d.tinnerid=u.appealtype and u.writer=s.user_id and k.tclassid=4 and k.tinnerid=u.question_type and t.tclassid=5 and t.tinnerid=u.question_why and c.tclassid=6 and c.tinnerid=u.NOWOWNER_TYPE and l.tclassid=7 and l.tinnerid=u.APPEALSTATUS and a.tclassid=9 and a.tinnerid=u.appeal_area and h.tclassid=15 and h.tinnerid=u.appeal_level and u.appealstatus=3 ORDER BY u.appealno;改为
     WHERE d.tinnerid=u.appealtype and t.tinnerid=u.question_why  and             
    h.tinnerid=u.appeal_level and u.writer=s.user_id and 
    a.tinnerid=u.appeal_area  k.tinnerid=u.question_type and 
    l.tinnerid=u.APPEALSTATUS  and c.tinnerid=u.NOWOWNER_TYPE and 
    t.tclassid=5 and c.tclassid=6 and l.tclassid=7 and 
    a.tclassid=9 and d.tclassid=3 and k.tclassid=4 and 
    h.tclassid=15 and u.appealstatus=3 
    ORDER BY u.appealno;
    肯定会好些,搂住在仔细检查一下吧。