【问题标题】:How to fetch latest 100 rows (inserted or updated) from Oracle table?如何从 Oracle 表中获取最新的 100 行(插入或更新)?
【发布时间】:2022-01-22 16:37:39
【问题描述】:

如何从 Oracle 表中获取最新的 100 行(插入或更新)? 需要查询以下情况 - 1.Table没有任何日期列。 2.表格有日期列。

查询应该在 Oracle 11g 和更高版本的 Oracle 12c 中工作。

【问题讨论】:

    标签: oracle oracle11g sql-limit


    【解决方案1】:

    您的表应该启用了rowdependencies 选项并通过 ora_rowscn 伪列获取:

    Select * from t order by ora_rowscn desc fetch first 100 rows only
    

    如果您的表没有 rowdependencies 选项,则需要使用 rowdependencies 重新创建它

    【讨论】:

    • 阅读更多有关ora_rowscn的信息:docs.oracle.com/cd/E11882_01/server.112/e41084/…
    • 那个(FETCH 子句)在 11g 上不起作用,Sayan。此外,它“...对于确定最后一次更新行的大致时间很有用。它不是绝对精确的”所以...是的,也许您的想法适用于 OP。说不出来。但是 - 感谢您指出这一点,根本没有考虑到 ORA_ROWSCN 伪列
    • 我想我需要投反对票,但我很想被说服。 ORA_ROWSCN 对此不可靠。例如,上午 10 点更新“A”行,上午 11 点更新其他 100 行。有人在中午 12 点查询包含行“A”的块。如果该块作为查询的一部分被清除,它将比稍后更新的其他 100 行晚获得ORA_ROWSCN。即,您不会在结果中获得最后 100 行。您的流程似乎可以工作,尤其是在具有少量事务的小型表上,但会不可靠。
    • @AlexPoole 延迟块清除。如果我更新表中的十亿行,提交仍然会立即自动发生。包含这十亿行的块可能已被 DBWR 刷新,甚至在您提交之前已从块缓存中老化。如果是这样,它们将在很大程度上不会被清除,直到它们被查询(可能更晚被另一个会话)。我相信这会导致 ORA_ROWSCN 发生变化。
    • 对...所以我误读了您的第一条评论,并且无论如何都没有意识到这种影响。谢谢。不过,我是对的,不能 100% 确定依赖它 *8-) (而且正如链接文档所说,“如果一个块被查询两次,那么 ORA_ROWSCN 的值可能会在查询之间发生变化即使在两次查询之间没有更新行。”所以即使这样也有效地表明你不能依赖它。)
    【解决方案2】:

    Oracle 会在 DBA_TAB_MODIFICATIONS 视图中跟踪对表执行的插入、更新和删除次数。它不是实时的,因此如果您需要在一小段时间内对其进行检查,则必须刷新统计信息以便(轻松)查看。

    
     execute dbms_stats.flush_database_monitoring_info;
    
    -- Do work 
    
     select table_owner,table_name,inserts,updates,deletes from dba_tab_modifications  where table_name = 'RDS_LOG';
    
    TABLE_OWNER                    TABLE_NAME                        INSERTS    UPDATES    DELETES
    ------------------------------ ------------------------------ ---------- ---------- ----------
    MYUSER                         RDS_LOG                           4660111          0    1119531
    
    

    【讨论】:

    • 这如何帮助获取最新的 100 行
    【解决方案3】:
    SELECT * FROM table ORDER BY column DESC WHERE rownum < 100
    

    【讨论】:

    • 如果有一个日期列在插入更新时更新 - 问题的原始版本没有,当前版本想要处理或不处理 -那么这仍然不对;您需要在子查询(即内联视图)中应用排序,然后将 rownum 过滤器应用于该子查询的结果。
    【解决方案4】:
    SQL> create table dt_del_ex(id number);
    
    Table created.
    
    SQL> set serveroutput on
    SQL> BEGIN
      2
      3      INSERT INTO dt_del_ex VALUES(1);
      4
      5      DBMS_OUTPUT.put_line(TO_CHAR(SQL%ROWCOUNT)||' rows inserted');
      6
      7      INSERT INTO dt_del_ex select rownum from dual connect by level <=10;
      8
      9      DBMS_OUTPUT.put_line(TO_CHAR(SQL%ROWCOUNT)||' rows inserted');
     10
     11      UPDATE dt_del_ex SET id = id + 3 WHERE id >= 9;
     12
     13      DBMS_OUTPUT.put_line(TO_CHAR(SQL%ROWCOUNT)||' rows updated');
     14
     15      DELETE FROM dt_del_ex WHERE id <= 10;
     16
     17      DBMS_OUTPUT.put_line(TO_CHAR(SQL%ROWCOUNT)||' rows deleted');
     18
     19  END;
     20  /
    1 rows inserted
    10 rows inserted
    2 rows updated
    9 rows deleted
    
    

    【讨论】:

    • 这如何帮助获取最新的 100 行
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2020-10-31
    • 2014-07-10
    相关资源
    最近更新 更多