![](/img/trans.png)
[英]Oracle 12c Subquery Factoring Inline View now has bad plan?
[英]Oracle 12c Inline View Evaluation
很久以前,在一個遠在很遠的數據庫中,開發人員編寫了一個查詢,其中他/她依賴於編寫謂詞的順序。
例如,
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
將上一個查詢重寫為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*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.