您的位置:首页 > 数据库 > Oracle

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

2016-01-14 11:28 483 查看

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点刷新
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: