物化视图——标识最近的刷新



我目前访问一系列视图和物化视图。物化由第三方维护,他们很少提供关于物化频率和成功的信息。最近物化视图未能刷新,我已经发送了许多报告,其中包含不正确/延迟的数据。

目前查询每个物化我打算使用建立在事务系统的最新更新发生时,如果它没有被刷新那么其余的代码不执行,然而这大量的浪费精力,有时会导致一个不正确的假设(可能是刷新物化视图,但没有额外的交易,因此剩余的代码不执行),我更喜欢另一种方法。

是否有一种方法来识别是否物化视图已经刷新使用Oracle系统表?如果没有,有没有人知道我该如何在不联系第三方的情况下做到这一点?

看起来doc_180已经在评论中回答了这个问题,我不确定为什么它没有被添加为答案

SELECT owner, mview_name, last_refresh_date
  FROM all_mviews
 WHERE owner = <<user that owns the materialized view>>
   AND mview_name = <<name of the materialized view>>

如果您有访问DBA表的权限,您可以用DBA_MVIEWS代替ALL_MVIEWS。那将允许你访问关于每个物化视图何时刷新的信息,而不仅仅是你有权访问的物化视图的子集。当然,在这种情况下,这可能不是一个特别重要的区别。

不幸的是oracle默认的日期格式是YYYY-MM-DD。如果你需要时间的话就像这样:

SELECT owner, mview_name, to_char(LAST_REFRESH_DATE, 'yyyy-mm-dd hh24:mi:ss') last_refresh_date
FROM all_mviews
WHERE owner = 'FOO'
AND mview_name = 'MV_BAR';

我个人使用all_snapshots,这个信息是对DBA_MVIEWS或ALL_MVIEWS信息的补充

select owner, name, last_refresh, error, status, refresh_mode  
from  all_snapshots 
where owner = 'owner';

最新更新