Oracle - How to create a materialized view with FAST REFRESH and JOINS

前端 未结 4 913
攒了一身酷
攒了一身酷 2020-12-01 06:16

So I\'m pretty sure Oracle supports this, so I have no idea what I\'m doing wrong. This code works:

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  B         


        
相关标签:
4条回答
  • 2020-12-01 06:45

    Have you tried it without the ANSI join ?

    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
    
    0 讨论(0)
  • 2020-12-01 06:47

    To start with, from the Oracle Database Data Warehousing Guide:

    Restrictions on Fast Refresh on Materialized Views with Joins Only

    ...

    • Rowids of all the tables in the FROM list must appear in the SELECT list of the query.

    This means that your statement will need to look something like this:

    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
    

    Another key aspect to note is that your materialized view logs must be created as with rowid.

    Below is a functional test scenario:

    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;
    
    0 讨论(0)
  • 2020-12-01 06:47

    You will get the error on REFRESH_FAST, if you do not create materialized view logs for the master table(s) the query is referring to. If anyone is not familiar with materialized views or using it for the first time, the better way is to use oracle sqldeveloper and graphically put in the options, and the errors also provide much better sense.

    0 讨论(0)
  • 2020-12-01 07:02

    The key checks for FAST REFRESH includes the following:

    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 is easy to miss and worth highlighting here

    0 讨论(0)
提交回复
热议问题