簡體   English   中英

Oracle 12c內聯視圖評估

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM