客服微信
本文为云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
物化视图(或以前称为快照)是一个表段,其内容根据针对本地表或远程表的查询定期刷新。
对远程表使用物化视图是实现站点之间数据复制的最简单方法。本文中的示例代码假设 DB1 是主实例,DB2 是物化视图站点。
文档中提供了 CREATE MATERIALIZED VIEW 命令的完整语法描述。这里我们只关注基础知识。
BUILD 子句选项如下所示。
可以使用以下刷新类型。
可以通过两种方式之一触发刷新。
QUERY REWRITE 子句告诉优化器是否应考虑物化视图进行查询重写操作。下面显示了查询重写功能的示例。
ON PREBUILT TABLE 子句告诉数据库使用现有的表段,该表段必须与物化视图具有相同的名称,并支持与查询相同的列结构。
检查将拥有物化视图的用户是否具有正确的权限。他们至少需要 CREATE MATERIALIZED VIEW 权限。如果他们使用数据库链接创建物化视图,您可能还想授予他们 CREATE DATABASE LINK 权限。
连接到物化视图所有者并创建数据库链接和物化视图本身。
或者,我们可以使用预建的表,如下所示。
请记住在构建物化视图后收集统计数据。
由于完整的刷新涉及截断物化视图段并使用相关查询重新填充它,因此在对远程表执行时,它可能非常耗时,并且涉及大量的网络流量。为了降低复制成本,可以创建物化视图日志来捕获自上次刷新以来基表的所有更改。此信息允许快速刷新,只需要应用更改而不是完全刷新物化视图。
要利用快速刷新的优势,请连接到主实例并创建物化视图日志。
如果物化视图配置为在提交时刷新,则您永远不需要手动刷新它,除非需要重建。请记住,对于易失性基表来说,提交刷新是一项非常密集的操作。尽可能使用快速刷新是有意义的。
对于按需刷新,您可以选择手动刷新物化视图或将其作为刷新组的一部分进行刷新。
以下代码创建一个定义为每分钟刷新一次的刷新组,并为其分配一个物化视图。
刷新组和刷新组中的物化视图的信息可以分别从DBA_RGROUP和DBA_RCHILD视图中查询。
可以使用 DBMS_MVIEW 包手动刷新物化视图。
您可以调度使用 Oracle Scheduler 调用的 DBMS_MVIEW.REFRESH,而不是使用刷新组
为了清理,我们必须移除所有对象。
物化视图可用于提高各种查询的性能,包括执行数据聚合和转换的查询。这允许工作一次完成并由多个会话重复使用,从而减少服务器上的总负载。
以下查询对 EMP 表中的数据进行聚合。
创建物化视图以提前执行聚合,确保指定 ENABLE QUERY REWRITE 子句。
现在重写相同的查询以利用物化视图中的预聚合数据,而不是会话自行完成工作。
--ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED; --ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE; SET AUTOTRACE TRACE EXPLAIN SELECT deptno, SUM(sal) FROM emp GROUP BY deptno; -------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 21 | 3 (0)| 00:00:01 | | 1 | MAT_VIEW REWRITE ACCESS FULL| EMP_AGGR_MV | 3 | 21 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------------------------
在使用物化视图和物化视图日志之前,请考虑以下事项:
填充物化视图会增加相关服务器的负载。查询源服务器以捕获数据,并将其插入到目标服务器中。确保额外负载不会对您的主系统产生不利影响。
尽管物化视图日志提高了物化视图刷新的性能,但它们确实增加了在基表上执行 DML 所需的工作。检查额外的工作不会对主系统的性能产生不利影响。
如果不执行定期刷新,物化视图日志可能会变得非常大,可能会降低其维护性能并超出表空间限制。
根据 Oracle 版本和关联查询的复杂性,可能无法实现快速刷新。
当使用物化视图来提高转换和聚合的性能时,必须设置 QUERY_REWRITE_INTEGRITY 和 QUERY_REWRITE_ENABLED 参数,否则服务器将无法自动利用查询重写的优势。如果永久需要这些参数,可以在 pfile 或 spfile 文件中设置。更高版本默认启用它们。
想了解更多相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。
需要课程资料的同学可以私聊课程顾问:19941464235(微信同号)