页面项的布尔评估不正确

时间:2012-11-22 19:13:19

标签: sql oracle oracle-apex boolean-logic

我在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页面项输入一个值,然后进行比较,但是当我没有为页面项输入任何值时,它应该是{{1} }和布尔运算应该为NULL评估返回TRUE ...

当在0.5M行中搜索时,查询使执行时间花费多达45+秒,这是不可接受的。我写了以下变化来测试我的理论:

P2_STARTDATE IS NULL

它立即计算为NULL并在大约1秒内返回相同的结果集0.5M + ...现在,如果我设置了一个值,那么结果集显然是空的。

所以问题是,如何让Oracle APEX快速评估该表达式?感谢您提供的任何提示,解决方法或解决方案。

2 个答案:

答案 0 :(得分: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)
    )

答案 1 :(得分:0)

我不相信你的查询的第二部分是sargeable - 它不能使用索引。另外,您的示例与搜索实际结果集无关。

一种方法是将绑定变量(此查询的OUTSIDE)转换为正确的数据类型,以便查询能够在creation_date上使用索引(在creation_date上有一个索引,对吗?)

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

无论如何,将函数to_date从那里取出并传入一个常量。

相关问题