问题描述
您好!
我有一个关于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时间等),并在此处发布。
使用以下脚本执行此操作:
我不确定你的例子到底发生了什么,这里有一个假设:
当按attr排序时,该表有许多ID_QLFY的连续空值。因此,当您忽略null时,它必须搜索更多行以找到下一个非null。但是删除它,它可以每次返回下一行。
为了验证这一点,我们需要获得有关查询中发生的事情的更多详细信息。为此,我们需要查看执行计划!
请获取每个查询的执行计划,包括运行时统计信息 (A行,A时间等),并在此处发布。
使用以下脚本执行此操作:
alter session set statistics_level = all; set serveroutput offselect * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




