一些研究检查表的记录何时最后更新,修改或删除的记录使我进入了名为ORA_ROWSCN的伪列。

首先,我这样做:

select max(ora_rowscn) from tablename;

我注意这个数字。然后,我进行插入,更新和删除,请检查每个人在每个人之前和之后的最大值。似乎每种类型的更改都会增加。

如果您想知道我为什么这样做,我们会在C#Windows服务中缓存一个实体列表。该服务在两个负载平衡的服务器上运行,因此每个运行都有一个单独的实例。当服务器A上发生更新时,服务器B需要了解它。我想做的是将最大缓存(ora_rowscn)变成变量。每当我们的应用程序插入,更新或删除记录时,都会从数据库中获得新的最大值。如果值不同,那么显然它知道它需要从数据库中获取新列表。

因此,我的实际问题是:我应该知道的其他障碍是否可能导致记录的插入,更新或删除,而不会增加此值?

编辑: 有人可以添加 ora_rowscn 作为标签?

有帮助吗?

解决方案

我应该知道还有其他障碍可能导致记录的插入,更新或删除不会增加此值吗?

ora_rowscn总是 当一行更改时会增加 - 但是在默认配置中,它也可以增加 当一排不变时

如果您需要检查整个桌子的尿液,一种方法是 使用审计. 。另一方面,如果您只需要检查该行,您要尝试更新冲突, ora_rowscnrowdependencies 是理想的。

其他提示

每次进行最大值(ORA_ROWSCN)将需要全表扫描。每次刷新整个缓存可能会更快。

听起来您需要一种通知其他服务的方法,发生了更改以及更改是什么。您可以使用一列维护日志表,该列指示哪个系统需要消耗更改。该列可以为每个服务具有两个基于函数的索引,因此每个索引仅包含需要消费的条目。然后,由于它们被消耗掉,因此可以使价值无效,以将其从索引中删除。

或者您可以使用Oracle的 高级排队.

正如@Leigh Riffel所指出的那样,选择的最大值(ORA_ROWSCN)将进行完整的表扫描。一种替代方法是具有一个时间戳列(我们将在此示例中调用SYS_TS),该时间段填充到语句执行时间(该时间与语句承诺不同,即SCN的生成/填充时)。 SYS_TS列上的索引将允许您查看最新的X(例如25)行,仅从这些行中找到最大ORA_ROWSCN。

这样做的最直截了当的方法是使用Rownum限制结果[1]问汤姆文章:

select *
from (select sys_ts, ora_rowscn
from table order by SYS_TS desc) where rownum < 25;

不幸的是,这也导致完整的表扫描(至少在Oracle 11.2.0.3中)。这已报告给Oracle,但确定不是缺陷(Bug 17347125)。

这需要更多的工作才能有效地取得相同的结果:

select b.sys_ts,b.ora_rowscn from
    (select rid from 
        (select rowid as rid from table order by sys_ts desc) 
    where rownum <= 25) a, table b
where a.rid = b.rowid;

[1] - http://www.oracle.com/technetwork/issue-Archive/2006/06-SEP/O56asktom-086197.html

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top