我用的数据库是ORACLE 9.2.0.1.0版本,optimizer_mode是:CHOOSE
在执行以下语句的时候:
SQL文1:
select NM_VALIDATION_DISP, VALIDATION_VALUE
  from TABLE_MNG
 where 
 VALIDATION_VALUE between 2 and 9 and NM_VALIDATION = 'v_inst_sts_tp'
 order by VALIDATION_VALUE
正常通过。
但是换成如下语句:
SQL文2:
select NM_VALIDATION_DISP, VALIDATION_VALUE
  from TABLE_MNG
 where 
 NM_VALIDATION = 'v_inst_sts_tp' and VALIDATION_VALUE between 2 and 9
 order by VALIDATION_VALUE就报错了,原因是:SQL文执行从条件前往后执行,VALIDATION_VALUE这个字段里有非数字的字符。于是我将:optimizer_mode改成:ALL_ROWS
SQL文1可以通过,SQL2文却不行了。
原因可能是:SQL文执行从条件后往前执行了吧。不知道有没有表达清楚。请大侠指教,不胜感激。ORACLE 执行计划的问题oraclesql数据库

解决方案 »

  1.   

    还有我在ORACLE11G下也有个同样的数据库,optimizer_mode是:ALL_ROWS,两个条件前后颠倒写法都没问题。
      

  2.   

    执行了:select * from v$sql_plan where object_owner=‘USER’结果是:OBJECT_NAME OPTIMIZER IO_COST FILTER_PREDICATES
    VALIDATION_MNG ANALYZED 2 "NM_VALIDATION"='v_inst_sts_tp' AND TO_NUMBER("VALIDATION_VALUE")>=2 AND TO_NUMBER("VALIDATION_VALUE")<=9
    VALIDATION_MNG ANALYZED 2
    VALIDATION_MNG ANALYZED 2 TO_NUMBER("VALIDATION_VALUE")>=2 AND TO_NUMBER("VALIDATION_VALUE")<=9 AND "NM_VALIDATION"='v_inst_sts_tp'
      

  3.   

    既然VALIDATION_VALUE是字符类型,那就改写为VALIDATION_VALUE BETWEEN '2' AND '9',避免执行TO_NUMBER。