【发布时间】:2021-11-18 16:27:45
【问题描述】:
最近需要在Oracle 19c上创建几个物化视图,所有的基表都位于远程oracle数据库上,查询使用dblink连接表,不允许快速刷新。 他们中的大多数可以在添加一些提示后在几秒钟内完成刷新,比如 use_hash 等。但是当在查询上创建一个带有 union 的提示时,提示根本不起作用,幸运的是只有一个 union,所以我拆分了查询分为两个部分,但又出现了一个问题,其中一个物化视图的创建只需要不超过10秒,但需要几个小时甚至几天都无法完成刷新。我在网上搜索并得到以下答案:
- 使用 dbms_mview.refresh(mv_name, 'C', atomic_refresh=>false)。此解决方案不起作用。
- 快速刷新。该解决方案不允许。
- 每次都重新创建实体化视图,而不是刷新,这是一种解决方法,但不是解决方案。
- 使用提示 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