Oracle 12c 内联视图评估



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

例如

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, b
where NOT REGEXP_LIKE (a.column, '[^[: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将上一个查询重写为下一个查询

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

相关内容

  • 没有找到相关文章