我有点理解物化观点并且之前曾与他们合作过 . 最近出现了一个问题,为什么特定的报告没有显示最新的数据,我调查了这个问题 . 显然,他们之前有一个临时表加载了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;
任何洞察它,非常感谢 .
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年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;
2 回答
From the documentation:
因此,使用具有相同名称的表和物化视图是正常的 . MV需要将数据存储在某个地方,因此拥有一个表是有意义的;然后,MV本身定义了如何维护表数据 .
您可以使用ON PREBUILT TABLE clause在现有表上创建视图,我假设该视图是"they had a temp table earlier ... and switched to Materialized view later"所指的 .
您也可以采用另一种方式,使用DROP MATERIALIZED VIEW ... PRESERVE TABLE option,它将底层表格留在后面 .
当你
SELECT * FROM TEMP_DATA;
时,你真的很重要,因为它们引用了相同的组合对象 .根据以后添加到问题中的定义,它将在午夜每天刷新 .
有两个架构对象 . 在物理上,物化视图是一个表 . 物化视图对象包含有关刷新模式,类型,方法和其他属性的元数据 . 如果检查ALL_OBJECTS,则会看到MATERIALIZED VIEW对象没有其段 . 数据字典确保您不能将基础表视为普通表,否则会破坏这些耦合对象之间的一致性 .
您还可以在预构建的表格上创建实体化视图 .
更新:
START WITH将在每次刷新时更新 . 创建或刷新视图时会评估“下一步开始” .
刷新可能会因数据库中通常发生的任何错误而失败,例如: g,没有足够的空间,锁定超时,查询底层对象的更改 .