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条记录我觉得这个查询执行的速度很慢,请大家帮我分析一下,看看有什么优化方案没有?

解决方案 »

  1.   

    最快也就创建个全index了:
    create index i_test on assmstrc(left,class2, RIGHT, w2isborrowed) ;
      

  2.   


    Plan 
    SELECT STATEMENT  HINT: RULE 
    2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC 
    1 INDEX RANGE SCAN NON-UNIQUE PDMM31A.ASSMSTRC_RLTLEFTINDEX 这个计划什么意思,我看得不是很透,请帮忙解释一下呗,3克油!
      

  3.   

    如何显示pdmm31a.assmstrc表中创建了那些索引?执行时哪些索引有效,哪些无效?
      

  4.   

    解释计划:先在索引里查找对应值,然后找到后再根据找到的rowid扫描原表(获取其他字段)
    1楼做法是把要获取的其他字段都放在索引里,这样就省略了第二步操作
    如果对应记录很多的话,将会很有效,但索引耗费的空间也是显而易见的3楼的“”是论坛用语:标记(兼有学习,顶贴的意思)
      

  5.   


    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索引应该怎么办?
      

  6.   

    drop index
    create index
      

  7.   

    谢谢!那么针对我上面写的这条sql语句,如何建立索引才最有效呢,我照一楼的建了,速度上好像没有什么改变
    sql语句:SELECT /*+RULE*/class2, RIGHT, w2isborrowed FROM pdmm31a.assmstrc WHERE left='sieczKcpdmtstpdmm31a-bJ1'
      

  8.   

    上面的sql语句中left,class2,right,w2isborrowed都有一定的重复数据
      

  9.   

    这个表分析过吗?
    如果分析过的话,请用下面这个SQL:
    SELECT /*+CAST*/class2, RIGHT, w2isborrowed FROM pdmm31a.assmstrc WHERE left='sieczKcpdmtstpdmm31a-bJ1'楼主的SQL是基于规则的优化器选择,我看表的数据不多,如果表被分析过,最好使用基于成本的优化器.
    left列的数据为:'sieczKcpdmtstpdmm31a-bJ1',数据量应该在表中占不少数据量,因此建议使用我刚才发的SQL。
    基于规则的优化器ORACLE10G已经不怎么支持使用了。。
    ORACLE已经不再为RULE的优化器提供服务和补丁了。
      

  10.   

    千万不用使用RULE优化器。。
    正是因为使用了规则优化器,SQL在运行的时候才使用索引查找数据,因此楼主查询用了150M
    再问一下,楼主在跑这条SQL的时候,服务器有没有别的占很大资源的进程?
      

  11.   

    我试了一下用RULE和COST执行效率并无变化啊,服务器应该没有别的占用很大的资源
      

  12.   

    我把最开始贴出来的索引ASSMSTRC_RLTLEFTINDEX 删掉了,像一楼说的那像建立个全索引,如下:CREATE INDEX  assmstrcindex ON pdmm31a.assmstrc( left,class2,right,w2isborrowed )可是执行计划却变了:Plan
    SELECT STATEMENT  HINT: RULE
    1 INDEX RANGE SCAN NON-UNIQUE SYS.ASSMSTRCINDEX 2 TABLE ACCESS BY INDEX ROWID PDMM31A.ASSMSTRC 
    这条为什么没有了,是不是我索引创建的有问题啊,我重建索引后速度反面慢了,现在执行一次要用230ms了,不懂为什么