oracle版本 11
OPTIMIZER_FEATURES_ENABLE = 10.2
如下sql
select
to_date(col1,'yyyymmdd')
from (
select
to_char(table1.CUR_MON, 'YYYYMM') || '01' as col1
from
table1
where
table1.CUR_MON is not null
)
table1.CUR_MON 是 date 型別,, 有null值的資料,
現在的問題是在客戶環境,執行sql 會報錯 ora-01840 ,,
如果在客戶環境 把 OPTIMIZER_FEATURES_ENABLE 改成 9.2, 就不會報錯了.
想請教各位 為什么會報錯,條件里已經去除null的資料了
而且這段sql 我換成測驗環境 這個錯誤是無法再現的...只有在客戶環境才會出錯.
公司測驗環境和客戶環境的資料庫版本是一樣的
如果不修改sql,,, 從oracle優化策略角度,比如做表分析什么的 可不可以解決這個錯誤,,總是感覺這個錯誤很奇怪,,不應該發生.
因為客戶環境 暫時無法訪問,所以不能去試驗,,現在客戶那邊想知道 錯誤原因和解決辦法(不修改sql)
另外說下關于 ora-01840 錯誤,,,可以執行這段sql select to_date('01','YYYYMMDD') from dual;
uj5u.com熱心網友回復:
ding i xiauj5u.com熱心網友回復:
OPTIMIZER_FEATURES_ENABLE 會影響查詢優化器的執行,但拋出例外,沒遇到過。我建議從資料層再分析一次,看是否有例外的資料
uj5u.com熱心網友回復:
謝謝你的回復,
資料層面沒有問題,,date型別的資料除了合法日期值,就是null了,所以資料是沒問題的.
這里應該是涉及到 優化器和優化模式的選擇,,
在oracle9i版本里 optimize_mode是CHOOSE,根據表是否有統計資訊來決定選擇CBO還是RBO優化.
如果沒有統計資訊,并且optimize_mode是RULE的時候 sql執行就報錯了,,我只分析到這里,至于更深的原因我也不知道了.
不知道還有沒有人需要這種問題.
uj5u.com熱心網友回復:
為了一句SQL,讓CBO跨兩個大版本降級,是作死的行為……同意2#的說法:仔細查查資料是否有問題,另外可以嘗試修改SQL繞過這個問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/68200.html
標籤:基礎和管理
