知道大家可能看得不太方便,简单一点就是有一个主表(appeal),和一个码表(tclass),主表和码表里面大慨有10次的关联,查询速度很慢,每一次查询大慨要花15钞左右,但数据量也不大,只有10条而以,为什么为这么慢!我已经把他做成一个视图了,但也很慢,盼能解决。
如果有更好的方法来解决这个问题,请高手给提示
如果有更好的方法来解决这个问题,请高手给提示
解决方案 »
- linux安装oracle11出现问题请指教。
- length函数影响性能问题
- 有关rman进行数据备份和恢复的问题
- Oracle 10g 和 Oracle9i 比较,变化大吗?(从使用及工具界面来说)
- oracle启动不了
- 那些oracle的书籍比较经典?
- 菜鸟提问:我现在有个系统每天可能最多的一个表要入库20万条纪录,该怎么处理呢?
- 求助:RedHat9(shrike)下安装ORACLE9I时LINK至82%停滞
- qingwen 一个问题
- Oracle中的递归
- 如何把一张表中的两个字段的数据加上表名倒入到另外一张表中?SQL语句如何写?
- 想在存储过程里实现当满足一定条件时,弹出对话框让用户作完处理后再往下执行
2.只有10条记录是指表中只有10条还是只查出10条?如果表tclass 中记录不是太多,并且在tclassid和tinnerid这两个字段上建有索引,应该不会太慢。
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已经无需计算了。
首先我的tuser s已和主表相关联u.writer=s.user_id
第二我主表数据里面只有10条数据,tclass表里面也不是很多,只有70几条数据
注意,表连接放在最前面,其他的过滤条件放在后面,大的表发在前面,检查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;
肯定会好些,搂住在仔细检查一下吧。