物化视图学习(一)

和物化视图相关的一些概念理论:

 

物化视图:就是对已经存储于别处的数据的转换和复制。

 

基础表:物化视图使用到的表被称为基础表。

 

容器表(container table):容器表是一个“普通”表,它与物化视图拥有相同的名称。它被用来存储这个查询语句返回的结果集。

 

查询重写:当查询优化器收到一条待优化的查询,既可以选择直接使用它,也可以使用物化视图来对它进行重写,只要这个物化视图包含执行这条查询需要的全部或部分数据。

 

如果希望提高应用程序的性能,同时不能修改它执行的SQL语句,则可以使用物化视图的查询重写特性,当然,决定使用或不使用物化视图是基于查询优化器对执行计划开销的计算。提示rewrite和no_rewrite可用来影响查询优化器的这个决定。

 

物化视图相关参数:

1.可以指定容器表的相关物理属性,如分区,压缩,表空间以及存储参数。在这方面,容器表与其他表的处理方式是一样的。

2.在创建物化视图时,查询语句会被执行并且它的结果将被存储到容器表中,这是因为参数build immediate(立即构造)是默认的选项。还有另外两个选项:其一为通过制定参数build deferred(延迟构造)来将插入记录的时间延迟到进行第一次刷新操作的时候,其二为通过指定参数on prebuild table(基于预创建表)来使用一个已经存在的表作为容器表。

3.查询重写功能在默认情况下是不启用的。要启用它,必须指定参数enable query rewrite。

4.在默认情况下,为了提高快速刷新(fast refresh)的性能,将会自动为容器表创建一个索引。如果不想创建这个索引,可以指定参数 using no index来实现。

 

查询重写

只要当SELECT子句存在于SQL语句中,查询优化器就可以考虑利用查询重写功能。另外只有在动态初始化参数query_rewrite_enabled必须设置为TRUE和必须在创建物化视图时指定了参数enable query rewrite时,才可以使用查询重写功能。

查询重写包含3种类别:

1.全文匹配的查询重写

2.部分文本匹配的查询重写

3.一般查询重写

 

参数:query_rewrite_integrity

这个参数的设置决定了在包含没有验证的约束或无效数据时,查询优化器可以使用物化视图查询重写。这个参数可以设置以下3值:

enforced---只有物化视图包含的是最新的数据时才能用来做查询重写。另外,只有经过验证的约束才能被一般查询重写所使用。默认值

trusted---只有物化视图包含的是最新的数据时才能用来做查询重写。另外,维度与约束信息在激活未验证并被置为rely的时候可以被一般查询重写所信任。

stale_tolerated----所有存在的物化视图,包含哪些含有实效数据的物化视图,都可以被用来做查询重写。另外,维度与约束信息在激活未验证并被置为rely的时候可以被一般查询重写所信任。

 

如果某个SQL语句没有使用查询重写,而你不理解为什么会这样,就可以使用包dbms_mview里的存储过程explain_rewrite来找到问题所在。分析时需要用到rewrite_table表,假如rewrite_table分析所在的模式中不存在,调用$ORACLE_HOME/rdbms/admin下的脚本utlxrw.sql

 

可以参考user_mviews视图中的rewrite_capability字段,检查物化视图支持哪些查询重写,rewrite_capability有几个不同的值:none,textmatch或general。如果值为gereral,就代表物化视图支持一般查询重写,如果值为textmatch,就很有必要知道至少以下2点:第一:具体支持这两种基于文本匹配的查询重写里面的哪一种?全文匹配或部分文本匹配的查询重写?第二:为什么不支持一般查询重写? 为了支持回答以上问题,可以使用包DBMS_MVIEW里的存储过程explain_mview,需要用到mv_capabilities_table,假如不存在此表,需要执行$ORACLE_HOME/rdbms/admin/utlxmv.sql创建此表,mv_capabilities_table中的字段msgtxt简要地说明为什么不支持特定的查询重写的原因。

 

4.物化视图的刷新

 当表被修改时,依赖于它的物化视图会失效。因此,需要执行一次刷新来保持物化视图的有效性。在创建物化视图的时候,可以指定如何以及何时进行刷新操作。可以有以下4种选择:

 完全刷新(REFERSH COMPLETE):容器表的所有内容都会被删除,并且所有的数据都会从基础表重新加载。只有在相当一部分数据被修改后才去使用这种方式。

快速刷新(REFERSH FAST):容器表中的内容会被重用,只有被修改的数据才会被同步到容器表。如果基础表上只有少量数据被变更,就应该使用这种方法。只有满足多个条件时,才会考虑这种方法,如果其中一个条件不满足,则或REFERSH FAST被拒绝作为物化视图的一个有效参数,或者会抛出一个错误异常。

强制刷新(REFRESH FORCE):最初,会尝试使用快速刷新。如果它无法工作,就执行一次完全刷新。

永不刷新(NEVER REFRESH):物化视图永不刷新。

 

可以通过以下方式来指定物化视图刷新发生的时间点。

根据需要(ON DEMAND)-物化视图会在显式请求的情况下进行刷新

在提交时(ON COMMIT)-物化视图会在基础表修改所在的同一个事物里进行自动刷新。

当选择手工刷新物化视图的时候,可以使用包DBMS_MVIEW中的refresh、refresh_all_mviews、refresh_dependent存储过程。

5基于物化视图日志的快速刷新

物化视图日志是一个数据库引擎自动维护的表,它被用来跟踪基础表上发生的变更。可以在每个基础表上创建一个物化视图日志。

可以查看user_mview_logs视图检查在基础表上创建的物化视图日志。

可以通过DBMS_MVIEW的EXPLAIN_MVIEW过程检查物化视图不能够实现快速刷新的原因,存储过程的输出结果保存在表mv_capabilities_table中。

6包含分区变化跟踪的快速刷新

基于物化视图日志的快速刷新在进行了类似CREATE PARTITION或DROP PARTITION的分区管理操作后无法被执行。为了解决这个问题,包含分区变化跟踪(PCT,partition change tracking)的快速刷新就出现了。思路是,数据库引擎可以在分区级别跟踪数据的失效与否,而不仅仅在表一级进行跟踪。也就是说,它可以跳过所有没有发生变更的分区来执行刷新操作。如果物化视图包含下列信息,就可以做到这一点。

 分区键值

 rowid

 分区标记

 依赖于连接的表达式(仅仅从Oracle 10g开始)

 

7何时使用物化视图

   在逻辑读数量与返回记录数量之间的比率非常高的时候,用来提高大表汇总与(或)连接的性能。

   在全表扫描或索引范围扫描都不能提供有效性能的时候,用来提高单表访问的性能。基本上,它们是具有平均选择性的访问,从而需要使用分区功能,但是无法利用分区功能的话,使用物化视图就比较合适了。

   在OLTP环境下,对于那些查询频繁但更新相对较少的表比较适合使用物化视图。在这种环境下,为了确保物化视图的数据完全有效,通常会使用基于事务提交的快速杀心模式来刷新物化视图。

   物化视图通常在数据仓库环境中来存储汇总结果。因为首先:数据通常是只读的;因此,在数据库只是用于修改表的时候,刷新物化视图的开销可以被降到最小并通过时间窗口被隔离。其次,在这种环境下,提升的空间可能会非常大。

 

你可能感兴趣的:(oracle,sql,脚本)