知识大全 创建最简单物化视图

Posted 视图

篇首语:日日行不怕千万里,天天讲不吝千万言,时时做不惧千万事。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 创建最简单物化视图相关的知识,希望对你有一定的参考价值。

Oracle物化视图:创建最简单物化视图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  物化视图是一种特殊的物理表 物化 (Materialized)视图是相对普通视图而言的 普通视图是虚拟表 应用的局限性大 任何对视图的查询 Oracle都实际上转换为视图SQL语句的查询 这样对整体查询性能的提高 并没有实质上的好处

  Oracle最早在OLAP系统中引入了物化视图的概念 但后来很多大型OLTP系统中 发现类似统计的查询是无可避免 而这些查询操作如果很频繁 对整体数据库性能是很致命的 于是Oracle开始不断的改进物化视图 使得其也开始合适OLTP系统 从Oracle i到现在 功能已经相对比较完备了

  本文是Oracle物化视图系列文章的第一篇 有两个主要目的 来体验一下创建ON DEMAND和ON MIT物化视图的方法 ON DEMAND和ON MIT物化视图的区别在于其刷新方法的不同 ON DEMAND顾名思义 仅在该物化视图 需要 被刷新了 才进行刷新(REFRESH) 即更新物化视图 以保证和基表数据的一致性;而ON MIT是说 一旦基表有了MIT 即事务提交 则立刻刷新 立刻更新物化视图 使得数据和基表一致

   第一个ON DEMAND物化视图

   创建ON DEMAND物化视图

  下面创建一个最简单的物化视图 这个物化视图的定义很类似于普通视图的创建语句 只是多了一个materialized 但就是这个单词 造成了物化视图和普通视图(虚拟表)的天壤之别 也引申出后面很多的事情 呵呵

  本例中需要特别注意的是 Oracle给物化视图的重要定义参数的默认值处理 在下面的例子中会有特别说明 因为物化视图的创建本身是很复杂和需要优化参数设置的 特别是针对大型生产数据库系统而言 但Oracle允许以这种最简单的 类似于普通视图的办法来做 所以不可避免的会涉及到默认值问题

  像我们这样 创建物化视图时未作指定 则Oracle按ON DEMAND模式来创建

  从下例中可以看出

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

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

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

  ●  创建物化视图

   获取数据库rdbms版本信息  

         SQL> select * from v$version;   BANNER      Oracle Database  g Enterprise Edition Release     Production   PL/SQL Release     Production   CORE   Production   TNS for  bit Windows: Version     Production   NLSRTL Version   – Production

   创建物化视图  

         SQL> create materialized view mv_testcf     as     select * from xiaotg testcf;   Materialized view created

   分析物化视图 以获得统计信息 

         SQL> analyze table xiaotg mv_testcf pute statistics;   Table analyzed

   查看物化视图的行数 发现和master表(TESTCF)一样  

         SQL> select tl table_name  tl num_rows from user_tables tl where tl table_name in (  TESTCF   MV_TESTCF  );   TABLE_NAME NUM_ROWS        MV_TESTCF    TESTCF 

   查看物化视图的存储参数  

         SQL> col segment_name for a   SQL> select sg segment_name  sg bytes  sg blocks from user_segments sg where sg segment_name =  MV_TESTCF ;   SEGMENT_NAME BYTES BLOCKS          MV_TESTCF   

  ●  查看物化视图关键定义

   查看物化视图的定义设置 请关注蓝色字体部分

   这表明 默认情况下 如果没指定刷新方法和刷新模式 则Oracle默认为FORCE和DEMAND

   其他的集中刷新方法和刷新模式以后将分别予以介绍

  SQL> select mv * from user_mviews mv where mv MVIEW_NAME = MV_TESTCF ;

  (为增加查询结果的可读性 下面进行了行列的互转)

         OWNERXIAOTG   MVIEW_NAMEMV_TESTCF   CONTAINER_NAMEMV_TESTCF   QUERY   QUERY_LEN   UPDATABLEN   UPDATE_LOG   MASTER_ROLLBACK_SEG   MASTER_LINK   REWRITE_ENABLEDN                                            REWRITE_CAPABILITYGENERAL   REFRESH_MODEDEMAND   REFRESH_METHODFORCE   BUILD_MODEIMMEDIATE   FAST_REFRESHABLEDML   LAST_REFRESH_TYPEPLETE   LAST_REFRESH_DATE   :   STALENESSFRESH   AFTER_FAST_REFRESHFRESH   UNKNOWN_PREBUILTN   UNKNOWN_PLSQL_FUNCN   UNKNOWN_EXTERNAL_TABLEN   UNKNOWN_CONSIDER_FRESHN   UNKNOWN_IMPORTN   UNKNOWN_TRUSTED_FDN   PILE_STATEVALID   USE_NO_INDEXN   STALE_SINCE   NUM_PCT_TABLES   NUM_FRESH_PCT_REGIONS   NUM_STALE_PCT_REGIONS

   测试ON DEMAND物化视图的更新特性

  物化视图最重要的功能和特性之一 就是其数据会随着基表(或称主表 master表 本例中为TESTCF)的变化而变 基表数据增了 物化视图数据会变多;基表数据删了 物化视图数据也会变少

  但怎么更新?或者说物化视图的数据怎么随着基表而更新?Oracle提供了两种方式 手工刷新和自动刷新 像我们这种 在物化视图定义时 未作任何指定 那当然是默认的手工刷新了 也就是说 通过我们手工的执行某个Oracle提供的系统级存储过程或包 来保证物化视图与基表数据一致性

  这是最基本的刷新办法了 但所谓的自动刷新 其实也就是Oracle会建立一个job 通过这个job来调用相同的存储过程或包 加以实现 这在本系列文章的第 篇会将以详细阐述

  下面将测试INSERT UPDATE和DELETE的测试方法类似 大家有兴趣的话 可以自己试一试

  需要注意的是 下面暂不讨论如何刷新ON DEMAND物化视图 这是下一篇文章的内容 下面仅仅关注ON DEMAND物化视图的特性及其和ON MIT物化视图的区别 即前者不刷新(手工或自动)就不更新物化视图 而后者不刷新也会更新物化视图 ——只要基表发生了MIT

  ●  在基表插入测试数据

  基表数据插入后 会发现 物化视图并不会随之更新

   检查基表和物化视图是否有 这一行记录

         SQL> col id for a ;   SQL> col name for a ;   SQL> select * from xiaotg testcf t where t id =   ;   ID NAME        SQL> select * from xiaotg mv_testcf t where t id =   ;   ID NAME     

   插入测试数据  

   这时发现 基表有数据 但物化视图并没有 

         SQL> insert into xiaotg testcf     values (    xiaotg he he );     row inserted   SQL> mit;   Commit plete

   测试物化视图数据是否更新

  从下面的实验可以看出 物化视图数据不会更新 即使等上 分钟 小时 或者 天

  关于如何使得ON DEMAND物化视图数据被更新 参加本系列的第二篇文章哈 )  

         SQL> select * from xiaotg testcf t where t id =   ;   ID NAME          xiaotg he he   SQL> select * from xiaotg mv_testcf t where t id =   ;   ID NAME        SQL>

   第一个ON MIT物化视图

  最简单的ON MIT物化视图的创建 和上面创建ON DEMAND的物化视图区别不大 因为ON DEMAND是默认的 所以ON MIT物化视图 需要再增加个参数即可

   创建ON MIT物化视图

  ●  创建物化视图

  需要注意的是 无法在定义时仅指定ON MIT 还得附带个参数才行 本例中附带refresh force 关于这个参数的意思 以后将加以阐述

   创建ON MIT物化视图

         SQL> create materialized view mv_testcf     refresh force on mit     as     select * from xiaotg testcf;   Materialized view created   SQL>

   分析物化视图和基表  

         SQL> analyze table xiaotg mv_testcf  pute statistics;   Table analyzed   SQL> analyze table xiaotg testcf pute statistics;   Table analyzed

   查看当前基表和物化视图的行数  

         SQL> select tl table_name  tl num_rows from user_tables tl where tl table_name in (  TESTCF   MV_TESTCF  );   TABLE_NAME NUM_ROWS        MV_TESTCF     TESTCF 

  ●  查看物化视图关键定义

  可以从DBA_MVIEWS中看出 刷新模式为MIT 这也是它和上面ON DEMAND物化视图的唯一区别  

       SQL> select mv * from user_mviews mv where mv MVIEW_NAME =  MV_TESTCF ;

  (为增加查询结果的可读性 下面进行了行列的互转 且只显示前三个关键列的)  

         REFRESH_MODEMIT   REFRESH_METHODFORCE   BUILD_MODEIMMEDIATE

   测试ON MIT物化视图的更新特性

  ON MIT物化视图会在基表一旦提交时 就会立刻更新物化视图本身 而且一般仅在物化视图数据也被更新后 基表数据才会事实的提交

  这意味着 这种模式可能会导致延迟基表数据的提交 这点在下面的实验中体现得很清楚

  实验中 对基表TESTCF 平常的MIT在 秒内可以完成 但在有了ON MIT视图MV_TESTCF 后 居然要 秒 速度减低了很多倍 ON MIT视图对基表的影响可见一斑

  ●  在基表中插入数据  

   SQL> set timing on;   SQL> insert into xiaotg testcf ( id  name ) values (     xiaotg again he he  );     row inserted   Executed in   seconds   SQL> mit;   Commit plete   Executed in   seconds   SQL> select * from xiaotg testcf where id =  ;   ID NAME          xiaotg again he he   Executed in   seconds   SQL> col id for a ;   SQL> col name for a ;   SQL> select * from xiaotg testcf where id =  ;   ID NAME          xiaotg again he he   Executed in   seconds   SQL> select * from xiaotg mv_testcf  where id =  ;   ID NAME           xiaotg again he he   Executed in   seconds

  ●  测试基表正常情况下的MIT速度  

