在 Master table 为空的情况下使用实体化视图

Using a Materialized View with the Master table empty

我正在使用 Oracle 中的实体化视图的概念执行一些测试,但我无法回答这个问题,当最初创建实体化视图的主 table 变为空时,实体化视图是否会获取行?我在下面列出了一系列事件来形象化我的想法,

  1. 基于巨大的Master创建一个有效的物化视图table

举个例子

大师table

CREATE TABLE master_tab
(                    
col1 varchar2(10),         
col2 varchar2(10), 
col3 varchar2(10),
tr_val1 number,
tr_val2 number,
tr_val3 number
)

物化视图定义

CREATE MATERIALIZED VIEW mview_test
BUILD IMMEDIATE 
REFRESH COMPLETE
ON DEMAND 
ENABLE QUERY REWRITE
AS SELECT col1, col2
SUM(tr_val1), SUM(tr_val2)
FROM master_tab
GROUP BY col1, col2
  1. 在稍后的某个时间点,由于某种原因,master table master_tab 被截断了
  2. 因此,现在只有物化视图具有与主控上的任何查询相关的任何数据table master_tab

我不是很了解 Oracle 在幕后为获取正确数据所做的工作。现在,当从主 table 寻找数据的应用程序执行查询时会发生什么?例如,当应用程序查询时会发生什么,

SELECT col1, col2
SUM(tr_val1), SUM(tr_val2)
FROM master_tab
GROUP BY col1, col2
  1. Oracle 在内部采取什么样的决策来从物化视图中获取数据?
  2. 即使 Master table 为空,Oracle 是否仍会从实体化视图中检索正确的数据?
  3. 如果#2 的答案是肯定的,是否意味着只要物化视图不再刷新,Oracle 仍然能够为所有从 Master 查找数据的查询获取数据?

感谢您的帮助

尝试回答您的问题:

  1. 要使用查询重写并从 MV 中获取数据,请检查以下内容:a) 启用查询重写(会话)b) 启用查询重写(MV)和 c) 重写完整性检查(我认为这是你需要控制的地方)

以上除了检查 SQL 本身是否可以使用 MV 重写(您可以在 SQL 上使用 DBMS_MVIEW.EXPLAIN_REWRITE 来告知是否可以重写以及使用了哪个MV

  1. 完整性级别QUERY_RESRITE_INTEGRITY用于查看是否允许使用查询重写。默认为 ENFORCED,可以是 TRUSTEDSTALE_TOLERATED。在您的情况下,如果它是 TRUSTEDSTALE_TOLERATED,查询仍将被重写并且数据将从 MV

  2. 中检索
  3. 我相信是的,鉴于 2