加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 百科 > 正文

Oracle 12c内联视图评估

发布时间:2021-01-11 18:48:51 所属栏目:百科 来源:网络整理
导读:很久以前,在一个远在很远的数据库中,开发人员编写了一个查询,其中他/她依赖于编写谓词的顺序. 例如, select x from a,b where NOT REGEXP_LIKE (a.column,'[^[:digit:]]') and a.char_column = b.numeric_column; (解释计划建议将to_number转换应用于a.cha

很久以前,在一个远在很远的数据库中,开发人员编写了一个查询,其中他/她依赖于编写谓词的顺序.

例如,

select x
  from a,b
 where NOT REGEXP_LIKE (a.column,'[^[:digit:]]')
   and a.char_column = b.numeric_column;

(解释计划建议将to_number转换应用于a.char_column)

我认为不仅仅是设计这个“正常工作”(Oracle 11g).但是,在Oracle 12c中运行时,不遵循谓词的顺序,因此此查询会因无效数字异常而中断.我知道我可以尝试通过使用ORDERED_PREDICATES提示强制12c按顺序评估谓词

select /*+ ORDERED_PREDICATES +*/ x
  from a,'[^[:digit:]]')
   and a.char_column = b.numeric_column

..或使用to_char转换其中一个值进行比较.缺点是to_char可能会运行一百万行.我认为以下内联视图可能是一个更好的解决方案.我保证首先评估内联视图吗?

select x
  from b
  inner join (
              select only_rows_with_numeric_values as numeric_column
                from a 
               where NOT REGEXP_LIKE (a.column,'[^[:digit:]]')
             )  c
     on c.numeric_column = b.numeric_column;

解决方法

关于谓词顺序 – 请看 https://jonathanlewis.wordpress.com/2015/06/02/predicate-order-2/

根据doc(https://docs.oracle.com/database/121/SQLRF/queries008.htm#SQLRF52358),你应该使用rownum将你的上一个查询重写为next

select x
  from b
  inner join (
              select only_rows_with_numeric_values as numeric_column,rownum
                from a 
               where NOT REGEXP_LIKE (a.column,'[^[:digit:]]')
             )  c
     on c.numeric_column = b.numeric_column;

禁止查询取消或仅使用提示/ * no_unnest * /

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读