gpt4 book ai didi

Oracle 12c 内联 View 评估

转载 作者:行者123 更新时间:2023-12-01 04:51:01 24 4
gpt4 key购买 nike

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

例如,

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 中运行时不遵守谓词的顺序,因此此查询因无效数字异常而中断。我知道我可以尝试强制 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可以操作一百万行。我认为以下内联 View 可能是更好的解决方案。我能保证首先评估内联 View 吗?
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/

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

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

关于Oracle 12c 内联 View 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41097702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com