web-dev-qa-db-ja.com

Oracle-FAST REFRESHとJOINSを使用してマテリアライズドビューを作成する方法

したがって、Oracleがこれをサポートしていると確信しているので、何が間違っているのかわかりません。このコードは機能します:

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.* FROM TPM_PROJECTVERSION V;

JOINを追加すると、次のように壊れます。

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.*, P.* FROM TPM_PROJECTVERSION V
    INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID

今、私はエラーを取得します:

ORA-12054:マテリアライズドビューのON COMMIT更新属性を設定できません

TPM_PROJECTとTPM_PROJECTVERSIONの両方でマテリアライズドビューログを作成しました。 TPM_PROJECTの主キーはPROJECTIDであり、TPM_PROJECTVERSIONの複合主キーは(PROJECTID、VERSIONID)です。これの秘Whatは何ですか?私は、Oracleのマニュアルを無駄に掘り下げてきました。ありがとう!

35

まず、 Oracle Database Data Warehousing Guide から:

結合のみのマテリアライズドビューの高速リフレッシュの制限

...

  • FROMリスト内のすべてのテーブルのROWIDは、クエリのSELECTリストに表示される必要があります。

これは、ステートメントが次のように見える必要があることを意味します。

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID 
    FROM TPM_PROJECTVERSION V,
         TPM_PROJECT P 
    WHERE P.PROJECTID = V.PROJECTID

注意すべきもう1つの重要な点は、マテリアライズドビューログをwith rowid

機能テストのシナリオは次のとおりです。

CREATE TABLE foo(foo NUMBER, CONSTRAINT foo_pk PRIMARY KEY(foo));

CREATE MATERIALIZED VIEW LOG ON foo WITH ROWID;

CREATE TABLE bar(foo NUMBER, bar NUMBER, CONSTRAINT bar_pk PRIMARY KEY(foo, bar));

CREATE MATERIALIZED VIEW LOG ON bar WITH ROWID;

CREATE MATERIALIZED VIEW foo_bar
  NOLOGGING
  CACHE
  BUILD IMMEDIATE
  REFRESH FAST ON COMMIT  AS SELECT foo.foo, 
                                    bar.bar, 
                                    foo.ROWID AS foo_rowid, 
                                    bar.ROWID AS bar_rowid 
                               FROM foo, bar
                              WHERE foo.foo = bar.foo;
45
Allan

ANSI結合なしで試してみましたか?

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V,TPM_PROJECT P 
WHERE  P.PROJECTID = V.PROJECTID
5
steve godfrey

クエリが参照しているマスターテーブルのマテリアライズドビューログを作成しないと、REFRESH_FASTでエラーが発生します。マテリアライズドビューに慣れていない人や初めてマテリアライズドビューを使用する人がいない場合、Oracle sqldeveloperを使用してグラフィカルにオプションを設定するのがより良い方法です。また、エラーもより良い意味を提供します。

3
Paul

FAST REFRESHのキーチェックには以下が含まれます。

1) An Oracle materialized view log must be present for each base table.
2) The RowIDs of all the base tables must appear in the SELECT list of the MVIEW query definition.
3) If there are outer joins, unique constraints must be placed on the join columns of the inner table.

No 3は見逃しやすいため、ここで強調する価値があります

1
pahariayogi