实体化视图和 table 同名

Materialized view and table with the same name

我有点理解物化视图并且之前使用过它们。最近有人问为什么某份报告没有显示最新数据,我调查了这个问题。显然,他们早些时候用 crontab 加载了一个临时 table,后来切换到物化视图。

当我使用以下查询查看数据库时(table 的名称已更改):

SELECT * FROM all_objects WHERE object_name = 'TEMP_DATA';

这实际上在同一架构中显示了 2 个对象:一个 table 和另一个实体化视图

OWNER   OBJECT_NAME  OBJECT_TYPE        DATA_OBJECT_ID  LAST_DDL_TIME     TIMESTAMP
SCHEMA  TEMP_DATA    TABLE                      110623  08/06/2013 15:38  2013-08-06:14:53:01
SCHEMA  TEMP_DATA    MATERIALIZED VIEW                  10/30/2015 00:00  2013-08-06:14:56:33

而且,当我尝试更改 table 以重命名它时,它说实体化视图无法重命名。

我的问题是,实体化视图是否实际创建了一个具有相同名称的 table,如果是,当我这样做时 SELECT 数据来自哪里(table 或MView)?

还是只是早期遗留下来的table?如果是这样,Oracle 是否允许具有相同名称的不同类型的对象? (我真的被这个难住了,因为我认为每个对象都必须有一个唯一的名字!)。

很好奇,如果它们是 2 个对象,下面使用的是哪个 SQL:

SELECT * FROM TEMP_DATA;

任何对此的见解,非常感谢。

UPDATE 基于@Alex 和@Husqvik 的回复: 在 Mview 定义中,我看到如下:

BUILD IMMEDIATE  
REFRESH COMPLETE  
START WITH TO_DATE('06-Nov-2015','dd-mon-yyyy')  
NEXT trunc(sysdate) + 1  
WITH PRIMARY KEY  

这是否意味着它应该每天(明天在这里)更新?明天刷新后 START WITH 会更改为 11 月 7 日吗?

而且,它会自动刷新吗?如果会,它什么时候刷新?

有什么东西会阻止它刷新吗,因为用户抱怨他们在使用这个 MView 的报告中看不到最新数据,这就是为什么我首先得到这个来查看这个?

这是 MView 的完整 DDL:

DROP MATERIALIZED VIEW SCHEMA.TEMP_DATA;
CREATE MATERIALIZED VIEW SCHEMA.TEMP_DATA 
TABLESPACE ITS_DATASPACE
PCTUSED    0
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOCACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TO_DATE('06-Nov-2015','dd-mon-yyyy')
NEXT trunc(sysdate) + 1
WITH PRIMARY KEY
AS 
/* Formatted on 2015/11/05 09:35 (Formatter Plus v4.8.8) */
SELECT *
  FROM SCHEMA.h_case_data
 WHERE status LIKE 'M%';

COMMENT ON MATERIALIZED VIEW SCHEMA.TEMP_DATA IS 'snapshot table for snapshot SCHEMA.TEMP_DATA';

CREATE INDEX SCHEMA.CASE_ID_IDX ON SCHEMA.TEMP_DATA
(CASE_ID)
LOGGING
TABLESPACE ITS_DATASPACE
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

CREATE INDEX SCHEMA.STATUS_IDX ON SCHEMA.TEMP_DATA
(STATUS)
LOGGING
TABLESPACE ITS_DATASPACE
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

From the documentation:

When you create a materialized view, Oracle Database creates one internal table and at least one index, and may create one view, all in the schema of the materialized view. Oracle Database uses these objects to maintain the materialized view data.

所以 table 和物化视图同名是正常的。 MV 需要将数据存储在某处,因此 table 有意义;然后 MV 本身定义了 table 数据的维护方式。

您可以使用 ON PREBUILT TABLE clause 创建现有 table 的视图,我假设 "they had a temp table earlier ... and switched to Materialized view later" 指的是

您也可以选择另一种方式,使用 DROP MATERIALIZED VIEW ... PRESERVE TABLE option,将基础 table 留在后面。

当您 SELECT * FROM TEMP_DATA; 查询基础 table 时,区别并不重要,因为它们指的是同一个组合对象。

根据后面问题添加的定义,每天半夜刷新

有两个架构对象。实体化视图在物理上是 table。实体化视图对象包含有关刷新模式、类型、方法和其他属性的元数据。如果您检查 ALL_OBJECTS,您会看到 MATERIALIZED VIEW 对象没有它的段。数据字典确保您不能将底层 table 视为正常 table,否则它会破坏这些耦合对象之间的一致性。

您还可以在预构建的 table 之上创建实体化视图。

更新:

START WITH 将在每次刷新时更新。创建或刷新视图时评估 NEXT START。

刷新可能会因数据库中通常发生的任何错误而失败,例如。 g、不够space、锁超时、查询底层对象变化