Oracle 使用MAX()提交物化视图时可刷新

Oracle 使用MAX()提交物化视图时可刷新,oracle,oracle10g,materialized-views,entity-attribute-value,Oracle,Oracle10g,Materialized Views,Entity Attribute Value,我被这条船撞得很重。几年前的某一天,一个男人认为DDL并不性感,他想开发一些“足够灵活”的东西来保存人们的信息。他忽略了一个事实,即人们过去至少有一些基本属性,如姓名、出生日期等。不仅如此,他还在该模式之上放了一堆(副作用严重的)PL/SQL包。它设法成为其他应用程序所依赖的关键子系统 快进几年和2000万行。这家伙已经不在公司了,我必须处理这件事。我需要实现一些基本的搜索,这些搜索现在需要多个内部连接,在某些情况下需要花费很长时间。重写整个东西是不可能的,所以我想“透视”最重要的属性 我认为物

我被这条船撞得很重。几年前的某一天,一个男人认为DDL并不性感,他想开发一些“足够灵活”的东西来保存人们的信息。他忽略了一个事实,即人们过去至少有一些基本属性,如姓名、出生日期等。不仅如此,他还在该模式之上放了一堆(副作用严重的)PL/SQL包。它设法成为其他应用程序所依赖的关键子系统

快进几年和2000万行。这家伙已经不在公司了,我必须处理这件事。我需要实现一些基本的搜索,这些搜索现在需要多个内部连接,在某些情况下需要花费很长时间。重写整个东西是不可能的,所以我想“透视”最重要的属性

我认为物化视图可能是一个可行的选择,但我需要一些指导,因为我从未使用过它们。我想要一张这样的桌子:

  select
      uid,
       max(case when att = 'NAME' then UPPER(value) end) name,
       max(case when att = 'SURNAME' then UPPER(value) end) surname,
       max(case when att = 'BIRTH' then DATEORNULL(value) end) birth,
     ....,
     count(*) cnt
 from t
 group by uid
据我了解,阅读Oracle文档时,我应该能够使用MAX()创建“提交时可刷新”的物化视图

但无法让它工作。我试过:

create materialized view log on t WITH SEQUENCE,ROWID,(value) INCLUDING NEW VALUES;

create materialized view t_view
 refresh fast on commit
 as
  select
      uid,
       max(case when att = 'NAME' then UPPER(value) end) name,
       max(case when att = 'SURNAME' then UPPER(value) end) surname,
       max(case when att = 'BIRTH' then DATEORNULL(value) end) birth,
     count(*) cnt
 from t
 group by uid
它适用于插入,但不适用于更新。我看到它能够做到以下几点:

  REFRESH_COMPLETE                                                             

  REFRESH_FAST                                                                 

  REFRESH_FAST_AFTER_INSERT
但我想我也应该看到在DML之后快速刷新。有什么想法吗

更新:dbms_mview.explain_mview的输出

REFRESH_COMPLETE             |Y|
REFRESH_FAST                 |Y|
REFRESH_FAST_AFTER_INSERT    |Y|
REFRESH_FAST_AFTER_ONETAB_DML|N|mv uses the MIN or MAX aggregate functions
REFRESH_FAST_AFTER_ANY_DML   |N|see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled
REFRESH_FAST_PCT             |N|PCT is not possible on any of the detail tables in the mater

MV_CAPABILITIES_TABLE.MSGTXT
是错误的,您真正需要做的是将
case
替换为
decode


当我在11g上尝试这一点时,我得到消息
实例表达式出现在物化视图中
。将其更改为使用
decode
修复了10g和11g上的问题。

运行
后,执行DBMS\u MVIEW.EXPLAIN\u MVIEW('T\u VIEW')
的输出是什么?选择能力名称,可能,SUBSTR(相关文本,1,8)作为相关文本,SUBSTR(msgtxt,1,60)作为msgtxt从MV_能力表中按顺序排列