2012-11-22 21 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) 
    )