1.视图的概念
视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。通过视图来查看表,就像是从不同的角度来观察一个 ( 或多个 ) 表。视图可以在表能够使用的任何地方使用,但在对视图的操作上同表相比有些限制,特别是插入和修改操作。对视图的操作将传递到基表,所以在表上定义的约束条件和触发器在视图上同样起作用。
2.视图的优点:
* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。
* 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单。
* 一个视图可以检索多张表的数据,因此用户通过访问一个视 图,可完成对多个表的访问。
* 视图是相同数据的不同表示,通过为不同的用户创建同一个表的不同视图,使用户可分别访问同一个表的不同部分。
3.创建视图
创建视图需要 CREAE VIEW 系统权限,视图的创建语法如下:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名 [( 别名 1[ ,别名 2...])]
AS 子查询
[WITH CHECK OPTION [CONSTRAINT 约束名 ]]
[WITH READ ONLY]
其中:
OR REPLACE 表示替代已经存在的视图。
FORCE 表示不管基表是否存在,创建视图。
NOFORCE 表示只有基表存在时,才创建视图,是默认值。
USER_VIEWS 字典中包含了视图的定义。
4. 物化视图
物化视图是一种特殊的物理表,“物化”
(Materialized)
视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,
Oracle
都实际上转换为视图
SQL
语句的查询。这样对整体查询性能的提高,并没有实质上的好处。
物化视图的类型
ON DEMAND
、
ON COMMIT
。二者的区别在于刷新方法的不同,
ON DEMAND
顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新
(REFRESH)
,即更新物化视图,以保证和基表数据的一致性;而
ON COMMIT
是说,一旦基表有了
COMMIT
,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。
创建物化视图时可以指定多种选项
*
创建方式(
Build Methods
):包括
BUILD IMMEDIATE
和
BUILD DEFERRED
两种。
BUILD IMMEDIATE
是在创建物化视图的时候就生成数据,而
BUILD DEFERRED
则在创建时不生成数据,以后根据需要在生成数据。默认为
BUILD IMMEDIATE
。
*
查询重写
(Query Rewrite)
:包括
ENABLE QUERY REWRITE
和
DISABLE QUERY REWRITE
两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,
Oracle
会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为
DISABLE QUERY REWRITE
。
*
在建立物化视图的时候可以指定
ORDER BY
语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
*创建自动更新的物化视图
CREATE MATERIALIZED VIEW T_TEST_MV
REFRESH FAST ON DEMAND WITH ROWID
START WITH SYSDATE NEXT SYSDATE + 30/86400
AS
SELECT * FROM t_test;
这样,T_TEST_MV会有一个job自动更新,时间间隔为30秒。
刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
物化视图和普通视图的区别
*普通视图不存放数据,物化视图存放数据
* 在使用视图进行查询时,是通过 View 中的 SQL 查询原表的数据,不能提高查询性能。在通过物化视图进行查询时,直接读取物化视图的数据,提高查询性能。
* 对普通视图应用更新、删除操作会影响原表的数据。只读物化视图不能进行 DML 操作。可更新物化视图可进行 DML 操作,并且在刷新时操作会被推送回原表。可写物化视图可进行 DML 操作,但刷新后所有修改操作在刷新后全部丢失