【问题标题】:How do I exclude unchanged fields in Flashback query resultset?如何排除闪回查询结果集中未更改的字段?
【发布时间】:2021-01-18 18:21:47
【问题描述】:

是否可以排除闪回查询结果集中未更改的字段?

考虑一下我有下表

create table first_table
(
    id int generated as identity,
    name NVARCHAR2(1024),
    age smallint,
    notebook nclob,
    userpic clob,
    salary float
)

如果表在版本化查询之后有非常频繁的更新(例如在 notebook 字段上)

select ROWID, VERSIONS_OPERATION, VERSIONS_STARTSCN, VERSIONS_STARTTIME, VERSIONS_XID, id, name, age, notebook, userpic, salary
from FIRST_TABLE versions between scn 1469193 and 1482882;

会为每一行提取大量的用户图片值,即使它是相同的。

我能以某种方式避免这种情况,而是为未更改的值获取 NULL 吗?

【问题讨论】:

    标签: sql oracle oracle12c flashback


    【解决方案1】:

    您可以使用LAG() 分析函数来比较当前行与前一行的列值。因此,选择任何与其 LAG 值不匹配的列的值以仅显示更改,同时将其他列保持为 NULL

    SELECT versions_starttime, f.ID, f.name, f.age,
           CASE WHEN NVL(TO_CHAR(f.notebook),' ') != 
                     NVL(LAG(TO_CHAR(f.notebook)) OVER 
                         (PARTITION BY TO_CHAR(f.notebook) 
                              ORDER BY VERSIONS_STARTTIME NULLS FIRST),' ')
                THEN
                     f.notebook
                 END AS notebook, 
           CASE WHEN NVL(TO_CHAR(f.userpic),' ') != 
                     NVL(LAG(TO_CHAR(f.userpic)) OVER 
                         (PARTITION BY TO_CHAR(f.userpic) 
                              ORDER BY VERSIONS_STARTTIME NULLS FIRST),' ')
                THEN
                     f.userpic
                 END AS userpic,
           f.salary                       
      FROM first_table 
      VERSIONS BETWEEN SCN 1469193 AND 1482882 f
    

    【讨论】:

    • 谢谢你,巴巴罗斯!我将介绍这种方法。我想知道对具有非常高的更改吞吐量的表的每一列进行此类检查对性能有何影响。下载“无用”字段并在客户端丢弃它们可能会变得更快。
    • 不客气@expert,告诉我与当前案例在性能方面的差异。
    猜你喜欢
    • 2013-08-19
    • 2023-03-23
    • 2019-11-24
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2020-10-24
    相关资源
    最近更新 更多