我目前访问一系列视图和物化视图。物化由第三方维护,他们很少提供关于物化频率和成功的信息。最近物化视图未能刷新,我已经发送了许多报告,其中包含不正确/延迟的数据。
目前查询每个物化我打算使用建立在事务系统的最新更新发生时,如果它没有被刷新那么其余的代码不执行,然而这大量的浪费精力,有时会导致一个不正确的假设(可能是刷新物化视图,但没有额外的交易,因此剩余的代码不执行),我更喜欢另一种方法。
是否有一种方法来识别是否物化视图已经刷新使用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';