【问题标题】:Refreshable on commit materialized view using MAX()使用 MAX() 在提交物化视图上可刷新
【发布时间】:2012-02-16 19:15:46
【问题描述】:

entity-attribute-value antipattern 对我的打击很大。几年前的某一天,一个人认为 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() if the query has no where clause 创建一个“REFRESHABLE ON COMMIT”物化视图。

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

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

但我想我也应该看到 REFRESH_FAST_AFTER_ONETAB_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

【问题讨论】:

  • 运行EXECUTE DBMS_MVIEW.EXPLAIN_MVIEW ('T_VIEW');后,SELECT capability_name, possible, SUBSTR(related_text,1,8) AS rel_text, SUBSTR(msgtxt,1,60) AS msgtxt FROM MV_CAPABILITIES_TABLE ORDER BY seq;的输出是什么?

标签: oracle oracle10g materialized-views entity-attribute-value


【解决方案1】:

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

当我在 11g 上尝试此操作时,我收到了消息 CASE expressions present in materialized view。将其更改为使用 decode 将其固定在 10g 和 11g 上。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 2013-12-04
    • 2013-12-04
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2014-07-11
    相关资源
    最近更新 更多