Fast refreshable mviews vs. cdc

im currently working on a new data warehouse environment. i need to create an ods schema for each of the operational systems in my warehouse.
i've looked at two of 10gR2 prefered technologies for this task:
fast refreshable materialized view and change data capture.
i would to know what is the difference between this two approaches.
in my understanding, there both cause a performance overhead and require some amount of additional work on each dml operations. in addition , there both work on the method of capturing changes from a table and applying them on a target database.
the only difference i could think of is that cdc capture changes from the redo log so that commit time on the operational system wont be affected (as much as it would when logging a dml operation in a mview log).

dba_snapshot_refresh_times or dba_mview_refresh_times would help.
select job, last_date last_refresh, next_date next_refresh, total_time,what from dba_jobs where what like '%dbms_refresh%'
This will work only if the refresh is scheduled to run through job queue.

Similar Messages

  • Fast Refresh mview performance

    Hi,
    I'm actually facing with Fast Refresh Mview performace problems and i would like to know what is the possible improvments for the fast refresh procedure:
    - base table is 1 500 000 000 rows partitions by day , subparttion by has (4)
    - mlog partition by hash (4) with indexes on pk and snaptime
    - mview partition by day subpartition by hash (4)
    10 000 000 insertions / day in base table/mlog
    What improvment or indexes can i add to improve fast refresh ?
    Thanks for help

    Hi,
    Which DB version are you using?
    Did you have a look at the MV refresh via Partition Change Tracking (PCT)?
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/advmv.htm#sthref575
    If it's possible to use PCT, it would probably improve a lot the performance of the refresh of your MV.
    Regards
    Maurice

  • Fast Refreshable MVIEW

    Trying to create a fast refresh materialized view based on a simple join of two tables over a database link oracle gives a 'COMPLEX QUERY' error (ORA-12015).
    Logging on the origin tables should be ok as creating the MVIEW based on the same select but in the database where the origin tables are poses no problem. The logging tables are created based on primary key and include rowid.
    The select on which the MVIEW should be created is someting like:
    select
    tab1.rowidn id1,
    tab2.rowidn id2,
    tab1.key_idn key1,
    tab2.key_idn key2
    from table1@other_db tabl,table2@other_db tab2
    where tab1.key_idn = tab2.key_idn)
    Does this mean it is impossible to create a fast refresh materialized view over a database link when a join condition is involved?

    Replace the ANSI Joins with Conventional Joins.
    Change this :
    SELECT * FROM V_FIRST VF
    LEFT JOIN R4
    ON VF.ID=R4.ID
    LEFT JOIN R5
    ON  VF.ID=R5.IDto this :
    SELECT VF.* FROM V_FIRST VF, R4, R5
    WHERE  VF.ID=R4.ID
    AND  VF.ID=R5.IDHemant K Chitale

  • Error when try to Fast Refresh Mview ......

    Guys d u have an idea .....
    why when I running job that fast refresh an mview.
    I alwayas got error :
    ORA-12008: error in materialized view refresh path
    ORA-01555: snapshot too old: rollback segment number 2268 with name
    "_SYSSMU2268$" too small
    undo_management set to AUTO.
    undo tablespace has enough space.
    I have mview log on master database.
    regards,
    indrajati

    damorgan's request for more information is completele relevant.
    However, "Snapshot to old" is often due to insufficient rollback/undo space. What happens (grossly simplified) is that when re-reading stored data the database finds it has been overwritten and raises the error. The suggested fix is usually to increase rollback/undo space.

  • How much time My FAST refreshable MVIEWS taken to refresh in last refresh?

    How to find the DURATION of last FAST refresh of MVIEWS?
    Refresh duration will vary depends on data change on base table. I would like to find the duration of last refresh

    dba_snapshot_refresh_times or dba_mview_refresh_times would help.
    select job, last_date last_refresh, next_date next_refresh, total_time,what from dba_jobs where what like '%dbms_refresh%'
    This will work only if the refresh is scheduled to run through job queue.

  • Fast refresh Mview

    hi
    plz tell me why am not able to create a Fast refresh materialized View
    SQL> CONNECT SCHEMA1/SCHEMA@HOST;
    Connected.
    SQL> CREATE MATERIALIZED VIEW LOG ON COMPANY WITH PRIMARY KEY;
    Materialized view log created.
    SQL> CREATE MATERIALIZED VIEW LOG ON EMPLOYEE WITH PRIMARY KEY;
    Materialized view log created.
    SQL> GRANT SELECT ON MLOG$_COMPANY TO SCHEMAREP;
    Grant succeeded.
    SQL> GRANT SELECT ON MLOG$_EMPLOYEE TO SCHEMAREP;
    Grant succeeded.
    SQL> CONNECT SCHEMAREP/REPORTS@HOST;
    Connected.
    SQL>
    SQL> CREATE MATERIALIZED VIEW mview_1
    2 REFRESH fast on DEMAND
    3 AS
    4 SELECT EMPLOYEE.EMPLOYEE_num
    5 FROM schema1.COMPANY company,schema1.EMPLOYEE EMPLOYEE
    6 WHERE COMPANY.COMPANY_ID=EMPLOYEE.COMPANY_ID;
    FROM schema1.COMPANY company,schema1.EMPLOYEE EMPLOYEE
    ERROR at line 5:
    ORA-12052: cannot fast refresh materialized view SCHEMAREP.MVIEW_1
    SQL>

    You would be able to answer yourself your question, if you
    a) read the restrictions for fast refresheable materialized view at
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/basicmv.htm#sthref537
    b) make you familiar with the packaged procedure dbms_mview.explain_mview
    Best regards
    Maxim

  • Fast refreshable Mview question.

    Hi All,
    Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
    PL/SQL Release 11.1.0.7.0 - Production
    "CORE     11.1.0.7.0     Production"
    TNS for Linux: Version 11.1.0.7.0 - Production
    NLSRTL Version 11.1.0.7.0 - Production
    Can't we make a Fast refresh materialized view which has UNIONALL operator on REMOTE DATA BASE..?
    REMOTEDB: R
    TARGETDB:T
    Note: all these tables are in Remote DB(R) and I want to create a Mat view on Target DB (T).
    create or replace view V_FIRST
    As
    select * from R1
    UNION ALL
    select * from R2
    UNION ALL
    select * from R3Now i am creating a Fast refresh Mat view
    CREATE MATERIALIZED VIEW REMOTE_MV
    REFRESH FAST ON DEMAND AS
    SELECT * FROM V_FIRST VF
    LEFT JOIN R4
    ON VF.ID=R4.ID
    LEFT JOIN R5
    ON  VF.ID=R5.IDHere i am getting error can not create a fast refreshable mat view on a complex query.
    I think we can create a fast refreshable Mat view which has UNION ALL operator... I don't know about remote tables.
    How to achieve this... with out splitting the Mat view ?. Is there any way..?
    Appreciate your help.
    Thanks,
    Mike

    Replace the ANSI Joins with Conventional Joins.
    Change this :
    SELECT * FROM V_FIRST VF
    LEFT JOIN R4
    ON VF.ID=R4.ID
    LEFT JOIN R5
    ON  VF.ID=R5.IDto this :
    SELECT VF.* FROM V_FIRST VF, R4, R5
    WHERE  VF.ID=R4.ID
    AND  VF.ID=R5.IDHemant K Chitale

  • Regarding error in fast refresh for Materialized

    ORA-12015: cannot create a fast refresh materialized view from a complex query
    CREATE MATERIALIZED VIEW CRESTELVIEWSDEV510.MVCONTENTHISTORY
    TABLESPACE CRESTELVIEWSDEV510
    NOCACHE
    LOGGING
    NOCOMPRESS
    NOPARALLEL
    BUILD IMMEDIATE
    REFRESH FAST
    ENABLE QUERY REWRITE
    AS
    SELECT a.DAY, a.contentname,
    SUM
    (CASE
    WHEN (b.subscriptionstartdate) <= (a.DAY)
    AND ((CASE
    WHEN b.subscriptionenddate IS NOT NULL
    THEN (a.DAY)
    ELSE TO_DATE ('01/20/1990', 'MM/DD/YYYY')
    END
    ) <=
    (CASE
    WHEN b.subscriptionenddate IS NOT NULL
    THEN (b.subscriptionenddate)
    ELSE TO_DATE ('01/20/1990', 'MM/DD/YYYY')
    END
    THEN 1
    ELSE 0
    END
    ) COUNT,
    COUNT
    (CASE
    WHEN (b.subscriptionstartdate) <= (a.DAY)
    AND ((CASE
    WHEN b.subscriptionenddate IS NOT NULL
    THEN (a.DAY)
    ELSE TO_DATE ('01/20/1990', 'MM/DD/YYYY')
    END
    ) <=
    (CASE
    WHEN b.subscriptionenddate IS NOT NULL
    THEN (b.subscriptionenddate)
    ELSE TO_DATE ('01/20/1990', 'MM/DD/YYYY')
    END
    THEN 1
    ELSE 0
    END
    ) cnt
    FROM TBLTDATEWISECONTENT a,
    (SELECT TRUNC (a.subscriptionstartdate) subscriptionstartdate,
    TRUNC (a.subscriptionenddate) subscriptionenddate, b.NAME,
    b.contentid
    FROM syntbltcontentsubscrhistory a, syntblmcontent b
    WHERE b.contentid = a.contentid(+)) b
    WHERE a.contentid = b.contentid(+)
    AND a.DAY = b.subscriptionstartdate(+)
    GROUP BY a.contentname, a.DAY;
    while creation time of this Materialized I have receive above error ORA-12015
    I have also crated log with Primary on all base tables and index on column that is in where clause.
    Kindly provide solution .
    I want to create this MV with FAST Refresh.
    Regards,
    nayana chavda.

    What's your Oracle version?
    The error is pretty self explanatory. You can not build fast refresh MView with complex query.
    check Oracle document,
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14226/repmview.htm#BABEEHGJ
    To be fast refreshed, the defining query for a materialized view must observe certain restrictions. If you require a materialized view whose defining query is more general and cannot observe the restrictions, then the materialized view is complex and cannot be fast refreshed.
    ...

  • FAST enabled MView takes ages to refresh

    Hi All,
    I have a materlialized view which is based on a single fact table ( OAS_BALANCE_UNIONED 11,445,156 rows) and a bunch of dimension tables each containing limited number of rows (a typical start schema).
    The conditioins to make the mview fast refreshable have been met so the mview created successfully with the FAST option.
    The mview then worked just fine after than and had been refreshing FAST (6 minutes) for the whole day till other mviews started to refresh in the same time. Some of those mviews read from some of the base tables of the mview in question. Since then, the mivew has started to take ages (3 hours) to refresh. There is surely something wrong because the COMPLETE refresh was faster than that.
    Later, I stopped all the refresh jobs of the other mviews. Yet, the FAST mview still has the same problem of taking ages to refresh.
    When I monitored the session that refreshes the mview, I noticed in the "Long Ops" that
    most of the time is spent on a step named as "Hash Join" (it appears in the Message column). Hash join occurrs because of the outer join.
    Why my FAST mview suddenly started to take so long time to refresh?
    How can I make my FAST mivew really refresh fast?
    Technical Details are below:
    OS: Windows 2003 32-bit
    DB version: Oracle 10g R1 ( 10.1.0.2.0 )
    CREATE MATERIALIZED VIEW FACT_BAL_MV
    BUILD DEFERRED
    REFRESH FAST ON DEMAND
    WITH PRIMARY KEY
    AS
    SELECT B.cmpcode  BAL_KEY,
           B.CMPCODE,
           B.YR,
           B.PERIOD,
           B.BALCODE,
           B.CURCODE,
           B.REPBASIS,
           TO_NUMBER (B.YR || LPAD (B.PERIOD, 2, 0)) DIM_PERIOD_MV,
           D_CMP.DIM_KEY DIM_COMPANY,
           D_CUR.DIM_KEY DIM_CURRENCY,
           D_EL_1.DIM_KEY DIM_EL_1,
           D_EL_2.DIM_KEY DIM_EL_2,
           D_EL_3.DIM_KEY DIM_EL_3,
           D_EL_4.DIM_KEY DIM_EL_4,
           GRP_1_P_EL.DIM_KEY DIM_GRP_1_P_EL,
           D_GRP_1_B_EL.DIM_KEY DIM_GRP_1_B_EL,
           D_GRP_1_K_EL.DIM_KEY DIM_GRP_1_K_EL,
           D_GRP_2_D_EL.DIM_KEY DIM_GRP_2_D_EL,
           D_GRP_3_E_EL.DIM_KEY D_GRP_3_E_EL,
           B.ROWID X_OB_ROWID,
           D_CMP.ROWID X_CMP_ROWID,
           D_CUR.ROWID X_CUR_ROWID,
           D_EL_1.ROWID X_EL_1_ROWID,
           D_EL_2.ROWID X_EL_2_ROWID,
           D_EL_3.ROWID X_EL_3_ROWID,
           D_EL_4.ROWID X_EL_4_ROWID,
           GRP_1_P_EL.ROWID X_GRP_1_P_EL_ROWID,
           GRP_1_P.ROWID X_GRP_1_P_ROWID,
           D_GRP_1_B_EL.ROWID X_GRP_1_B_EL_ROWID,
           D_GRP_1_B.ROWID X_GRP_1_B_ROWID,
           D_GRP_1_K_EL.ROWID X_GRP_1_K_EL_ROWID,
           D_GRP_1_K.ROWID X_GRP_1_K_ROWID,
           D_GRP_2_D_EL.ROWID X_GRP_2_D_EL_ROWID,
           D_GRP_2_D.ROWID X_GRP_2_D_ROWID,
           D_GRP_3_E_EL.ROWID X_GRP_3_E_EL_ROWID,
           D_GRP_3_E.ROWID X_GRP_3_E_ROWID
      FROM CLVE_STAGING.OAS_BALANCE_UNIONED B,
           FINANCE.DW_DIM_COMPANY D_CMP,
           FINANCE.DW_DIM_CURRENCY D_CUR,
           FINANCE.DW_DIM_EL_1 D_EL_1,
           FINANCE.DW_DIM_EL_2 D_EL_2,
           FINANCE.DW_DIM_EL_3 D_EL_3,
           FINANCE.DW_DIM_EL_4 D_EL_4,
           FINANCE.DW_DIM_GRP_1_P_EL GRP_1_P_EL,
           FINANCE.DW_DIM_GRP_1_P GRP_1_P,
           FINANCE.DW_DIM_GRP_1_B_EL D_GRP_1_B_EL,
           FINANCE.DW_DIM_GRP_1_B D_GRP_1_B,
           FINANCE.DW_DIM_GRP_1_K_EL D_GRP_1_K_EL,
           FINANCE.DW_DIM_GRP_1_K D_GRP_1_K,
           FINANCE.DW_DIM_GRP_2_D_EL D_GRP_2_D_EL,
           FINANCE.DW_DIM_GRP_2_D D_GRP_2_D,
           FINANCE.DW_DIM_GRP_3_E_EL D_GRP_3_E_EL,
           FINANCE.DW_DIM_GRP_3_E D_GRP_3_E
    WHERE     B.CMPCODE = D_CMP.CODE
           AND (B.CMPCODE = D_CUR.CMPCODE(+) AND B.CURCODE = D_CUR.CODE(+))
           AND (B.CMPCODE = D_EL_1.CMPCODE(+) AND B.EL1 = D_EL_1.EL_CODE(+))
           AND (B.CMPCODE = D_EL_2.CMPCODE(+) AND B.EL2 = D_EL_2.EL_CODE(+))
           AND (B.CMPCODE = D_EL_3.CMPCODE(+) AND B.EL3 = D_EL_3.EL_CODE(+))
           AND (B.CMPCODE = D_EL_4.CMPCODE(+) AND B.EL3 = D_EL_4.EL_CODE(+))
           AND (GRP_1_P_EL.CMPCODE = GRP_1_P.CMPCODE(+)
                AND GRP_1_P_EL.GRP_CODE = GRP_1_P.GRP_CODE(+))
           AND (B.CMPCODE = GRP_1_P_EL.CMPCODE(+)
                AND B.EL1 = GRP_1_P_EL.EL_CODE(+))
           AND (D_GRP_1_B_EL.CMPCODE = D_GRP_1_B.CMPCODE(+)
                AND D_GRP_1_B_EL.GRP_CODE = D_GRP_1_B.GRP_CODE(+))
           AND (B.CMPCODE = D_GRP_1_B_EL.CMPCODE(+)
                AND B.EL1 = D_GRP_1_B_EL.EL_CODE(+))
           AND (D_GRP_1_K_EL.CMPCODE = D_GRP_1_K.CMPCODE(+)
                AND D_GRP_1_K_EL.GRP_CODE = D_GRP_1_K.GRP_CODE(+))
           AND (B.CMPCODE = D_GRP_1_K_EL.CMPCODE(+)
                AND B.EL1 = D_GRP_1_K_EL.EL_CODE(+))
           AND (D_GRP_2_D_EL.CMPCODE = D_GRP_2_D.CMPCODE(+)
                AND D_GRP_2_D_EL.GRP_CODE = D_GRP_2_D.GRP_CODE(+))
           AND (B.CMPCODE = D_GRP_2_D_EL.CMPCODE(+)
                AND B.EL2 = D_GRP_2_D_EL.EL_CODE(+))
           AND (D_GRP_3_E_EL.CMPCODE = D_GRP_3_E.CMPCODE(+)
                AND D_GRP_3_E_EL.GRP_CODE = D_GRP_3_E.GRP_CODE(+))
           AND (B.CMPCODE = D_GRP_3_E_EL.CMPCODE(+)
                AND B.EL3 = D_GRP_3_E_EL.EL_CODE(+));
    CREATE INDEX FINANCE.DW_FACT_BAL_MV_INX
    ON FACT_BAL_MV (X_OB_ROWID);
    SQL> select count(X_OB_ROWID) from FACT_BAL_MV ;
    COUNT(X_OB_ROWID)
             11444816
    Elapsed: 00:00:27.85
    SQL> select bytes/1024/1024/1024 GB from
    user_segments where segment_name='FACT_BAL_MV';
            GB
    4.4296875search id: redcorolla

    Hard to say why the refresh is now slow. Possibilties include
    * system resources implemented by the fast refresh
    * something changed on the query making the background query run slowly
    Look at the query first. 18 tables, with almost every join an outer join. Some of the tables appear more than once in the query.
    Get an executioion plan to see how the query is being executed.

  • Mview Fast Refresh Problem

    Hello,
    We run a fast refresh for a particular mview. I have the mview log created on the primary db (base table) and the mview created on another reporting database.
    The fast refresh seems to be fine throughout the day but at the end of a day it fails to do the fast refresh and i'm forced to do a complete refresh everyday which fixes it but this cycle continues until the end of day when it breaks again.
    If you notice in the next date column the refresh date turns to 01-JAN-00, not sure why this happens and this is causing the problem.
    JOB REFRESH_JOB LAST_DATE NEXT_DATE NEXT_SEC BROKEN
    70 CON_SYS"."MV_BRICKNW" 04-AUG-10 01-JAN-00 00:00:00 Y
    75 CON_SYS"."MV_BRICKNWCAN" 04-AUG-10 01-JAN-00 00:00:00 Y
    Could someone please tell me what the problem is.

    The Refresh Date gets reset when the job is Broken (which you see as BROKEN='Y'). The job is Broken when 16 consecutive attempts have failed (which you would see in FAILURE_COUNT).
    You have to find out why it fails -- fails 16 times. There seems to be an issue with the date/time logic OR one of the source objects probably gets dropped or becomes unavailable close to the end of the day.
    Hemant K Chitale

  • Mview fast refresh taking longer than complete refresh

    Hi there,
    We have a mview which takes about an hour to refresh in complete mode. Created all the mview logs and refreshing via fast method but this takes longer.
    When all the mview logs empty works fine as fast refresh and far far quicker as would expect. Tried upadting one of records on base table called todays_date which simply stores todays date to get around fast refresh restriction with sysdate.
    Anybody any idea why so slow?
    Also wondering if better approach. Thought about just having an aggregate table and processing the inserts in MLOG$_TRANS_TABLE via a merge statement. Also heard about change data capture.
    Any thoughts/suggestions welcome.
    Many Thanks

    Well, search with your post subject on this forum. There are a lot of threads discussing the same.

  • Fast Refresh MVs and HASH_SJ Hint

    I am building fast refresh MVs on a 3rd party database to enable faster reporting. This is an interim solution whilst we build a new ETL process using CDC.
    The source DB has no PKs, so I'm creating the MV logs with ROWID. When I refresh the MV (exec DBMS_MVIEW.REFRESH('<mview_name>') and trace the session I notice:
    1. The query joins back to the base table - I think this is necessary as there are two base tables and the MV change could be instigated from either table independently. Therefore the changes might not be in the log.
    2. However in this case shouldn't it be possible to just joij mv_log1 to base_table2 and ignore base_table1?
    3. There is a HASH_SJ hint in this join, forcing a full table scan on the 7M row base_table1.
    4. I am doing 1 update then refreshing the MV
    5. In production this table would have many 10s of single row inserts and updates per minute
    This is an excerpt from the tkprof'd trace file (I've hidden some table/column names)
    FROM   (SELECT MAS$.ROWID RID$ 
                  ,MAS$.* 
            FROM   <base_table1> MAS$
            WHERE  ROWID IN (SELECT  /*+ HASH_SJ */ 
                                    CHARTOROWID(MAS$.M_ROW$$) RID$    
                             FROM   <mview_log1> MAS$  
                             WHERE  MAS$.SNAPTIME$$ > sysdate-1/24 --:1
           ) AS OF SNAPSHOT (:2) JV$
           ,<base_table2> AS OF SNAPSHOT (:2)  MAS$0
    WHERE   JV$.<col1>=MAS$0.<col1>
    AND     JV$.<col2>=MAS$0.<col2>
    call     count       cpu    elapsed       disk      query    current        rows
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1     13.78     153.32     490874     551013          3           1
    Fetch        0      0.00       0.00          0          0          0           0
    total        2     13.78     153.32     490874     551013          3           1
    Misses in library cache during parse: 1
    Misses in library cache during execute: 1
    Optimizer mode: ALL_ROWS
    Parsing user id: 277  (<user>)   (recursive depth: 1)
    Rows     Row Source Operation
          1  TABLE ACCESS BY INDEX ROWID <base_table2>(cr=551010 pr=490874 pw=0 time=153321352 us)
          3   NESTED LOOPS  (cr=551009 pr=490874 pw=0 time=647 us)
          1    VIEW  (cr=551006 pr=490874 pw=0 time=153321282 us)
          1     HASH JOIN RIGHT SEMI (cr=551006 pr=490874 pw=0 time=153321234 us)
          2      TABLE ACCESS FULL <base_table1_mv_log> (cr=21 pr=0 pw=0 time=36 us)
    7194644      TABLE ACCESS FULL <base_table1>(cr=550985 pr=490874 pw=0 time=158282171 us)
          1    INDEX RANGE SCAN <base_table2_index> (cr=3 pr=0 pw=0 time=22 us)(object id 3495055)As you can see there are two rows in the MV log (one update, old and new values), the FTS on the base table ensure that the MV refresh is far from fast
    I have tried this with refreshing on demand and commit with similar results. Implementing this would make my the application impossibly slow.
    I will search the knowledge base once I am given access
    SQL>select * from v$version;
    BANNER
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
    PL/SQL Release 10.2.0.4.0 - Production
    CORE    10.2.0.4.0      Production
    TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - ProductionThank you for taking the time to read/respond.
    Ben

    Thanks for looking.
    From the Knowledge Base it appears that Bug 6456841 might be the cause. I'll play around with the settings it suggests and see what happens.
    the MV query is basically:
    SELECT ...
    FROM   base_table1
          ,base_table2
    WHERE  base_table1.col1 = base_table2.col1
    AND    base_table1.col2 = base_table2.col2When 1 row in base_table1 is updated there is a FTS for that table, rather than:
    1. getting the data from the MV log or
    2. a Nested loop join to base_table1 from its mv_log on rowid
    This is due to the oracle internal code putting a HASH_SJ hint in when joining the mv log to its base table
    Ben

  • How to speed up fast refresh of materialized view without primary key

    Thought I'd share this info, as I couldn't find anything on here to help me diagnose the issue:
    I had a materialized view that was taking longer to perform a fast refresh than it took to perform a complete refresh. My mview had no primary key, as the base table had no primary key.
    I created a trace file for the session and saw references to a column M_ROW$$ in my mview. Nowhere in the data dictionary could I find a reference to the m_row$$ column in my mview, but apparently it exists and is created automatically. After creating the index below, the fast refresh took 6 minutes to add 500k rows to the materialized view. (versus 4+ hours without the index) When I looked in the trace file, I noticed that for each row in the mview log, it first tries to update the mview with an UPDATE statement, then it performs an insert of the new data. Seems like it should be able to determine whether to perform an update or insert based on the DMLTYPE$$ column of the mview log. What was killing my performance was the UPDATE phase. Since I had no primary key on the mview, and no index on the m_row$$ column, the UPDATE phase was performing a full table scan of my mview for every row in the mview log. I was expecting it to be smart enough to only perform inserts, as the only transactions against the base table were inserts.
    In summary: If you have a materialized view without a primary key, create an index on the m_row$$ column of the mview, even though no such column displays in the data dictionary.
    ex:
    CREATE MATERIALIZED VIEW mv_minidrr ...
    CREATE INDEX pk_mv_minidrr ON mv_minidrr(m_row$$) ...

    Well, there indeed is a column called M_ROW$$
    Your MLOG$_EMP is nothing but the materialized view log on the base table.
    SQL> create  materialized view log on emp with rowid ;
    Materialized view log created.
    SQL> create materialized view emp_mview refresh fast on demand with rowid as select * from emp ;
    Materialized view created.
    SQL> desc mlog$_emp
    Name                                                  Null?    Type
    M_ROW$$                                                        VARCHAR2(255)
    SNAPTIME$$                                                     DATE
    DMLTYPE$$                                                      VARCHAR2(1)
    OLD_NEW$$                                                      VARCHAR2(1)
    CHANGE_VECTOR$$                                                RAW(255)
    SQL> select table_name, column_name from user_tab_columns where column_name = 'M_ROW$$' ;
    TABLE_NAME                     COLUMN_NAME
    MLOG$_EMP                      M_ROW$$
    1 row selected.
    SQL>

  • MLOGS not purge after a fast refresh (Materialized view) ...

    Hi,
    I have a database on my own site (Quebec) that has 36 materialized views refresh by a master table site that is physically at Montreal. The MVIEWs are refreshed every day of the week (monday to friday) at 7h00 until 19h00. We use the "fast refresh" technic to refresh the materialized views.
    Last weekend, I transfered this database on a new server. So, I created a new SID (I rename the old SID "ORCL" by "ATQP") and I created this instance with a DB_BLOCK_SIZE of 16k rather than 8k. It's the only difference between the two instances (the old one and the new one). I also created the owner schema "ATQP" and I made an Export on the old server followed by an Import of the schema that owned the Materialized views (not a Full import) on the new server. The export was made many hours (saturday morning) after the last refresh of the week (friday, at 19h00) on the old server.
    After the successul import on my new server, I'm looking for the information about the creation of the MVIEW. Everything seems OK. I can see that the last refresh date indicated "2008-02-22 19:00" (date / time of the last refresh of the week). I made a quick test on a small MVIEW (a fast refresh) and it worked, no error.
    Yesterday morning, the DBA of the master table site mentionned us that the DELETE on the MLOGS didn't work on the master site. The refresh was made successfully but the MLOGS continue to grow up, again and again ... On my database, I'm looking in the SYS.SNAP$ table and I saw that the SNAPTIME date is '1950-01-01 12:00' rather than '2008-02-25 19:00'. In the SYS.SNAP_REFTIME, the SNAPTIME is OK but the LOADERTIME column contains the same strange date '1950-01-01 12:00'.
    I made a quick check on my old server and the SYS.SNAP$ table is empty !!! I think it's normal because the last refresh on this node was made last friday night and I made the transfert last saturday (I shutdown the old database after).
    I know how to solve the problem, by recreate the MVIEW, but it causes a big problem for us. We are in PRODUCTION and we don't want to refresh many millions of records. I think it will take a couple of days to refresh all the materialized views of my schema. And it doesn't sound good by the master table site management team ...
    The master table site "rush" us to solve the problem before the weekend. They don't want that we overcharge the network link between them and us by refreshing those MVIEWS.
    So, is it possible to make something simple to resynchronized the SNAPTIME date without refreshing completely all the materialized views ?
    If the master site table recreate the MLOG (purge manually), is it possible that it will solve our problem ?
    Is it also possible to recreate the MVIEW without refreshing the data (specify to Oracle to recreate the MVIEW but indicate that the table associated already exist) ?
    All of my materialized view are up to date concerning the data. I don't want to refresh all of it.
    Thank's in advance ...

    Hi Justin,
    The DBA of the master table site sent me a email about the fact he unregistered the MVIEW. He told me that the script for the unregistered worked well. He tried to purge the MLOG and he got the error ORA-23424 but I think it's normal (It's what you said yesterday about the fact that the UNREGISTER command also purge the MLOGS).
    So, it seems that the MLOGS are still not purged (that's what the DBA of the master table site said). I ran the following query:
    SQL> select * from [email protected];
    LOG_OWNER MASTER LOG_TABLE LOG_TRIGGER ROW PRI OBJ FIL SEQ INC
    ATQ ALIAS_ANILOTS MLOG$_ALIAS_ANILOTS NO YES NO YES NO YES
    ATQ ALIAS_INTERVENANTS MLOG$_ALIAS_INTERVENANTS NO YES NO YES NO YES
    ATQ ANILOTS MLOG$_ANILOTS NO YES NO YES NO YES
    ATQ CATEGORIES MLOG$_CATEGORIES NO YES NO YES NO YES
    ATQ CODES_POSTAUX MLOG$_CODES_POSTAUX NO YES NO YES NO YES
    ATQ COMMANDES MLOG$_COMMANDES NO YES NO YES NO YES
    ATQ COMMUNICATIONS MLOG$_COMMUNICATIONS NO YES NO YES NO YES
    ATQ DEPLACEMENTS MLOG$_DEPLACEMENTS NO YES NO YES NO YES
    ATQ DETAILS_STATUTS_COMMANDES MLOG$_DETAILS_STATUTS_COMM NO YES NO YES NO YES
    ATQ DOMAINES MLOG$_DOMAINES NO YES NO YES NO YES
    ATQ ENREGISTREMENT_LOGS MLOG$_ENREGISTREMENT_LOGS NO YES NO YES NO YES
    ATQ ENREGISTREMENT_NOTES MLOG$_ENREGISTREMENT_NOTES NO YES NO YES NO YES
    ATQ ESPECES MLOG$_ESPECES NO YES NO YES NO YES
    ATQ EVENEMENTS MLOG$_EVENEMENTS NO YES NO YES NO YES
    ATQ EVENE_DIFFERES MLOG$_EVENE_DIFFERES NO YES NO YES NO YES
    ATQ IDENTIFIANTS MLOG$_IDENTIFIANTS NO YES NO YES NO YES
    ATQ INTERVENANTS MLOG$_INTERVENANTS NO YES NO YES NO YES
    ATQ INTERVENANTS_CLIENTS MLOG$_INTERVENANTS_CLIENTS NO YES NO YES NO YES
    ATQ INTERVENANTS_SITES MLOG$_INTERVENANTS_SITES NO YES NO YES NO YES
    ATQ MAX_EVENE_DIFFERES MLOG$_MAX_EVENE_DIFFERES NO YES NO YES NO YES
    ATQ MESSAGES MLOG$_MESSAGES NO YES NO YES NO YES
    ATQ MUNICIPALITES MLOG$_MUNICIPALITES NO YES NO YES NO YES
    ATQ NEW_ANILOTS MLOG$_NEW_ANILOTS NO YES NO YES NO YES
    ATQ NEW_EVENEMENTS MLOG$_NEW_EVENEMENTS NO YES NO YES NO YES
    ATQ NEW_IDENTIFIANTS MLOG$_NEW_IDENTIFIANTS NO YES NO YES NO YES
    ATQ NEW_SITES MLOG$_NEW_SITES NO YES NO YES NO YES
    ATQ PAYS MLOG$_PAYS NO YES NO YES NO YES
    ATQ PRODUCTIONS MLOG$_PRODUCTIONS NO YES NO YES NO YES
    ATQ PROPRIETES_ANILOTS MLOG$_PROPRIETES_ANILOTS NO YES NO YES NO YES
    ATQ PROVINCES MLOG$_PROVINCES NO YES NO YES NO YES
    ATQ SITES_EXPLOITATIONS MLOG$_SITES_EXPLOITATIONS NO YES NO YES NO YES
    ATQ TYPES_IDENTIFIANTS MLOG$_TYPES_IDENTIFIANTS NO YES NO YES NO YES
    ATQ UTILISATEURS MLOG$_UTILISATEURS NO YES NO YES NO YES
    ATQ VALEURS MLOG$_VALEURS NO YES NO YES NO YES
    ATQ VALEURS_DETAILS MLOG$_VALEURS_DETAILS NO YES NO YES NO YES
    ATQ VEHICULES MLOG$_VEHICULES NO YES NO YES NO YES
    36 ligne(s) sélectionnée(s).
    SQL>
    I supposed that is the result of the MLOG of the MVIEW associated with my new server. How can I be sure that the MLOG associated with the old one are really deleted ?
    Thank you

  • Fast Refreshing Materialized View

    I have an mview which the base tables resideson different schema, the base tables also have mview log. When I try to insert rows into base tables, these errors show up:
    Error report:
    SQL Error: ORA-12008: error in materialized view refresh path
    ORA-00942: table or view does not exist
    the mview should be fast refreshed on each commit on the base tables.
    I already grant all priviliges on base tables to mview owner, do I need to grant privileges mlog$_ and rupd$_ too (I don't see mview$_ and snap$_ tables on base table schema as metioned in the documentation)
    or do i miss something?
    Thanks in advance,
    Nur Hidayat
    null

    Problem solved, mview owner must have select privilege granted on mlog$_ tables.
    Thanks 2u all,
    Nur Hidayat

Maybe you are looking for

  • Connecter mon MAC et la TV

    bonjour j'ai une vielle tele SONY WEGA en un MAC avec la version 10.9.3 Depuis l'instalation de la fibre SFR il y a plus d'un an, impossible de connecter la télé et le mac SFR n'a pas de solution pour le problème. Peut-être quelqu'un peut m'aider? JM

  • WS20000075: work item of 1st release step stays in status In process

    Hi All, I have activated and set up standard flow WS20000075 but the work item of 1st release (PO release strategy with 3 levels) step stays in status In process. The work item for the 2nd and 3rd release step are completed as expected. What could ca

  • Cannot get a 2nd blockquote working in CSS - please help

    hi - hope someone can help.  I have a blockquote set up.  the css is the following: blockquote, q, quote {   background: #ece5d0 url(../images/quote.png) no-repeat;   font-family: "Times New Roman", Times, serif;   font-size: 18px;   font-style: ital

  • Software update for LG Vortex

    What is up with the LG Vortex madatory software update from VS660ZV5 to VS660ZV6? The new ZV6 version sucks!!.  I used to be able to better manage battery life and had better control over data enable or phone service. With the update they changed the

  • Denote browsed sites by changing color of heading

    Early versions of Firefox used to change the browsed sites from blue to red so that when you returned to the principle listing page all the sites you had already browsed were highlighted in red. This made it easy to keep track of where you had been.