2015-11-05 103 views
1

我有点理解物化视图,并与之合作过。最近出现了一个问题,为什么一个特定的报告没有显示最新的数据,我研究了这个问题。显然,他们有一个临时表加载了crontab,稍后切换到物化视图。实体化视图和具有相同名称的表

当我看着数据库与下面的查询(表的名称更改):

SELECT * FROM all_objects WHERE object_name = 'TEMP_DATA'; 

这实际上表明在相同的架构2个对象:一个表与另一个物化视图

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的反应

UPDATE: 在MView的定义,我见下文:

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

这是否意味着它应该每天更新(在这里明天)?明天更新后,将开始于更改为07年11月?

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

有没有什么会阻止它刷新,因为用户抱怨他们没有看到使用这个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; 

回答

4

From the documentation

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

因此,具有相同名称的表和物化视图是正常的。 MV需要将数据存储在某个地方,因此有一张桌子是有意义的; MV本身就定义了表格数据的维护方式。

您可以使用ON PREBUILT TABLE clause在现有表格上创建一个视图,我认为这是“他们早些时候有一个临时表格......并在以后切换到物化视图”。

你也可以用另一种方式,DROP MATERIALIZED VIEW ... PRESERVE TABLE option,它将底​​层表留下。

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

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

+1

Oracle不会仅仅因为物化视图而创建任何索引。 – Husqvik

+0

@Husqvik - 我只是在引用文档* 8-)12c版本仍然说同样的事情。但不,它并不总是;它会如果你指定'刷新rowid'我想。 –

+0

感谢Alex和Husqvik的快速反应。在Mview的定义中,我看到如下: – SamV

2

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

您也可以在预先建立的表格上创建物化视图。

更新:

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

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

+0

谢谢!我仍然有一个关于如何刷新刷新的唠叨问题。我现在看到它。 SELECT log_user,last_date,next_date,INTERVAL,what FROM dba_jobs WHERE schema_user ='SCHEMA'; LOG_USER \t \t日期LAST_DATE NEXT_DATE \t \t INTERVAL WHAT SCHEMA 2015年11月5日0时00分03秒\t 2015年11月6日00:00:00 \t TRUNC(SYSDATE)+ 1个\t dbms_refresh.refresh(' “模式”。 “TEMP_DATA”');再次感谢。今天我学到了一些东西! – SamV

相关问题