我有几个关于创建快速刷新的物化视图的问题。问题是我需要在查询计数(*)函数中,这对于快速刷新是非法的。我在某处读到我制作了一个“帮助”视图,它将执行 count()。我想从我的物化视图中引用该视图。刷新时,完整的工作正常,但在尝试快速执行期间,出现 ORA 12004 错误。我知道我需要来自我引用的表的物化视图日志,但是视图呢?如何创建它们?在引用视图中使用 count() 是否也是非法的?如何为该视图创建一个 ROWID 列?如果使用 count() 是非法的,尽管创建表来制作它,还有其他方法吗?
问问题
115 次
1 回答
0
您当然可以count
在fast refresh
物化视图中拥有:
create table t (
c1 int primary key,
c2 int
);
insert into t
select level, mod ( level, 3 )
from dual
connect by level <= 10;
commit;
create materialized view log on t
with rowid, primary key ( c2 )
including new values;
create materialized view mv
refresh fast on commit
as
select c2, count (*)
from t
group by c2;
select * from mv;
C2 COUNT(*)
1 4
2 3
0 3
insert into t
select -level, mod ( level, 3 )
from dual
connect by level <= 10;
commit;
select * from mv;
C2 COUNT(*)
1 8
2 6
0 6
如果您无法使实体化视图快速刷新并且您不确定原因,请查看dbms_mview.explain_mview
. 这给出了可能的刷新的细分,以及它们是否可能用于 MV。
对于那些不可能的,有一个简短的解释为什么:
create table mv_capabilities_table (
statement_id varchar(30) ,
mvowner varchar(30) ,
mvname varchar(30) ,
capability_name varchar(30) ,
possible character(1) ,
related_text varchar(2000) ,
related_num number ,
msgno integer ,
msgtxt varchar(2000) ,
seq number
) ;
exec dbms_mview.explain_mview('mv');
select capability_name, possible, msgtxt from MV_CAPABILITIES_TABLE
where capability_name like 'REFRESH%';
CAPABILITY_NAME POSSIBLE MSGTXT
REFRESH_COMPLETE Y <null>
REFRESH_FAST Y <null>
REFRESH_FAST_AFTER_INSERT Y <null>
REFRESH_FAST_AFTER_ONETAB_DML Y <null>
REFRESH_FAST_AFTER_ANY_DML Y <null>
REFRESH_FAST_PCT N PCT is not possible on any of the detail tables in the materialized view
如果您在物化视图中使用视图,则需要在视图使用的表上创建 MV 日志。
于 2019-11-01T10:34:32.273 回答