Oracle 12c内联视图评估

时间:2016-12-12 09:29:49

标签: oracle inline-view

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

例如,

cat infile | perl -MList::Util=shuffle -e 'srand 123; print shuffle(<>);' "$@"; > outfile

(解释计划建议将select x from a, b where NOT REGEXP_LIKE (a.column, '[^[:digit:]]') and a.char_column = b.numeric_column; 转换应用于to_number

我认为不仅仅是设计这个&#34;只是工作&#34; (Oracle 11g)。但是,在Oracle 12c中运行时,谓词的顺序并未遵循,因此此查询会因无效数字异常而中断。我知道我可以尝试使用a.char_column提示强制12c按顺序评估谓词

ORDERED_PREDICATES

..或使用select /*+ ORDERED_PREDICATES +*/ x from a, b where NOT REGEXP_LIKE (a.column, '[^[:digit:]]') and a.char_column = b.numeric_column 投射其中一个值进行比较。不利的一面是,to_char可能会运行一百万行。我认为以下内联视图可能是一个更好的解决方案。我保证首先评估内联视图吗?

to_char

1 个答案:

答案 0 :(得分:1)

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

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

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*/