同名的物化视图和表

Posted

技术标签:

【中文标题】同名的物化视图和表【英文标题】:Materialized view and table with the same name 【发布时间】:2016-02-06 17:46:57 【问题描述】:

我有点理解物化视图,并且以前使用过它们。最近出现了一个关于为什么特定报告没有显示最新数据的问题,我调查了这个问题。显然,他们之前有一个用 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;

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

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 会在明天刷新后更改为 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;

【问题讨论】:

【参考方案1】:

From the documentation:

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

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

您可以使用ON PREBUILT TABLE clause 在现有表上创建一个视图,我认为这是“他们之前有一个临时表......后来切换到物化视图”所指的。

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

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

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

【讨论】:

Oracle 不会因为物化视图而创建任何索引。 @Husqvik - 我只是在引用文档 *8-) 12c 版本仍然说同样的话。但不,并非总是如此。如果你指定refresh with rowid 我想它会。 感谢 Alex 和 Husqvik 的快速响应。在 Mview 定义中,我看到如下: 现在,我对 MViews 有所了解,我还有几个问题。如果可以的话,你能帮我理解更多吗?抱歉我的评论太长了,所以我更新了我原来的问题。谢谢你们! @SamV - 它会在每天午夜刷新。您今天是否重新创建了它 - 如果是,您是否有以前的定义?也许它已经[更改]()以手动刷新?否则,您能否在视图中看到示例数据以与报表进行比较 - 可能是旧报表,报表本身的创建存在问题。只是一个想法。【参考方案2】:

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

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

更新:

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

如果数据库中通常会出现任何错误,例如,刷新可能会失败。 g、空间不足、锁超时、查询底层对象变化。

【讨论】:

谢谢!我仍然有关于如何开始刷新的唠叨问题。我现在看到了。 SELECT log_user, last_date, next_date, INTERVAL, what FROM dba_jobs WHERE schema_user = 'SCHEMA'; LOG_USER LAST_DATE NEXT_DATE INTERVAL 什么 SCHEMA 11/05/2015 00:00:03 11/06/2015 00:00:00 trunc(sysdate) + 1 dbms_refresh.refresh('"SCHEMA"."TEMP_DATA"');再次非常感谢。我今天学到了一些东西!

以上是关于同名的物化视图和表的主要内容,如果未能解决你的问题,请参考以下文章

SQL:视图和表

数据库关于物化视图的思考

PG 物化视图

oracle物化视图不会自动更新是怎么回事

Oracle物化视图

物化视图