【发布时间】:2022-01-22 16:37:39
【问题描述】:
如何从 Oracle 表中获取最新的 100 行(插入或更新)? 需要查询以下情况 - 1.Table没有任何日期列。 2.表格有日期列。
查询应该在 Oracle 11g 和更高版本的 Oracle 12c 中工作。
【问题讨论】:
标签: oracle oracle11g sql-limit
如何从 Oracle 表中获取最新的 100 行(插入或更新)? 需要查询以下情况 - 1.Table没有任何日期列。 2.表格有日期列。
查询应该在 Oracle 11g 和更高版本的 Oracle 12c 中工作。
【问题讨论】:
标签: oracle oracle11g sql-limit
您的表应该启用了rowdependencies 选项并通过 ora_rowscn 伪列获取:
Select * from t order by ora_rowscn desc fetch first 100 rows only
如果您的表没有 rowdependencies 选项,则需要使用 rowdependencies 重新创建它
【讨论】:
ORA_ROWSCN 对此不可靠。例如,上午 10 点更新“A”行,上午 11 点更新其他 100 行。有人在中午 12 点查询包含行“A”的块。如果该块作为查询的一部分被清除,它将比稍后更新的其他 100 行晚获得ORA_ROWSCN。即,您不会在结果中获得最后 100 行。您的流程似乎可以工作,尤其是在具有少量事务的小型表上,但会不可靠。
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
【讨论】:
SELECT * FROM table ORDER BY column DESC WHERE rownum < 100
【讨论】:
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
【讨论】: