不应该是家,窝更适合一点

ORACLE 物化视图 之验证

上一篇 / 下一篇  2010-07-01 16:59:19 / 个人分类:sql


    针对开发同事引入的物化视图的概念做了一个简单的了解和实验:

引文出自:http://icbbs.supcon.com/viewthread.php?tid=1181

物化视图中上面的引文中已做了简介,下面说一下它的优缺点和验证的结果:

优点:

 1,物化视图的最大的优势是可以提高性能:Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。

 2, 物化视图有很多方面和索引很相似

 3通过预先计算好答案存储起来,可以大大地减少机器的负载

   A,更少的物理读--扫描更少的数据

   B,更少的写--不用经常排序和聚集

   C。减少CPU的消耗--不用对数据进行聚集计算和函数调用

   D,显著地加快响应时间--在使用物化视图查询数据时(与主表相反),将会很快的返回查询结果

缺点:

  1物化视图用于只读或者“精读”环境下工作最好 ,不用于联机事务处理系统(OLTP)环境, 在事实表等更新时会导致物化视图行锁,从而影响系统并发性。

   2物化视图有出现无法快速刷新,导致查询数据不准确的现象 

  3,Rowid物化视图(创建的物化视图通常情况下主键,rowid,和子查询视图只有一个单一的主表,不能包括下面任何一项:

    A,Distinct 或者聚合函数.

    B,Group by,子查询,连接和SET操作

  4,物化视图会增加对磁盘资源的需求,即需要永久分配的硬盘空间给物化视图来存储数据

  5,物化视图的工作原理受一些可能的约束,比如主键,外键等等

实验:(一)

1,创建物化视图:

  /* Formatted on 2010-7-1 10:46:08 (QP5 v5.115.810.9015) */

CREATE MATERIALIZED VIEW Contract REFRESH FORCE ON DEMAND AS SELECT "Contract_ID","Contract_ProjectID","Contract_TableID","Contract_NO" FROM "Comm_Contract" WHERE "Contract_TableID"

IN(SELECT "AppTab_ID" FROM "Base_AppTableInfo" WHERE "AppTab_TableCode"='SaleContractP_Base' )

2,查询

 从基表中查询:

SELECT    "Contract_ID"

                    FROM   "Comm_Contract"

                   WHERE   "Contract_NO" LIKE '%2009011%'

  A,单用户查询响应时间:206ms  

  B,50并发查询响应时间:1670ms               

   从物化视图查询:                

 select "Contract_ID" 

                    from "Contract"  

                   where "Contract_NO" like '%2009011%'  

  A,单用户查询响应时间:23ms  

  B,50并发查询响应时间:48ms  

实验:(二)

生产任务单参照生产订单按合同编号查询系统响应时间---是否用物化视图的区别

操作步骤:

1,修改资源文件:
[Unit]

      Name = Sale.Contract1

      [Master]

         [Table]

            Name = Contract

            [Field]

               ID = Contract_ID,Integer

               ProjectID = Contract_ProjectID,Integer

               TableID = Contract_TableID,Integer

               NO = Contract_NO,Text               

            [/Field]

         [/Table]

      [/Master]

   [/Unit]

2,修改.ets  .xsl 文件

.xsl:QuickCondition += ' AND _field_(Order_ContractID) in _subquery_(Sale.Contract1【Sale.Contract】,ID,_FIELD_(NO) LIKE  _Value_($^QuickContract_NO,@NO))';

.ets:<et:class Var="ContractList" Class="Sale.Contract1Sale.Contract" Condition="_FIELD_(ID)=_VALUE_($.Order_ContractID,@ID)" OutputPageInfo="no" OutputField="ID,NO,Customer_ShortName"/>

3,分别用步骤2的两种情况查询

  生产任务单参照生产订单:按销售合同条件查询:查询输入“2009011” ,结果页面响应时间: 

 A,不用物化视图<!--Execute the main script casted 2ms-->

 B,用物化视图<!--Execute the main script casted 1ms-->


TAG: Oracle oracle 物化视图

 

评分:0

我来说两句

Open Toolbar