2012-11-22 25 views
0

我在APEX頁面中有一個報告,它有多個列,結果(行數)從10,000到1,000,000(1M)記錄之間的任何位置。頁面項目的布爾值評估不正確

有一個有條件的where子句我有,而且爲了使用一個頁面元素的值,以確定或限制所顯示的結果......它看起來是這樣的:

SELECT 
    ... 
FROM ... 
WHERE ... 
AND (:P2_STARTDATE IS NULL OR TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date) 

我相信這在任何時候我做了P2_STARTDATE頁面項目輸入一個值,則比較發生,但是當我不爲,則頁面項目進入任一值,應該是NULL和布爾操作應該只返回TRUE爲P2_STARTDATE IS NULL評價。 ..

查詢使執行時間佔用在0.5M行中搜索時多達45+秒,這是不可接受的。我寫了下面的變化來測試我的理論:

SELECT 
    ... 
FROM ... 
WHERE deleted_flag = 'N' 
AND (:P2_STARTDATE IS NULL) -- comment the rest of the evaluation.... 

它立即計算結果爲NULL,並返回結果集相同0.5M +在1秒左右......現在,我要是設置的值,則結果集是空的,明顯。

所以問題是,我如何才能使Oracle APEX快速評估爲TRUE表達式?感謝您提供的任何提示,解決方法或解決方案。

+0

你檢查會話狀態信息,以確保P2_STARTDATE還真是空?調試日誌怎麼樣?你有沒有嘗試從sqlplus運行相同的查詢,看看它是否也需要很長時間? – eaolson

+0

嘿@eaolson,爲P2_STARTDATE值檢查會話時,它僅僅是空的,它的狀態是_Updated_或_RESET爲Null _... –

+0

只是一種預感:你設置了'啓用部分頁面Refresh'報告='是'?如果是這樣,你有沒有在「提交的頁面項目」中包含P2_STARTDATE? –

回答

0

我不相信你的查詢的第二部分是可挖掘的 - 它不能使用索引。再加上你的例子與搜索實際結果集無關。

一種方法是綁定變量轉換(超出此查詢)到正確的數據類型,使查詢變爲能夠使用上CREATION_DATE指數(上有CREATION_DATE指數,對吧?)

SELECT 
    ... 
FROM ... 
WHERE ... 
AND :P2_STARTDATE IS NULL OR creation_date > :newdatevariable; 

無論如何,將函數to_date從那裏拿出來並傳入一個常量。

+0

Jim,我的問題不一定與索引的可用性或有用性有關,而是與WHERE子句的正確/不合適的評估以及頁面項正在檢查的值相關。是的,在creation_date字段上有一個索引... :) –

+0

我遇到的問題是引擎似乎正在評估creation_date字段對頁面項目的值,即使這是NULL,並且應該剛返回TRUE當評估爲NULL或不。 –

1

我不確定假設SQL引擎在您的OR上使用短路評估是安全的。

試試這個:

AND (:P2_STARTDATE IS NULL 
    OR 
     (:P2_STARTDATE IS NOT NULL 
     AND TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date) 
    )