cha138/Article/program/Oracle/201311/17144

相关参考

知识大全 视图刷新过程中出现的约束冲突问题

  本文中我们通过实例的方法来帮助您理解物化视图刷新过程中出现的约束冲突问题  即使将物化视图的约束建立和基表完全一致由于物化视图的刷新机制也会产生约束冲突的现象  以下是一个简单的示例    SQL

知识大全 物化视图

高性能MySQL:物化视图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  物化视图  许多数据库

知识大全 oracle10g新特性—物化视图

  Advisor       在g将查询重写并且引进了新的强大的调优建议者使管理物化视图变得容易多了  物化视图(Materia

知识大全 Oracle 10g 中管理物化视图变得更加容易

Oracle10g中管理物化视图变得更加容易  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  利用

知识大全 创建视图(1)

SQL实战新手入门:创建视图(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  创建视图() 

知识大全 创建视图(2)

SQL实战新手入门:创建视图(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  创建视图() 

知识大全 SQL入门:创建视图

SQL入门:创建视图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如视图中所讨论的视图提供在一

知识大全 Oracle多表创建的视图insert解决方法

Oracle多表创建的视图insert解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  单

知识大全 orale数据库如何利用sql语句创建视图的一般性使用方法

  SQLCREATEVIEW语句什么是视图?在SQL中视图是基于SQL语句的结果集的可视化的表  视图包含行和列就像一个真实的表视图中的字段就是来自一个或多个数据库教程中的真实的表中的字段我们可以向

知识大全 怎样使两台服务器的oracle9i的数据同步

  高机复制就是物化视图  物化视图是包括一个查询结果的数据库对像它是远程数据的的本地副本或者用来生成基于数据表求和的汇总表物化视图存储基于远程表的数据也可以称为快照    物化视图可以查询表视图和其