oracle笔记整理10——性能调优之临时表与物化视图

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点刷新

你可能感兴趣的:(oracle,性能,临时表,物化视图)