页面项目的布尔评估不正确

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 值时,它只是空的,它的状态是 UpdatedReset 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。

以上是关于页面项目的布尔评估不正确的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中评估布尔环境变量

开源项目安全评估-Scorecard

如何防止短路评估?

Java中的布尔表达式

产品经理,项目经理,FTO

复检网站_***测试项目分析手段