问题描述
我们正在使用user_dependency,以便以点语言样式 (请参阅graphviz) 生成应用程序ETL层的最新文档,该文档将作为动态依赖关系图添加到我们的内部WIKI中。在检查结果图时,我们发现了物化视图 (MV) 的报告依赖关系的问题。每当从另一个视图中选择MV时,该视图的依赖关系将显示为MV的依赖关系as well(在12.1.0.2.0中观察到)。
注: 中报告的问题https://asktom.oracle.com/pls/apex/asktom.search?tag=mview-dependencies指缺失的依赖关系。
测试设置 (参见https://livesql.oracle.com/apex/livesql/s/i0pvsa3a1lyi6wu7ufykw06ok):
从user_dependency查询依赖关系
结果:
当使用视图而不是物化视图时,依赖关系符合预期:
结果:
* 第一个结果不是错了吗?
* 有什么方法可以阻止将基础视图的依赖关系显示为MV的依赖关系?
注: 中报告的问题https://asktom.oracle.com/pls/apex/asktom.search?tag=mview-dependencies指缺失的依赖关系。
测试设置 (参见https://livesql.oracle.com/apex/livesql/s/i0pvsa3a1lyi6wu7ufykw06ok):
create table t1 (c1 int); create view v1 as select * from t1; create materialized view v2 as select * from v1;
从user_dependency查询依赖关系
select name, type, referenced_name, referenced_type from user_dependencies where name in ('T1','V1','V2') order by name desc, referenced_name desc;
结果:
NAME,TYPE,REFERENCED_NAME,REFERENCED_TYPE V2, MATERIALIZED VIEW, V2, TABLE V2, MATERIALIZED VIEW, V1, VIEW V2, MATERIALIZED VIEW, T1, TABLE -- this dependencies seems to be wrong for me V1, VIEW, T1, TABLE
当使用视图而不是物化视图时,依赖关系符合预期:
create view v2b as select * from v1;
select name, type, referenced_name, referenced_type from user_dependencies where name in ('T1','V1','V2B') order by name desc, referenced_name desc;
结果:
NAME,TYPE,REFERENCED_NAME,REFERENCED_TYPE V2B, VIEW, V1, VIEW V1, VIEW, T1, TABLE
* 第一个结果不是错了吗?
* 有什么方法可以阻止将基础视图的依赖关系显示为MV的依赖关系?
专家解答
这是预期的行为。
数据库需要知道您何时更改物化视图使用的数据。所以它有一个依赖关系,直到基表使用。即使你通过视图访问这些。
这确保了它可以正确跟踪MV的新鲜度。
就我个人而言,我希望将其记录在案,以便您知道何时需要刷新MV。或者,如果您在提交时快速刷新,哪些事务将触发刷新。
如果必须删除表格,则可以执行以下操作:
-查找视图中引用的所有表
-在物化视图中使用视图的地方
-然后从MV依赖项中减去这些
例如:
但这很快就会变得痛苦-如果您有MV -> 视图-> 表怎么办?
数据库需要知道您何时更改物化视图使用的数据。所以它有一个依赖关系,直到基表使用。即使你通过视图访问这些。
这确保了它可以正确跟踪MV的新鲜度。
就我个人而言,我希望将其记录在案,以便您知道何时需要刷新MV。或者,如果您在提交时快速刷新,哪些事务将触发刷新。
如果必须删除表格,则可以执行以下操作:
-查找视图中引用的所有表
-在物化视图中使用视图的地方
-然后从MV依赖项中减去这些
例如:
select name, type, referenced_name, referenced_type
from user_dependencies ud
where name in ('V2')
minus
select 'V2', 'MATERIALIZED VIEW', referenced_name, referenced_type
from user_dependencies ud
where referenced_type = 'TABLE'
and type = 'VIEW'
and exists (
select * from user_dependencies ud2
where ud2.referenced_name = ud.name
and ud2.type = 'MATERIALIZED VIEW'
);
NAME TYPE REFERENCED_NAME REFERENCED_TYPE
V2 MATERIALIZED VIEW V1 VIEW
V2 MATERIALIZED VIEW V2 TABLE 但这很快就会变得痛苦-如果您有MV -> 视图-> 表怎么办?
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




