【发布时间】:2021-04-29 07:58:45
【问题描述】:
我正在尝试使用 ENABLE ON QUERY COMPUTATION 创建以下实体化视图,但我找不到问题所在。
我有三个主表,其中包含相应的物化视图日志和所需的列。谁能帮帮我?
谢谢
create materialized view log on alfaods.OdsReceivable with rowid, sequence ( dueDate , recvChargeTypeId, scheduleId , amount ) , primary key including new values for fast refresh;
create materialized view log on alfaods.OdsChargeType with rowid, sequence ( code ), primary key including new values for fast refresh;
create materialized view log on alfaods.OdsScheduleMain with rowid, primary key including new values for fast refresh;
那么MV就是
create materialized view alfaods.mv_max_fn_date
TABLESPACE TBDATA
CACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
ENABLE QUERY REWRITE
ENABLE ON QUERY COMPUTATION
AS
SELECT max(receivable.dueDate) as finalDate,
schedule.id as scheduleId ,
receivable.recvChargeTypeId as recvChargeTypeId,
receivable.scheduleId as receivableSchId ,
receivable.amount as recamount ,
chargeType.code as ChargTypecode
FROM ALFAODS.OdsReceivable receivable
INNER JOIN ALFAODS.OdsChargeType chargeType on receivable.recvChargeTypeId = chargeType.id
INNER JOIN ALFAODS.OdsScheduleMain schedule on receivable.scheduleId = schedule.id
where
receivable.amount NOT IN (0.01, 0.00)
AND chargeType.code = 2
group by schedule.id , receivable.recvChargeTypeId , receivable.scheduleId , receivable.amount , chargeType.code
;
当我尝试创建它时,我得到了这个错误
SQL> create materialized view alfaods.mv_max_fn_date
TABLESPACE TBDATA
CACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
ENABLE QUERY REWRITE
ENABLE ON QUERY COMPUTATION
AS
SELECT max(receivable.dueDate) as finalDate,
schedule.id as scheduleId ,
receivable.recvChargeTypeId as recvChargeTypeId,
receivable.scheduleId as receivableSchId ,
receivable.amount as recamount ,
chargeType.code as ChargTypecode
FROM ALFAODS.OdsReceivable receivable
INNER JOIN ALFAODS.OdsChargeType chargeType on receivable.recvChargeTypeId = chargeType.id
INNER JOIN ALFAODS.OdsScheduleMain schedule on receivable.scheduleId = schedule.id
where
receivable.amount NOT IN (0.01, 0.00)
AND chargeType.code = 2
group by schedule.id , receivable.recvChargeTypeId , receivable.scheduleId , receivable.amount , chargeType.code
25 ;
AND chargeType.code = 2
*
ERROR at line 23:
ORA-32361: cannot ENABLE ON QUERY COMPUTATION for the materialized view
Elapsed: 00:00:00.00
SQL>
好像是where条件有问题,所以我在没有where的情况下测试了
SQL> create materialized view alfaods.mv_max_fn_date
TABLESPACE TBDATA
CACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
ENABLE QUERY REWRITE
ENABLE ON QUERY COMPUTATION
AS
SELECT max(receivable.dueDate) as finalDate,
schedule.id as scheduleId ,
receivable.recvChargeTypeId as recvChargeTypeId,
receivable.scheduleId as receivableSchId ,
receivable.amount as recamount ,
chargeType.code as ChargTypecode
FROM ALFAODS.OdsReceivable receivable
INNER JOIN ALFAODS.OdsChargeType chargeType on receivable.recvChargeTypeId = chargeType.id
INNER JOIN ALFAODS.OdsScheduleMain schedule on receivable.scheduleId = schedule.id
--where
--receivable.amount NOT IN (0.01, 0.00)
--AND chargeType.code = 2
group by schedule.id , receivable.recvChargeTypeId , receivable.scheduleId , receivable.amount , chargeType.code
;
INNER JOIN ALFAODS.OdsScheduleMain schedule on receivable.scheduleId = schedule.id
*
ERROR at line 20:
ORA-32361: cannot ENABLE ON QUERY COMPUTATION for the materialized view
更新
我运行了 DBMS_MVIEW.EXPLAIN_MVIEW
set serveroutput on size unlimited echo on long 99999999 longchunksize 99999999
declare
a sys.ExplainMVArrayType;
begin
dbms_mview.explain_mview('SELECT receivable.recvChargeTypeId as recvChargeTypeId,
receivable.scheduleId as scheduleId ,
receivable.amount as recamount ,
chargeType.id as ChargeID,
max(receivable.dueDate) as finalDate
FROM ALFAODS.OdsReceivable receivable
INNER JOIN ALFAODS.OdsChargeType chargeType on receivable.recvChargeTypeId = chargeType.id
group by receivable.recvChargeTypeId , receivable.scheduleId , receivable.amount , chargeType.id',a);
dbms_output.put_line('Explain MV '
|| a(1).mvowner || '.' || a(1).mvname);
for i in 1..a.count loop
dbms_output.put_line(
rpad(a(i).capability_name, 30)
|| ' [' || case a(i).possible
when 'T' then 'TRUE'
when 'F' then 'FALSE'
else a(i).possible
end || ']'
|| case when a(i).related_num != 0 then
' ' || a(i).related_text
|| ' (' || a(i).related_num || ')'
end
|| case when a(i).msgno != 0 then
' ' || a(i).msgtxt
|| ' (' || a(i).msgno || ')'
end
);
end loop;
end;
/
Explain MV .
PCT [FALSE]
REFRESH_COMPLETE [TRUE]
REFRESH_FAST [FALSE]
REWRITE [TRUE]
REFRESH_FAST_AFTER_INSERT [FALSE] join may produce duplicate rows in mv
(2059)
REFRESH_FAST_AFTER_INSERT [FALSE] MV is not fast refreshable even with view
merging (2154)
REFRESH_FAST_AFTER_ONETAB_DML [FALSE] FINALDATE (193) mv uses the MIN or MAX
aggregate functions (2086)
REFRESH_FAST_AFTER_ONETAB_DML [FALSE] see the reason why
REFRESH_FAST_AFTER_INSERT is disabled (2146)
REFRESH_FAST_AFTER_ONETAB_DML [FALSE] mv uses the MIN or MAX aggregate
functions (2086)
REFRESH_FAST_AFTER_ANY_DML [FALSE] see the reason why
REFRESH_FAST_AFTER_ONETAB_DML is disabled (2161)
REFRESH_FAST_PCT [FALSE] PCT FAST REFRESH is not possible if query
contains an inline view (2196)
REWRITE_FULL_TEXT_MATCH [TRUE]
REWRITE_PARTIAL_TEXT_MATCH [TRUE]
REWRITE_GENERAL [FALSE] the reason why the capability is disabled
has escaped analysis (2141)
REWRITE_PCT [FALSE] general rewrite is not possible or PCT is
not possible on any of the detail tables (2158)
【问题讨论】:
-
第一次命中导致
Doc ID 2608076.1 -
@MarmiteBomber ,您引用的文档仅说明了这一点,以避免 ORA-32361 错误。 MVIEW 应该是聚合连接视图。视图是聚合的,所以它必须是别的东西
-
抱歉,我今天不在 12.2 实例面前。两个建议。尝试创建 w/o
ON QUERY COMPUTATION并在您的 mview 上运行 DBMS_MVIEW.EXPLAIN_MVIEW。我不确定 Oracle 是否为 OQC 扩展了该程序,但它可能会提供见解。如果做不到这一点,请尝试删除内部连接并仅使用OdsReceivable表开始构建。一次添加一个连接,看看它从哪里开始失败。我同意您的问题似乎不是错误 24731557 -
您的 MV 甚至无法快速刷新,因为这种“连接可能会在 mv 中产生重复的行”。您在表上声明了主键(不仅仅是唯一索引)和外键?如果没有,请定义它们并再次尝试整个过程(如果仍然无法正常工作,请更新 DBMS_MVIEW 输出)。
-
仅供参考,这条消息“mv 使用 MIN 或 MAX 聚合函数”也可能是您的问题。
MAX()不会快速刷新,因为您有WHERE子句。
标签: oracle oracle12c materialized-views