物化视图是oracle一个比较有特色的东西,自oracle9i起,应用非常广泛,不像mysql,不支持原生物化视图,要借助flexviews去实现。物化视图到底有什么用呢?要回答这个问题,必须先搞清楚物化视图与普通视图的区别:

物化视图是有一个与之对应的容器表的。容器表是一个跟物化视图同名的“规则”的表,用于存储查询返回的结果集。这是物化视图与普通视图的根本区别,它是有储存结果集的“物理存在”的,而普通视图则没有这个物理存在,只是一个虚表,每访问一次,查询就要执行一次基表访问(不考虑cache)。


物化视图的应用场景有两种:1、用于查询优化 2、用于高级复制,下面分别举一些实际工作中的case来进行说明。

1、查询优化。

某电信增值业务,在进程启动的时候,需要加载一些重要的业务初始化数据(比如全球运营商的networkid、cc、ndc等基础数据),这些业务初始化数据要从四个表中查询获取。为了提高这部分数据的access性能,加快进程启动速度,可以将这四个表的数据组合为一个物化视图,定义如下:

CREATE MATERIALIZED VIEW IRDB_NETWORKLIST
REFRESH FORCE ON COMMIT
AS
SELECT
   A.NETWORKID AS NETWORKID,
   A.NETWORKNAME AS NAME,
   C.CC AS CC,
   C.NDC AS NDC,
   B.MCC AS MCC,
   B.MNC AS MNC,
   A.NEWVISITINTERVAL AS NEWVISITINTERVAL,
   A.OUTNEWVISITINTERVAL AS OUTNEWVISITINTERVAL,
   D.MNP_ENABLED AS HASMNP,
   A.BRANDNAME AS BRANDNAME,
   A.LANGUAGECODE AS DEFAULTLANGUAGECODE,
   C.TIMEZONE AS TIMEZONE,
   A.NDD AS NDD,
   A.ZONEID AS ZONEID
FROM
IRDB_NETWORK_MASTER A, IRDB_NETWORK_GSM_DETAIL B, IRDB_NETWORK_CODES C, IR