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ドキュメントを読んで理解しているので、クエリに where 句がない場合、 MAX() を使用して「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