针对开发同事引入的物化视图的概念做了一个简单的了解和实验:
引文出自: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.Contract1【Sale.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-->