我在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快速评估该表达式?感谢您提供的任何提示,解决方法或解决方案。
答案 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从那里取出并传入一个常量。