暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 滞后和超前函数

ASKTOM 2021-04-21
370

问题描述


您好!
我有一个关于ver 12.2中的滞后/领先函数的问题。

我遇到了以下查询的问题,该查询按秒执行,但是如果我将最后一个过滤器从
其中ID_QLFY不为空

其中ID_QLFY为空

那么同样的查询是挂起的。

我还发现,通过上述相同的更改,如果只有我从LAG和LEAD函数中删除忽略null,它仍然可以快速工作。

So my question is what does IGNORE NULLS in the LAG/LEAD functions have 到 do with the query filter (WHERE ID_QLFY IS NULL), operating on one of the attributes in the table. My understanding was that IGNORE NULLS should apply only on the window function in the inline query.

select * from 
(
select 
  ID,
  ATTR,
  ID_QLFY,
  (LAG (ID_QLFY) IGNORE NULLS
       OVER ( PARTITION BY SRC_CD
              ORDER BY ATTR )) LAG_ID,
  (LEAD (ID_QLFY) IGNORE NULLS
       OVER ( PARTITION BY SRC_CD
              ORDER BY ATTR )) LEAD_ID
from TBL
where DTE = TO_DATE('20210330, 'YYYYMMDD')
)
where ID_QLFY is not null;

专家解答

当您忽略null时,LEAD/LAG将在结果集中找到下一个非null值。没有这个,他们返回下一行中的任何值。

我不确定你的例子到底发生了什么,这里有一个假设:

当按attr排序时,该表有许多ID_QLFY的连续空值。因此,当您忽略null时,它必须搜索更多行以找到下一个非null。但是删除它,它可以每次返回下一行。

为了验证这一点,我们需要获得有关查询中发生的事情的更多详细信息。为此,我们需要查看执行计划!

请获取每个查询的执行计划,包括运行时统计信息 (A行,A时间等),并在此处发布。

使用以下脚本执行此操作:

alter session set statistics_level = all;
set serveroutput off

 

select * 
from   table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论