精华内容
下载资源
问答
  • 物化视图的作用
    2021-05-05 07:12:25

    物化视图 (MV)在一个段中存储查询结果,并且能够在提交查询时将结果返回给用户,从而不再需要重新执行查询 — 在查询要执行几次时(这在数据仓库环境中非常常见),这是一个很大的好处。物化视图可以利用一个快速刷新机制从基础表中全部或增量刷新。 您如何才能知道已经为这个物化视图创建了其正常工作所必需的所有对象?在 Oracle 数据库 10g 之前,这是用 DBMS_MVIEW 程序包中的 EXPLAIN_MVIEW 和 EXPLAIN_REWRITE 过程来判断的。

    这些过程(在 10g 中仍然提供)非常简要地说明一种特定的功能 — 如快速刷新功能或查询重写功能 — 可能用于上述的物化视图,但不提供如何实现这些功能的建议。相反,需要对每一个物化视图的结构进行目视检查,这是非常不实际的。 在 10g 中,新的 DBMS_ADVISOR 程序包中的一个名为 TUNE_MVIEW 的过程使得这项工作变得非常容易:您利用 IN 参数来调用程序包,这构造了物化视图创建脚本的全部内容。

    该过程创建一个顾问程序任务 (Advisor Task),它拥有一个特定的名称,仅利用 OUT 参数就能够把这个名称传回给您。 下面是一个例子。因为第一个参数是一个 OUT 参数,所以您需要在 SQL*Plus 中定义一个变量来保存它。

    SQL> -- 首先定义一个变量来保存 OUT 参数

    SQL> var adv_name varchar2(20)

    SQL> begin

    2 dbms_advisor。

    tune_mview

    3

    (

    4

    :adv_name,

    5

    'create materialized view mv_hotel_resv refresh fast enable query rewrite as

    select distinct city, resv_id, cust_name from hotels h,

    reservations r where r。

    hotel_id = h。hotel_id');

    6* end;

    现在您可以在该变量中找出顾问程序的名称。

    SQL> print adv_name

    ADV_NAME

    -----------------------

    TASK_117

    接下来,通过查询一个新的 DBA_TUNE_MVIEW 来获取由这个顾问程序提供的建议。

    务必在运行该命令之前执行 SET LONG 999999,因为该视图中的列语句是一个 CLOB,默认情况下只显示 80 个字符。

    select script_type, statement

    from

    dba_tune_mview

    where task_name = 'TASK_117'

    order by script_type, action_id;

    下面是输出:

    SCRIPT_TYPE

    STATEMENT

    -------------- -----------------------------------------------------------

    IMPLEMENTATION CREATE MATERIALIZED VIEW LOG ON "ARUP"。

    "HOTELS" WITH ROWID,

    SEQUENCE ("HOTEL_ID","CITY") INCLUDING NEW VALUES

    IMPLEMENTATION ALTER MATERIALIZED VIEW LOG FORCE ON "ARUP"。

    "HOTELS" ADD

    ROWID, SEQUENCE ("HOTEL_ID","CITY") INCLUDING NEW VALUES

    IMPLEMENTATION CREATE MATERIALIZED VIEW LOG ON "ARUP"。

    "RESERVATIONS" WITH

    ROWID, SEQUENCE ("RESV_ID","HOTEL_ID","CUST_NAME")

    INCLUDING NEW VALUES

    IMPLEMENTATION ALTER MATERIALIZED VIEW LOG FORCE ON "ARUP"。

    "RESERVATIONS"

    ADD ROWID, SEQUENCE ("RESV_ID","HOTEL_ID","CUST_NAME")

    INCLUDING NEW VALUES

    IMPLEMENTATION CREATE MATERIALIZED VIEW ARUP。

    MV_HOTEL_RESV

    REFRESH FAST

    WITH ROWID ENABLE QUERY REWRITE AS SELECT

    ARUP。RESERVATIONS。CUST_NAME C1, ARUP。RESERVATIONS。

    RESV_ID

    C2, ARUP。HOTELS。CITY C3, COUNT(*) M1 FROM ARUP。RESERVATIONS,

    ARUP。HOTELS WHERE ARUP。HOTELS。HOTEL_ID =

    ARUP。RESERVATIONS。

    HOTEL_ID GROUP BY

    ARUP。RESERVATIONS。CUST_NAME, ARUP。RESERVATIONS。RESV_ID,

    ARUP。HOTELS。CITY

    UNDO

    DROP MATERIALIZED VIEW ARUP。

    MV_HOTEL_RESV

    SCRIPT_TYPE 列显示建议的性质。大多数行将要执行,因此名称为 IMPLEMENTATION。如果接受,则需按照由 ACTION_ID 列指出的特定顺序执行建议的操作。 如果您仔细查看这些自动生成的建议,那么您将注意到它们与您自己通过目视分析生成的建议是类似的。

    这些建议合乎逻辑;快速刷新的存在需要在拥有适当子句(如那些包含新值的子句)的基础表上有一个 MATERIALIZED VIEW LOG。STATEMENT 列甚至提供了实施这些建议的确切 SQL 语句。 在实施的最后一个步骤中,顾问程序建议改变创建物化视图的方式。

    注意我们的例子中的不同之处:将一个 count(*) 添加到了物化视图中。因为我们将这个物化视图定义为可快速刷新的,所以必须有 count(*),以便顾问程序纠正遗漏。

    全部

    更多相关内容
  • 物化视图(material view)是什么?物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的...

    物化视图(material view)是什么?

    物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。

    物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。

    如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。

    对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。

    物化视图,说白了,就是物理表,只不过这张表通过Oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。当然要打开查询重写选项;

    Material View的主要作用

    1. 实现两个数据库之间的数据同步,可以存在时间差。

    2. 如果是远程链接数据库的场景时,提高查询速度。

    (由于查询逻辑复杂,数据量比较大,导致每次查询视图的时候,查询速度慢,效率低下)

    物化视图的刷新方式和方法

    1. 刷新的方式

    Fast

    Complete

    Fource

    2. 刷新的方法

    DBMS_REFRESH.Refresh

    DBMS_MVIEW.Refresh

    EXEC DBMS_MVIEW.refresh('BXJ_OBJECTS_MV_T1','C');

    EXEC DBMS_REFRESH.refresh('REP_MVIEWGROUP');

    物化视图的刷新方式和方法

    (1).在源数据库建立mview log日志文件

    create materialized view log on w_1 ;

    ----注:(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图

    ----创建物化视图语句:

    (2).在统计数据建立materializad view  语法

    Create materialized view MV_TEST

    ----MVTEST为物化视图名

    Build immediate

    ----创建时生成数据对应的是build deferred

    Refresh fast

    ----增量刷新

    On commit

    ----在基表有更新时提交,这里该句对视图无效

    With rowid

    ----这里创建基于rowid的物化视图,对应的是 primary key

    As

    Select * from TEST;

    ----生成物化视图数据语句

    或者

    CREATE MATERIALIZED VIEW MV_TableName

    BUILD IMMEDIATE --创建时立即刷新

    REFRESH FORCE --如果可以快速刷新则进行快速刷新,否则完全刷新

    ON DEMAND --刷新方式

    START WITH SYSDATE --第一次刷新时间

    NEXT SYSDATE+1/12 --刷新时间间隔

    AS SELECT 1 id ‘A’ name FROM dual;

    (3).调用时进行刷新

    dbms_refresh.refresh('W_1')

    创建物化视图

    CREATE MATERIALIZED VIEW bxj_objects_mv_t1 REFRESH FAST AS SELECT * FROM apps.bxj_objects_t1;

    CREATE MATERIALIZED VIEW bxj_objects_mv_t2 REFRESH FORCE AS SELECT * FROM bxj_objects_t2;

    CREATE MATERIALIZED VIEW bxj_objects_mv_t3 REFRESH COMPLETE AS SELECT * FROM bxj_objects_t3;

    ON DEMAND和ON COMMIT物化视图的区别

    ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,

    ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;

    而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。

    物化视图是物理表的么?

    1) 物化视图在某种意义上说就是一个物理表(但并不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;

    2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;

    3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证。

    查询物化视图上次刷新时间

    SELECT last_refresh_date

    FROM user_mviews

    WHERE mview_name = 'MV_TABLENAME';

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • ClickHouse-物化视图

    2022-06-15 17:45:28
    ClickHouse 的物化视图是一种查询结果的持久化,它确实是给我们带来了查询效率的提升。用户查起来跟表没有区别,它就是一张表,它也像是一张时刻在预计算的表,创建的过程它是用了一个特殊引擎,加上后来 as select...
    ClickHouse 的物化视图是一种查询结果的持久化,它确实是给我们带来了查询效率的提升。用户查起来跟表没有区别,它就是一张表,它也像是一张时刻在预计算的表,创建的过程它是用了一个特殊引擎,加上后来 as select,就是 create 一个 table as select 的写法。
    “查询结果集”的范围很宽泛,可以是基础表中部分数据的一份简单拷贝,也可以是多表 join 之后产生的结果或其子集,或者原始数据的聚合指标等等。所以,物化视图不会随着基础表的变化而变化,所以它也称为快照(snapshot)

    1.概述

    1.1物化视图与普通视图的区别

    普通视图不保存数据,保存的仅仅是查询语句,查询的时候还是从原表读取数据,可以将普通视图理解为是个子查询。物化视图则是把查询的结果根据相应的引擎存入到了磁盘或内存中,对数据重新进行了组织,你可以理解物化视图是完全的一张新表。

    1.2优缺点

    优点:查询速度快,要是把物化视图这些规则全部写好,它比原数据查询快了很多,总的行数少了,因为都预计算好了。
    缺点:它的本质是一个流式数据的使用场景,是累加式的技术,所以要用历史数据做去重、去核这样的分析,在物化视图里面是不太好用的。在某些场景的使用也是有限的。而且如果一张表加了好多物化视图,在写这张表的时候,就会消耗很多机器的资源,比如数据带宽占满、存储一下子增加了很多。

    1.3基本语法

    也是 create 语法,会创建一个隐藏的目标表来保存视图数据。也可以 TO 表名,保存到一张显式的表。没有加 TO 表名,表名默认就是 .inner.物化视图名
    CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name]
    [ENGINE = engine] [POPULATE] AS SELECT …

    1.3.1创建物化视图的限制

    1.必须指定物化视图的 engine 用于数据存储
    2.TO [db].[table]语法的时候,不得使用 POPULATE。
    3.查询语句(select)可以包含下面的子句: DISTINCT, GROUP BY, ORDER BY, LIMIT…
    4.物化视图的 alter 操作有些限制,操作起来不大方便。
    5.若物化视图的定义使用了 TO [db.]name 子语句,则可以将目标表的视图 卸载DETACH 再装载 ATTACH

    1.3.2物化视图的数据更新

    (1)物化视图创建好之后,若源表被写入新数据则物化视图也会同步更新
    (2)POPULATE 关键字决定了物化视图的更新策略:
    ◼ 若有 POPULATE 则在创建视图的过程会将源表已经存在的数据一并导入,类似于create table ... as
    ◼ 若无 POPULATE 则物化视图在创建之后没有数据,只会在创建只有同步之后写入源表的数据
    ◼ clickhouse 官方并不推荐使用 POPULATE,因为在创建物化视图的过程中同时写入的数据不能被插入物化视图。
    (3)物化视图不支持同步删除,若源表的数据不存在(删除了)则物化视图的数据仍然保留
    (4)物化视图是一种特殊的数据表,可以用 show tables 查看
    (5)物化视图数据的删除:
    (6)物化视图的删除:

    2.实例操作

    2.1准备测试用表和数据

    2.1.1建表

    #建表语句
    CREATE TABLE hits_test
    (
        `EventDate` Date,
        `CounterID` UInt32,
        `UserID` UInt64,
        `URL` String,
        `Income` UInt8
    )
    ENGINE = MergeTree
    PARTITION BY toYYYYMM(EventDate)
    ORDER BY (CounterID, EventDate, intHash32(UserID))
    SAMPLE BY intHash32(UserID)
    SETTINGS index_granularity = 8192
    Query id: 44ce5ae1-a00c-47ff-b74a-da2490253955
    Ok.
    0 rows in set. Elapsed: 0.006 sec. 
    

    2.1.2导入一些数据

    INSERT INTO hits_test SELECT
        EventDate,
        CounterID,
        UserID,
        URL,
        Income
    FROM datasets.hits_v1
    LIMIT 10000
    Query id: 9beec297-5fdc-4801-bb9f-d61f7c1ea315
    Ok.
    0 rows in set. Elapsed: 0.013 sec. Processed 10.00 thousand rows, 1.06 MB (774.29 thousand rows/s., 82.18 MB/s.)
    

    2.2创建物化视图

    #建表语句
    CREATE MATERIALIZED VIEW hits_mv
    ENGINE = SummingMergeTree
    PARTITION BY toYYYYMM(EventDate)
    ORDER BY (EventDate, intHash32(UserID)) AS
    SELECT
        UserID,
        EventDate,
        count(URL) AS ClickCount,
        sum(Income) AS IncomeSum
    FROM hits_test
    WHERE EventDate >= '2014-03-20'
    GROUP BY
        UserID,
        EventDate
    Query id: d7d1e7e5-9b22-4ca7-8262-7d5c7d20cbc2
    Ok.
    0 rows in set. Elapsed: 0.007 sec. 
    
    ##或者可以用下列语法,表 A 可以是一张 mergetree 表
    CREATE MATERIALIZED VIEW 物化视图名 TO 表 A AS SELECT FROM 表 B;
    #不建议添加 populate 关键字进行全量更新
    查看表
    show tables;
    .inner_id.629c7749-7c57-4d38-b2cf-c8973299d141
    hits_mv
    

    2.3导入增量数据

    INSERT INTO hits_test SELECT
        EventDate,
        CounterID,
        UserID,
        URL,
        Income
    FROM datasets.hits_v1
    WHERE EventDate >= '2014-03-23';
    Query id: b0de3dc2-5fd9-4a28-a2a9-70358472d8ee
    Ok.
    0 rows in set. Elapsed: 0.793 sec. Processed 6.93 million rows, 630.38 MB (8.73 million rows/s., 794.56 MB/s.)
    
    #查物化视图
    SELECT *
    FROM hits_mv
    Query id: de681216-b6e0-485d-b0c1-9ea2a636f920
    31200 rows in set. Elapsed: 0.021 sec. Processed 31.20 thousand rows, 811.20 KB (1.45 million rows/s., 37.78 MB/s.)
     
    SELECT *
    FROM `.inner_id.629c7749-7c57-4d38-b2cf-c8973299d141`
    LIMIT 5
    Query id: 2c844a34-e304-4174-8001-a4946b4bd644
    ┌──────────────UserID─┬──EventDate─┬─ClickCount─┬─IncomeSum─┐
    │ 1693347671382609808 │ 2014-03-23 │          1 │         0 │
    │  205147678081971211 │ 2014-03-23 │          3 │         0 │
    │ 1989946518134869356 │ 2014-03-23 │          9 │        18 │
    │ 3107916939127970635 │ 2014-03-23 │          6 │         0 │
    │ 1983020031557905695 │ 2014-03-23 │          9 │        18 │
    └─────────────────────┴────────────┴────────────┴───────────┘
    5 rows in set. Elapsed: 0.002 sec. Processed 8.19 thousand rows, 212.99 KB (4.27 million rows/s., 110.98 MB/s.)
    

    2.4导入历史数据

    INSERT INTO hits_mv SELECT
        UserID,
        EventDate,
        count(URL) AS ClickCount,
        sum(Income) AS IncomeSum
    FROM hits_test
    WHERE EventDate = '2014-03-20'
    GROUP BY
        UserID,
        EventDate
    Query id: 390e17eb-c350-4e30-b8df-aaa45b06e266
    Ok.
    0 rows in set. Elapsed: 0.006 sec. Processed 10.00 thousand rows, 1.02 MB (1.78 million rows/s., 182.21 MB/s.)
     
    查询物化视图
    SELECT * FROM hits_mv limit 5;
    
    展开全文
  • 这篇文章主要介绍了PostgreSQL物化视图(materialized view)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、创建视图 CREATE MATERIALIZED VIEW ...
  • 物化视图 (MV)在一个段中存储查询结果,并且能够在提交查询时将结果返回给用户,从而不再需要重新执行查询 — 在查询要执行几次时,这是一个很大的好处。物化视图可以利用一个快速刷新机制从基础表中全部或增量刷新...
  • PostgreSQL物化视图的刷新机制.pptx
  • 刷新所有物化视图刷新 PostgreSQL 9.4 数据库中所有物化视图的函数(对于 PostgreSQL 9.3,使用不依赖并发物化视图更新的 v1.0 版)。 PostgreSQL 9.4 支持物化视图,但没有刷新视图的功能,除了单独为每个视图发出...
  • Oracle怎么根据物化视图日志快速刷新物化视图
  • Oracle物化视图的快速刷新机制是经过物化视图日志完成的。Oracle如何经过一个物化视图日志就能够支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理。post首先,看一下物化视图的结构:SQL> create ...

    Oracle物化视图的快速刷新机制是经过物化视图日志完成的。Oracle如何经过一个物化视图日志就能够支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理。post

    首先,看一下物化视图的结构:

    SQL> create table t(id number, name varchar2(30), num number);

    表已建立。.net

    SQL> create materialized view log on t with rowid, sequence(id, name) including new values;

    实体化视图日志已建立。3d

    SQL> desc mlog$_t日志

    d44f543d3c53cf0de929126d58620d68.png

    ID和NAME是创建物化视图日志时指定的基表中的列,它们记录每次DML操做对应的ID和NAME的值。

    M_ROW$$保存基表的ROWID信息,根据M_ROW$$中的信息能够定位到发生DML操做的记录。

    SEQUENCE$$根据DML操做发生的顺序记录序列的编号,当刷新时,根据SEQUENCE$$中的顺序就能够和基表中的执行顺序保持一致。

    SNAPTIME$$列记录了刷新操做的时间。

    DMLTYPE$$的记录值I、U和D,表示操做是INSERT、UPDATE仍是DELETE。

    OLD_NEW$$表示物化视图日志中保存的信息是DML操做以前的值(旧值)仍是DML操做以后的值(新值)。除了O和N这两种类型外,对于UPDATE操做,还可能表示为U。

    CHANGE_VECTOR$$记录DML操做发生在那个或那几个字段上。blog

    根据上面的描述,能够发现,当刷新物化视图时,只须要根据SEQUENCE$$列给出的顺序,经过M_ROW$$定位到基表的记录,若是是UPDATE操做,经过CHANGE_VECTOR$$定位到字段,而后根据基表中的数据重复执行DML操做。get

    若是物化视图日志只针对一个物化视图,那么刷新过程就是这么简单,还须要作的不过是在刷新以后将物化视图日志清除掉。同步

    可是,Oracle的物化视图日志是能够同时支持多个物化视图的快速刷新的,也就是说,物化视图在刷新时还必须判断哪些物化视图日志记录是当前物化视图刷新须要的,哪些是不须要的。并且,物化视图还必须肯定,在刷新物化视图后,物化视图日志中哪些记录是须要清除的,哪些是不须要清除的。it

    回顾一下物化视图日志的结构,发现只剩下一个SHAPTIME$$列,那么Oracle如何仅经过这一列就完成了对多个物化视图的支持呢?下面创建一个小例子,经过例子来进行说明。table

    使用上文中创建的表和物化视图日志,下面对这个表创建三个快速刷新的物化视图。

    SQL> create materialized view mv_t_id refresh fast as select id, count(*) from t group by id;

    实体化视图已建立。

    SQL> create materialized view mv_t_name refresh fast as select name, count(*) from t group by name;

    实体化视图已建立。

    SQL> create materialized view mv_t_id_name refresh fast as select id, name, count(*) from t group by id, name;

    实体化视图已建立。

    SQL> insert into t values (1, 'a', 2);

    已建立 1 行。

    SQL> insert into t values (1, 'b', 3);

    已建立 1 行。

    SQL> insert into t values (2, 'a', 5);

    已建立 1 行。

    SQL> insert into t values (3, 'b', 7);

    已建立 1 行。

    SQL> update t set name = 'c' where id = 3;

    已更新 1 行。

    SQL> delete t where id = 2;

    已删除 1 行。

    SQL> commit;

    提交完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    ccc6e24de611a6396f327c7784e3889e.png

    当发生了DML操做后,物化视图日志中的SNAPTIME$$列保持的值是4000-01-01 00:00:00。这个值表示这条记录尚未被任何物化视图刷新过。第一个刷新这些记录的物化视图会将SNAPTIME$$的值更新为物化视图当前的刷新时间。

    SQL> exec dbms_mview.refresh('MV_T_ID');

    PL/SQL 过程已成功完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    31c4bd73f3969f74daf019ee65402c31.png

    Oracle根据数据字典中的信息能够知道表T上创建了三个物化视图,所以,MV_T_ID刷新完以后,不会删除物化视图记录。

    Oracle的数据字典中还保存着每一个物化视图上次刷新的时间和当前的刷新状态。

    SQL> select name, last_refresh from user_mview_refresh_times;

    ca200e9089eccbda0ed8b79ec9add4ea.png

    SQL> select mview_name, last_refresh_date, staleness from user_mviews;

    838714412dcf4a9ee5f51b19a422d199.png

    这些视图中记录了每一个物化视图上次执行刷新操做的时间,而且给出每一个物化视图中的数据是不是和基表同步的。因为MV_T_ID刚刚进行了刷新,所以状态是FRESH,而另外两个因为在刷新(创建)以后,基表又进行了DML操做,所以状态为NEEDS_COMPILE。若是这时对基表进行DML操做,则MV_T_ID的状态也会变为NEEDS_COMPILE。

    SQL> insert into t values (4, 'd', 10);

    已建立 1 行。

    SQL> commit;

    提交完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    8f50c27e1fdd0851068725ea089b5560.png

    SQL> select mview_name, last_refresh_date, staleness from user_mviews;

    1f6fa0b4a97b949a84fcefd069892be4.png

    下面刷新物化视图MV_T_ID_NAME,刷新操做的判断依据是,只刷新SNAPTIME$$列大于当前物化视图的LAST_REFRESH_DATE的记录,因为物化视图日志中全部记录的SNAPTIME$$的值都比物化视图MV_T_ID_NAME上次刷新的时间点大,所以会刷新全部记录。对于SNAPTIME$$列的值是4000-01-01 00:00:00的记录,物化视图会把SNAPTIME$$列的值更新为当前刷新时间,对于那些已经被更新过的SNAPTIME$$列,则保持原值。

    SQL> exec dbms_mview.refresh('MV_T_ID_NAME')

    PL/SQL 过程已成功完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    906ca990a687cf019116e6e5c30ba2e9.png

    SQL> select mview_name, last_refresh_date, staleness from user_mviews;

    555df5fdc54173f184cc6ed9e9ae9fb6.png

    若是这时再次刷新物化视图MV_T_ID,则只有ID=4的这条记录的SNAPTIME$$的时间点大于MV_T_ID上次刷新的时间点,所以,只刷新这一条记录,且不会改变SNAPTIME$$的值。

    SQL> exec dbms_mview.refresh('MV_T_ID')

    PL/SQL 过程已成功完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    3a84e6f0d3669f50e62c47810f2a7cd9.png

    SQL> select mview_name, last_refresh_date, staleness from user_mviews;

    ecaf6483efad6964a8901c530699ffe2.png

    到目前为止,尚未看到过物化视图日志的清除,其实每次进行完刷新,物化视图日志都会试图删除没有用的物化视图日志记录。物化视图日志记录的删除条件是删除那些SNAPTIME$$列小于等于基表全部物化视图的上次刷新时间。在上面的例子中,因为MV_T_NAME一直没有刷新,所以它的LAST_REFRESH_DATE比物化视图日志中全部记录的值都小,所以,一直没有发生物化视图日志记录清除的现象。

    SQL> insert into t values (5, 'e', 2);

    已建立 1 行。

    SQL> commit;

    提交完成。

    SQL> exec dbms_mview.refresh('MV_T_NAME')

    PL/SQL 过程已成功完成。

    SQL> select id, name, m_row$$, snaptime$$, dmltype$$ from mlog$_t;

    c0986a89df1c3187bab1aa6d69a8bf67.png

    SQL> select mview_name, last_refresh_date, staleness from user_mviews;

    652234bb776d1f9b9f2363d5bc5255ee.png

    物化视图MV_T_NAME刷新了物化视图中的每条记录,更新了ID=5的记录的SNAPTIME$$时间,并清除了其它全部物化视图日志记录。

    SQL> drop materialized view log on t;

    实体化视图日志已删除。

    SQL> drop materialized view mv_t_id;

    实体化视图已删除。

    SQL> drop materialized view mv_t_name;

    实体化视图已删除。

    SQL> drop materialized view mv_t_id_name;

    实体化视图已删除。

    SQL> drop table t;

    表已删除。

    SQL>

    最后,简单总结一下:

    物化视图在刷新时,会刷新全部SNAPTIME$$大于物化视图上次刷新时间的记录,并将全部是4000-01-01 00:00:00的记录更新为当前刷新时间。对于其余大于上次刷新时间的记录,只刷新不更改。这样,当刷新执行完之后,数据字典中记录当前物化视图的上次刷新时间为当前时刻,这保证了物化视图日志中目前全部的记录都小于或等于刷新时间。所以,每一个物化视图只要刷新大于上次刷新时间的记录,且保证每次刷新后,全部记录的时间都小于等于上次刷新时间,那么不管有多少个物化视图,就能够互不影响的使用同一个物化视图日志进行快速刷新了。当物化视图刷新完以后,会清除那些SNAPTIME$$列小于全部物化视图的上次刷新时间的记录,而这些记录已经被全部的物化视图都刷新过了,保存在物化视图日志中已经没有意义了。

    展开全文
  • Oracle物化视图详细介绍
  • SQL>creatematerializedviewmv_testcf2as3select*fromxiaotg.testcf...Materializedviewcreated--分析物化视图,以获得统计信息SQL>analyzetablexiaotg.mv_testcfcomputestatistics;Tableanalyzed--查看物化视...
  • PostgreSQL视图和物化视图

    千次阅读 2022-04-30 21:41:54
    物化视图则是materialized view(materialized 使物质化,使具体化(materialize 的过去式和过去分词))。两者都是视图,但是名称不一样,说明两者还有有所差异的。下面就来简单介绍一下PostgreSQL中的视图和物化...
  • 前言:一般在创建物化视图的时候,在数据量不大的时候,刷新的方式都是采用完全刷新的。随着系统的使用一些物化视图的源表的数据量在不断的增长,原本采用完全方式几秒就能刷新完成的物化视图,现在需要等待很久的...
  • 关于物化视图

    2021-07-19 10:11:17
    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有...
  • 带UNION ALL物化视图的快速刷新1.定义的查询的union all操作必须在最顶等级(查询重写后)2.物化视图日志指定rowid和including new values3.如果表设涉及到一个大量的insert或者直接路径加载,deletes,update,指定...
  • Oracle物化视图物化视图日志

    万次阅读 多人点赞 2019-04-02 21:43:30
    文章目录物化视图物化视图与普通视图的区别创建一个存放person的表创建一个存放person的address的表初始化数据创建物化视图的语句1.build [immediate|deferred]2.refresh [fast|complete|force] 视图刷新的方式:3.MV...
  • 物化视图的刷新

    2022-04-24 09:22:42
    物化视图的刷新方式说明 物化视图可以选择三种不同的刷新方式,根据不同的需求,选择不同的刷新方式。 Complete刷新:会删除表中的所有记录(如果是单表刷新,可能会采用Truncate的方式),然后根据物化视图中查询...
  • 使用在 Postgres 中创建自动更新物化视图的方法扩展ActiveRecord::Migration 。 可以执行来检查物化视图是否与其非物化版本保持同步。 背景 以下是有关物化视图的一些资源: Dan Chak他的著作Enterprise Rails 中...
  • 再一次sql优化中一个select count(*)语句因数据量实在太大,已经无法从简单的索引什么进行优化了,在同事的推荐下考虑到了物化视图物化视图是相对于视图而言的,但是两者实际上并没有什么关系就如java/javaScript...
  • Oracle物化视图的刷新

    千次阅读 2021-06-15 11:25:14
    物化视图(MATERIALIZED VIEW)是一个包含查询结果的数据库对象。将经常使用的数据拷贝并存储下来,在查询时就可以直接返回数据。本质上是一个物理表,会占用磁盘空间。本文主要记录了物化视图刷新的方法、时机等...
  • 今天巡检数据库发现存在一张220G的数据库实体表,通过命名(MLOG$_TABLE_NAME)可以看出这是一张物化视图日志表,基表只有120M,正常情况下物化视图日志会在物化视图刷新后被数据库自动清理,这里的刷新无视刷新规则...
  • MongoDB视图测试创建脚本及测试数据创建脚本;创建物化视图的基本方式及进阶方式。如:用$unwind 、$replaceRoot分解$lookup中的as数组,使之扁平化返回;使用$project 重命名字段;使用$merge输出物化视图
  • oralce创建物化视图

    2014-04-23 09:16:19
    oralce创建物化视图,基本语法,基本操作
  • 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有...
  • 物化视图是减少冗余计算的重要方法,需要现在的方法需要DBA手动生成物化视图。 作者提出的方法,挑选一个有用的子查询来生成物化视图。 但是有两个挑战 (1)怎么评估用一个物化视图来进行一个查询的收益。 (2...
  • 物化视图是存在的,占内存。 物化视图,默认是手动刷新。下面是手动刷新的例子。我们来创建一个物化视图。 手动刷新无法实现自动化,那么如何让postgresql 实现自动刷新物化视图呢。方法1:实现思路:创建一个函数...
  • 浅谈Oracle中的物化视图物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;...
  • Oracle物化视图是包括查询结果的数据库对象,是远程数据的本地副本,物化视图存储基于远程表的数据。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,150
精华内容 7,660
关键字:

物化视图的作用