【发布时间】: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