当前位置: 首页 > 面试题库 >

Oracle:如何查找模式中最后一次更新(任何表)的时间戳?

孟凯泽
2023-03-14
问题内容

有一个Oracle数据库html" target="_blank">模式(数据很小,但仍然约有10-15个表)。它包含一种配置(路由表)。

有一个应用程序必须不时轮询此架构。通知将不被使用。

如果没有更新架构中的数据,则应用程序应使用其当前的内存版本。

如果任何表有任何更新,则应用程序应将所有表重新加载到内存中。

自给定关键点(时间或交易ID)以来,检查整个架构以进行更新的最有效方法是什么?

我猜想Oracle会为每个架构保留一个事务ID。然后应该有一种查询这样的ID的方法,并使其与下一次轮询进行比较。

我发现了这个问题,在行级别上存在这样一个伪列:

如何确定上次更新Oracle表的时间

我认为在架构级别也存在类似的问题。

有人能指出我正确的方向吗?


问题答案:

我不知道Oracle中有任何此类功能。 见下文。

我能想到的最好的解决方案是在每个表上创建一个触发器,以使用当前日期/时间更新单行表或上下文。这样的触发器可能在表级别(而不是行级别),因此它们所承担的开销不会像大多数触发器那样大。

顺便说一句,Oracle不能为每个架构保留一个事务ID,因为一个事务可能会影响多个架构。可能可以使用V
$视图将事务跟踪回到受影响的对象,但这并非易事,而且几乎可以肯定它的性能要比触发方案差。

事实证明,如果您有10g,则可以使用Oracle的闪回功能来获取此信息。但是,您需要启用闪回功能(这本身会带来一些开销),并且查询速度非常慢(大概是因为它并非真正用于此用途):

select max(commit_timestamp) 
from FLASHBACK_TRANSACTION_QUERY 
where table_owner = 'YOUR_SCHEMA' 
      and operation in ('INSERT','UPDATE','DELETE','MERGE')

为了避免将问题锁定在“上次更新”表中,您可能希望将该更新放入使用自主事务的过程中,例如:

create or replace procedure log_last_update as
pragma autonomous_transaction;
begin
   update last_update set update_date = greatest(sysdate,update_date);
   commit;
end log_last_update;

这将导致您的应用程序在某种程度上进行序列化:每个需要调用此过程的语句都需要等待,直到上一个语句完成为止。“上次更新”表也可能不同步,因为即使回滚激活了触发器的更新,该表上的更新也会保留。最后,如果您的交易特别长,则应用程序可能会在交易完成之前选择新的日期/时间,从而达不到目的。我对这个问题的思考越深,似乎就越不是一个好主意。

避免这些问题的更好解决方案是从触发器中插入一行。这不会锁定表,因此不会进行任何序列化,也不需要异步进行插入,因此它们可以与实际数据一起回滚(并且在应用程序不可见之前,对应用程序不可见)。数据也是可见的)。应用程序将获得最大值,如果该表已建立索引,则最大值将非常快(实际上,该表将是索引组织表的理想候选者)。唯一的缺点是,您需要定期运行的作业以清除旧值,因此它不会变得太大。



 类似资料:
  • 问题内容: 我能否找出对Oracle数据库中的表执行最后一条INSERT,UPDATE或DELETE语句的时间,如果是,如何执行? 背景知识:Oracle版本为10g。我有一个定期运行的批处理应用程序,可从单个Oracle表中读取数据并将其写入文件中。如果自上次运行作业以来数据未更改,我想跳过此步骤。 该应用程序用C ++编写,并通过OCI与Oracle通信。它以“普通”用户身份登录到Oracle

  • 问题内容: 在页面的页脚中,我想添加诸如“最后更新xx / xx / 200x”之类的内容,该日期为最后一次更新某些mySQL表的时间。 最好的方法是什么?有检索上次更新日期的功能吗?每次需要此值时都应该访问数据库吗? 问题答案: 在更高版本的MySQL中,您可以使用数据库来告诉您何时更新了另一个表: 当然,这确实意味着要打开与数据库的连接。 另一种选择是每当更新MySQL表时“触摸”特定文件:

  • 问题内容: 嗨,我开始开发一个Android应用程序,该应用程序将使用一个可容纳多个表的SQLite数据库。我想知道的是特定表的最后更新时间,因为某些数据不需要在一个星期内进行更新,而其他表则需要每隔几个小时更新一次。尝试节省带宽并创建响应速度更快的应用程序。不知道是否有用于此的命令(似乎什么也找不到),或者我是否应该在每个表中添加具有当前时间和日期的字段,并使用System.currentTim

  • 问题内容: 匹配条件后,如何在一段时间后更新表? 我需要在满足某些条件后进行更新,并在2天后根据收到的最新答案(即e)进行更新,因此应在上进行更新。 问题答案: 试试这个 如此看来,这两个表是由相连的,并且具有的最新回答日期。通过使用我们可以知道今天的日期和比赛的答案之间的差异。

  • 问题内容: 在页面的页脚中,我想添加诸如“最后更新xx / xx / 200x”之类的内容,该日期为最后一次更新某些mySQL表的时间。 最好的方法是什么?有检索上次更新日期的功能吗?每次需要此值时都应该访问数据库吗? 问题答案: 在更高版本的MySQL中,您可以使用数据库来告诉您何时更新了另一个表: 当然,这确实意味着要打开与数据库的连接。 另一种选择是每当更新MySQL表时“触摸”特定文件:

  • 这是我的模型: 方法如下: 这是错误我得到当我尝试启动Spring应用程序 未能 在项目 licenta 上执行目标 org.springframework.boot:spring-boot-maven-plugin:1.5.9.RELEASE:run(default-cli) 在项目 licenta 上:运行时发生异常。 null: InvocationTargetException: 创建名为