oracle版本 11
OPTIMIZER_FEATURES_ENABLE = 10.2
如下sql
select 
  to_date(col1,'yyyymmdd')
 from (
     select 
             to_char(table1.CUR_MON, 'YYYYMM') || '01' as col1
     from
             table1
     where
             table1.CUR_MON is not null
  )table1.CUR_MON  是 date 类型,, 有null值的数据,
现在的问题是在客户环境,执行sql 会报错 ora-01840 ,,如果在客户环境 把 OPTIMIZER_FEATURES_ENABLE 改成 9.2, 就不会报错了.想请教各位 为什么会报错,条件里已经去除null的数据了
而且这段sql 我换成测试环境 这个错误是无法再现的...只有在客户环境才会出错.
公司测试环境和客户环境的数据库版本是一样的如果不修改sql,,, 从oracle优化策略角度,比如做表分析什么的 可不可以解决这个错误,,总是感觉这个错误很奇怪,,不应该发生.因为客户环境 暂时无法访问,所以不能去试验,,现在客户那边想知道 错误原因和解决办法(不修改sql)
另外说下关于 ora-01840  错误,,,可以执行这段sql select  to_date('01','YYYYMMDD') from dual;

解决方案 »

  1.   

    ding i xia
      

  2.   

    OPTIMIZER_FEATURES_ENABLE  会影响查询优化器的执行,但抛出异常,没遇到过。
    我建议从数据层再分析一次,看是否有异常的数据
      

  3.   

    谢谢你的回复,
    数据层面没有问题,,date类型的数据除了合法日期值,就是null了,所以数据是没问题的.
    这里应该是涉及到 优化器和优化模式的选择,,
    在oracle9i版本里 optimize_mode是CHOOSE,根据表是否有统计信息来决定选择CBO还是RBO优化.
    如果没有统计信息,并且optimize_mode是RULE的时候 sql执行就报错了,,我只分析到这里,至于更深的原因我也不知道了.
    不知道还有没有人需要这种问题.
      

  4.   

    为了一句SQL,让CBO跨两个大版本降级,是作死的行为……同意2#的说法:仔细查查数据是否有问题,另外可以尝试修改SQL绕过这个问题