oracle临时表与物化视图

1. 临时表
1) 概念
a) 临时表跟永久表最大的区别就是表中的数据不会永远的存在

b) Oracle临时表分为会话级临时表和事务级临时表。

c) 会话临时表,结束或中断会话时清空数据。

create global temporary table XXX()
on commit preserve rows;

d) 事务临时表,commit之后清空数据。

on commit delete rows;

2) 原理
a) 临时表不会为它们的块生成redo。因此,对临时表的操作不是“可恢复的” 。修改临时表中的一个块时,不会将这个修改记录到重做日志文件中。不过,临时表确实会生成 undo,而且这个 undo 会计入日志。因此,临时表也会生成一些redo。

b) 这是因为你能回滚到事务中的一个 SAVEPOINT。由于undo数据必须建立日志,因此临时表会为所生成的undo生成一些重做日志。这样似乎很糟糕。但是,在临时表上运行的 SQL 语句主要是 INSERT 和SELECT。幸运的是,INSERT 只生成极少的 undo(需要把块恢复为插入前的“没有”状态,而存储“没有”不需要多少空间),另外SELECT根本不生成undo。

c) Oracle的临时表还保证了多用户操作的独立性:对于使用同一张临时表的不同用户,ORACLE都会分配一个独立的Temp Segment,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;

3) 应用优化
a) 当多表关联,且存在小表时。可以采用将大表关联得到比较小的结果集合存放在临时表中,再用临时表去关联小表。

b) 如果某个数据集在这个会话期间需多次使用,建议使用临时表。

2. 物化视图

1) 概念
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。

2) 类型
物化视图的类型:ON DEMAND、ON COMMIT

a) on demand 
根据需要(ON DEMAND):物化视图会在显式请求的情况下进行刷新(可以通过手工调用,也可以通过运行按照指定的时间间隔的任务)。这意味着从基础表修改到物化视图刷新这段时间内,物化视图中可能包含失效的数据。

b) on commit 
在提交时(ON COMMIT):物化视图会在基础表修改所在的同一个事务里进行自动刷新,也就是说,物化视图总是包含最新的数据;(这种方式比较少用)

3) 刷新
a) 完全刷新(COMPLETE) 
会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。

b) 快速刷新(FAST) 
采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。

c) FORCE方式 
这是默认的数据刷新方式。Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。

4) 语法
create materialized view view_name
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)

]
AS subquery;

5) 示例
a) 创建MATERIALIZED VIEW:

create materialized view mv_materialized_test refresh force on demand start with sysdate next
to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as
select * from user_info; 
--这个物化视图在每天10:25进行刷新 

b) 修改刷新时间:

alter materialized view mv_materialized_test refresh force on demand start with sysdate 
next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');

alter materialized view mv_materialized_test refresh force on demand start with sysdate 
next trunc(sysdate,'dd')+1+1/24; -- 每天1点刷新

转自:https://blog.csdn.net/thinkpadshi/article/details/50516124 
 

猜你喜欢

转载自blog.csdn.net/dragonpeng2008/article/details/90059615