ORA-12015: cannot create a fast refresh materializ

2019-07-29 17:06发布

问题:

I am using below query to build a materialized view.

CREATE MATERIALIZED VIEW gcms_business_profile_mview 
BUILD IMMEDIATE  
REFRESH FAST  
        WITH PRIMARY KEY  
        START WITH SYSDATE  
        NEXT (TRUNC (SYSDATE + 1) + 20 / 96)  
AS
SELECT DISTINCT obp.bp_id,
       obp.bp_typ_cd,
       os.spcl_desc,
       obpi.frs_nm,
       obpi.mdl_nm,
       NVL (rep_lst_nm.lst_nm, othr_lst_nm.lst_nm) last_name,
       NVL (rep_lst_nm.lst_nm_typ_id, othr_lst_nm.lst_nm_typ_id)
          last_name_type_id       
  FROM tr_ods.ods_business_parties obp
       LEFT JOIN (  SELECT bp_id,  
                                speciality_id,  
                                updtd_dt,  
                                ROW_NUMBER ()  
                                OVER (PARTITION BY bp_id ORDER BY updtd_dt DESC)  
                                   AS spec_rn  
                           FROM tr_ods.ods_bp_specialty  
                          WHERE updtd_dt IS NOT NULL  
                       ) obs  
               ON obs.bp_id = obp.bp_id  
               AND obs.spec_rn =1 
       LEFT JOIN tr_ods.ods_specialty  os                                       
          ON  os.speciality_id = latest_spec.speciality_id 
          AND    os.delete_flag = 'N'
       LEFT JOIN tr_ods.ods_business_party_individuals obpi   
          ON obpi.bp_id = obp.bp_id
       LEFT JOIN (SELECT obpln1.bp_id,
                obpln1.lst_nm,
                obpln1.lst_nm_typ_id,
                ROW_NUMBER ()
                   OVER (PARTITION BY obpln1.bp_id ORDER BY updtd_dt DESC)
                   AS lst_rn_22
           FROM tr_ods.ods_business_party_last_names obpln1
          WHERE     lst_nm_typ_id = 22
                AND updtd_dt =
                       (SELECT MAX (obpln2.updtd_dt)
                          FROM tr_ods.ods_business_party_last_names obpln2
                         WHERE     obpln2.bp_id = obpln1.bp_id
                               AND obpln2.lst_nm_typ_id = 22)) rep_lst_nm                             
          ON (rep_lst_nm.bp_id = obp.bp_id AND rep_lst_nm.lst_rn_22 = 1)
       LEFT JOIN (SELECT obpln1.bp_id,
                obpln1.lst_nm,
                obpln1.lst_nm_typ_id,
                ROW_NUMBER ()
                   OVER (PARTITION BY obpln1.bp_id ORDER BY updtd_dt DESC)
                   AS lst_rn
           FROM tr_ods.ods_business_party_last_names obpln1
          WHERE     lst_nm_typ_id IN (21, 23)
                AND updtd_dt =
                       (SELECT MAX (obpln2.updtd_dt)
                          FROM tr_ods.ods_business_party_last_names obpln2
                         WHERE     obpln2.bp_id = obpln1.bp_id
                               AND obpln2.lst_nm_typ_id IN (21, 23))) othr_lst_nm                                  
          ON (othr_lst_nm.bp_id = obp.bp_id AND othr_lst_nm.lst_rn = 1)

I am getting

ORA-12015: cannot create a fast refresh materialized view from a complex query error message.

I have already created materialized view logs for all the tables. Could any one please help me in fixing this issue?

回答1:

CREATE MATERIALIZED VIEW - Restrictions on FAST Refresh

Restrictions on FAST Refresh

FAST refresh is subject to the following restrictions:

When you specify FAST refresh at create time, Oracle Database verifies that the materialized view you are creating is eligible for fast refresh. When you change the refresh method to FAST in an ALTER MATERIALIZED VIEW statement, Oracle Database does not perform this verification. If the materialized view is not eligible for fast refresh, then Oracle Database returns an error when you attempt to refresh this view.

  • Materialized views are not eligible for fast refresh if the defining query contains an analytic function or the XMLTable function.

  • Materialized views are not eligible for fast refresh if the defining query references a table on which an XMLIndex index is defined.

  • You cannot fast refresh a materialized view if any of its columns is encrypted.


Your query contains an analytic finction:

ROW_NUMBER () OVER (PARTITION BY bp_id ORDER BY updtd_dt DESC) 

therefore you cannot use a fast refresh for this query.