SELECT /*+RULE*/class2, RIGHT, w2isborrowed FROM pdmm31a.assmstrc WHERE left='sieczKcpdmtstpdmm31a-bJ1'我执行这句sql语句时,执行计划如下:Plan
SELECT STATEMENT HINT: RULE
2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC
1 INDEX RANGE SCAN NON-UNIQUE PDMM31A.ASSMSTRC_RLTLEFTINDEX 平均耕时在150ms左右。上面的执行计划我看不太懂,之前我对LEFT建立了一个索引,LEFT有一定的重复性,pdmm31a.assmstrc表中有7421条记录我觉得这个查询执行的速度很慢,请大家帮我分析一下,看看有什么优化方案没有?
create index i_test on assmstrc(left,class2, RIGHT, w2isborrowed) ;
Plan
SELECT STATEMENT HINT: RULE
2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC
1 INDEX RANGE SCAN NON-UNIQUE PDMM31A.ASSMSTRC_RLTLEFTINDEX 这个计划什么意思,我看得不是很透,请帮忙解释一下呗,3克油!
1楼做法是把要获取的其他字段都放在索引里,这样就省略了第二步操作
如果对应记录很多的话,将会很有效,但索引耗费的空间也是显而易见的3楼的“”是论坛用语:标记(兼有学习,顶贴的意思)
Plan
SELECT STATEMENT HINT: RULE
2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC
1 INDEX RANGE SCAN NON-UNIQUE PDMM31A.ASSMSTRC_RLTLEFTINDEX 这个执行计划的意思是不是说执行时只有ASSMSTRC_RLTLEFTINDEX 索引是起作用的?如果我想更改ASSMSTRC_RLTLEFTINDEX索引应该怎么办?
create index
sql语句:SELECT /*+RULE*/class2, RIGHT, w2isborrowed FROM pdmm31a.assmstrc WHERE left='sieczKcpdmtstpdmm31a-bJ1'
如果分析过的话,请用下面这个SQL:
SELECT /*+CAST*/class2, RIGHT, w2isborrowed FROM pdmm31a.assmstrc WHERE left='sieczKcpdmtstpdmm31a-bJ1'楼主的SQL是基于规则的优化器选择,我看表的数据不多,如果表被分析过,最好使用基于成本的优化器.
left列的数据为:'sieczKcpdmtstpdmm31a-bJ1',数据量应该在表中占不少数据量,因此建议使用我刚才发的SQL。
基于规则的优化器ORACLE10G已经不怎么支持使用了。。
ORACLE已经不再为RULE的优化器提供服务和补丁了。
正是因为使用了规则优化器,SQL在运行的时候才使用索引查找数据,因此楼主查询用了150M
再问一下,楼主在跑这条SQL的时候,服务器有没有别的占很大资源的进程?
SELECT STATEMENT HINT: RULE
1 INDEX RANGE SCAN NON-UNIQUE SYS.ASSMSTRCINDEX 2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC
这条为什么没有了,是不是我索引创建的有问题啊,我重建索引后速度反面慢了,现在执行一次要用230ms了,不懂为什么