页面项目的布尔评估不正确
Posted
技术标签:
【中文标题】页面项目的布尔评估不正确【英文标题】:Boolean evaluation of page item is incorrect 【发布时间】:2012-11-22 19:13:19 【问题描述】:我在 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
和布尔运算P2_STARTDATE IS NULL
评估应该只返回 TRUE...
在 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 该表达式?感谢您提供的任何提示、解决方法或解决方案。
【问题讨论】:
您是否检查过会话状态信息以确保 P2_STARTDATE 确实为 NULL?调试日志呢?您是否尝试过从 sqlplus 运行相同的查询,看看是否也需要很长时间? 嘿@eaolson,当检查会话的 P2_STARTDATE 值时,它只是空的,它的状态是 Updated 或 Reset to Null ... 只是预感:您是否使用Enable Partial Page Refresh
= Yes
设置了报告?如果是这样,您是否将 P2_STARTDATE 包含在 Page Items to Submit
中?
【参考方案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)
)
【讨论】:
【参考方案2】:我不相信您查询的第二部分是 sargeable - 它不能使用索引。另外,您的示例与搜索实际结果集无关。
一种方法是将(在此查询之外)绑定的变量转换为正确的数据类型,以便查询能够使用 creation_date 上的索引(creation_date 上有一个索引,对吗?)
SELECT
...
FROM ...
WHERE ...
AND :P2_STARTDATE IS NULL OR creation_date > :newdatevariable;
无论如何,从那里获取函数 to_date 并传入一个常量。
【讨论】:
Jim,我的问题不一定与索引的可分析性或有用性有关,而是与 WHERE 子句的正确/不正确评估以及正在检查的页面项的值有关.是的,creation_date 字段上有一个索引... :) 我遇到的问题是引擎似乎正在根据页面项目的值评估 creation_date 字段,即使这是 NULL 并且在评估是否为 NULL 时应该刚刚返回 TRUE。以上是关于页面项目的布尔评估不正确的主要内容,如果未能解决你的问题,请参考以下文章