【问题标题】:ORA-12015: cannot create a fast refresh materialized view from a complex queryORA-12015: 无法从复杂查询创建快速刷新物化视图
【发布时间】:2018-02-18 01:08:21
【问题描述】:

我正在使用以下查询来构建物化视图。

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)

我来了

ORA-12015:无法根据复杂查询错误消息创建快速刷新实体化视图。

我已经为所有表创建了物化视图日志。有人可以帮我解决这个问题吗?

【问题讨论】:

  • obsos 连接的目的是什么。您不会在 MView 的投影中使用它们的列,并且它们不会以任何方式过滤最终结果(因为它们是外部连接)。那么为什么不删除它们呢?这样就没有麻烦的解析功能了,MView会快速刷新。
  • 我必须使用他们的专栏。问题在于 obs,我不知道如何解决它。我必须在 IST 下午 4:30 之前完成。
  • 您发布的查询未显示您如何使用 MView 投影中的列,因此我们很难以对您有帮助的方式重写查询。如果情况如此紧急,您应该向我们提供所有必要信息。虽然这只是您的紧急情况,而不是我们的。
  • 这是因为我无法发布整个查询。我现在通过删除左连接并添加有问题的连接来更新它。
  • 好吧,这不可能快速刷新。不仅你有被禁止的分析函数,而且那些带有max() 聚合的子查询也是不允许的。不幸的是,您需要重新访问业务逻辑才能根据需要构建 MView。或者,您需要放弃 FAST 要求,或者甚至探索您是否需要 MView。此查询看起来不像典型的 MView 用例:您是否正在尝试修复可能可以通过其他方法修复的性能问题?

标签: sql oracle materialized-views


【解决方案1】:

CREATE MATERIALIZED VIEW - Restrictions on FAST Refresh

FAST Refresh 的限制

FAST 刷新受以下限制:

当您在创建时指定 FAST 刷新时,Oracle 数据库会验证 您正在创建的物化视图有资格快速 刷新。当您在 ALTER 中将刷新方法更改为 FAST 时 MATERIALIZED VIEW 语句,Oracle 数据库不执行此操作 确认。如果物化视图不符合快速 刷新,然后 Oracle 数据库在您尝试 刷新此视图。

  • 实体化视图不符合快速刷新的条件,如果定义 查询包含分析函数或 XMLTable 函数。

  • 实体化视图不符合快速刷新的条件,如果定义 查询引用了一个定义了 XMLIndex 索引的表。

  • 如果实体化视图的任何列是 加密。


您的查询包含一个分析函数:

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

因此您不能对此查询使用快速刷新。

【讨论】:

  • 还有其他方法可以执行此操作。由于主表有 700 万以上的数据,我不能为此 mview 使用 COMPLETE 刷新。
  • 是的 - 只需从查询中删除 ROW_NUMBER 函数。请发布另一个关于如何在不使用 ROW_NUMBER 或任何其他分析函数的情况下重写此 SQL 的问题。
  • @krokodilko--感谢您的帮助
  • 是否必须创建具有ROW ID的物化视图日志。
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2013-06-28
  • 1970-01-01
  • 2013-12-04
  • 2021-11-06
相关资源
最近更新 更多