3

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
4

1 に答える 1

3

MV_CAPABILITIES_TABLE.MSGTXTは間違っています。実際に行う必要があるのは、に置き換えるcaseことdecodeです。

11gでこれを試したところ、メッセージが表示されCASE expressions present in materialized viewました。使用するように変更するとdecode、10g と 11g の両方で修正されました。

于 2012-02-20T04:37:37.900 に答える