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 并在大约 1 秒内返回相同的结果集 0.5M+ ......现在,如果我确实设置了一个值,那么结果集显然是空的。

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

4

2 回答 2

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)
    )
于 2012-11-28T00:57:17.513 回答
0

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

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

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

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

于 2012-11-22T19:27:35.090 回答