物化视图和具有相同名称的表

时间:2015-11-05 18:35:09

标签: oracle materialized-views

我有点理解物化观点,并且之前曾与他们合作过。最近出现了一个问题,为什么特定的报告没有显示最新的数据,我调查了这个问题。显然,他们之前有一个临时表加载了crontab,稍后切换到物化视图。

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

SELECT * FROM all_objects WHERE object_name = 'TEMP_DATA';

这实际上显示了同一模式中的两个对象:一个表和另一个物化视图

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

而且,当我尝试更改表格以重命名时,它表示物化视图无法重命名。

我的问题是,物化视图是否实际上创建了一个具有相同名称的表,如果是,我何时SELECT数据来自哪里(表或MView)?

或者它只是早期的剩余表?如果是这样,Oracle是否允许具有相同名称的不同类型的对象? (我真的很难过,因为我认为每个对象都必须有一个独特的名字!)。

而且好奇,如果它们是2个对象,则在下面的SQL中使用哪一个:

SELECT * FROM TEMP_DATA;

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

基于@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 是否会更改为明天后的07-Nov?

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

是否有任何可以阻止其刷新的内容,因为用户抱怨他们在使用此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;

2 个答案:

答案 0 :(得分:9)

From the documentation

  

创建物化视图时,Oracle数据库会创建一个内部表和至少一个索引,并且可以在物化视图的模式中创建一个视图。 Oracle数据库使用这些对象来维护物化视图数据。

因此,使用具有相同名称的表和物化视图是正常的。 MV需要将数据存储在某个地方,因此拥有一个表是有意义的;然后,MV本身定义了如何维护表数据。

您可以使用ON PREBUILT TABLE clause在现有表格上创建一个视图,我假设它是什么"他们之前有临时表...并且稍后切换到物化视图"是指。

你也可以采用另一种方式,使用DROP MATERIALIZED VIEW ... PRESERVE TABLE option,这会留下基础表。

当你SELECT * FROM TEMP_DATA;查询基础表格时,区别并不重要,因为它们引用了相同的组合对象。

根据稍后添加到问题中的定义,它将在午夜每天刷新。

答案 1 :(得分:3)

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

您还可以在预建表的顶部创建物化视图。

更新:

START WITH将在每次刷新时更新。创建或刷新视图时会评估“下一步开始”。

刷新可能会因数据库中通常发生的任何错误而失败,例如: g,没有足够的空间,锁定超时,查询基础对象的更改。