【问题标题】:Materialized view creation is fast but refresh takes hours on Oracle 19c物化视图创建速度很快,但在 Oracle 19c 上刷新需要数小时
【发布时间】:2021-11-18 16:27:45
【问题描述】:

最近需要在Oracle 19c上创建几个物化视图,所有的基表都位于远程oracle数据库上,查询使用dblink连接表,不允许快速刷新。 他们中的大多数可以在添加一些提示后在几秒钟内完成刷新,比如 use_hash 等。但是当在查询上创建一个带有 union 的提示时,提示根本不起作用,幸运的是只有一个 union,所以我拆分了查询分为两个部分,但又出现了一个问题,其中一个物化视图的创建只需要不超过10秒,但需要几个小时甚至几天都无法完成刷新。我在网上搜索并得到以下答案:

  1. 使用 dbms_mview.refresh(mv_name, 'C', atomic_refresh=>false)。此解决方案不起作用。
  2. 快速刷新。该解决方案不允许。
  3. 每次都重新创建实体化视图,而不是刷新,这是一种解决方法,但不是解决方案。
  4. 使用提示 optimizer_features_enable(9.0.0),我在表上模拟了这个问题(因为我无法在实体化视图中插入...选择...),似乎提示确实有效,但是当我尝试应用关于物化视图的提示,从执行计划中我可以看到提示已被忽略。我还尝试在 dbms_refresh.refresh(mv_name) 之前的调度程序作业上添加 alter session set optimizer_features_enable='9.0.0',但它不起作用。想知道有没有人对这个问题有任何想法?谢谢。

【问题讨论】:

  • 物化视图仅在创建时使用您的 SQL(带有提示)。刷新时,Oracle 会自动生成自己的 SQL,并且它可能在各个方面都与您的原始 SQL 不匹配(谓词可能会更改顺序、提示消失等),因为 Oracle 会尝试自我优化。是内部操作,无法控制; Oracle 将始终为刷新生成自己的 SQL。您所能做的就是通过当前表统计信息、适当的索引和内存配置等间接优化性能。
  • 您也可以尝试使用您想要的提示创建一个视图,并将物化视图基于中间视图。
  • 谢谢@pmdba!没想到这么快就收到回复了。感谢您的澄清。您的建议是一个很好的解决方法,让我们看看是否还有其他建议。需要一些时间和证据来说服团队在这里停下来......

标签: oracle materialized-views mv materialized


【解决方案1】:

来自 oracle 社区的乔纳森刚刚为我的特定查询提供了一个解决方案。由于我查询的所有字段都来自远程数据库,除了 systimestamp 函数,所以我可以将函数分离到外部 select 语句,并将所有远程字段作为子选择语句,然后添加 no_merge 提示,这将使远程数据库优化器来玩。

SELECT systimestamp, v.*
  FROM (
    my original query with /*+ no_merge */
) v;

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 2010-12-22
    • 2013-06-28
    • 2013-05-31
    • 2017-06-25
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多