现在的位置: 首页 > 综合 > 正文

使用TKPROF性能分析工具

2013年09月17日 ⁄ 综合 ⁄ 共 2239字 ⁄ 字号 评论关闭
文章目录

 

什么是回滚和撤销

事务使用回滚段来记录变化前的数据或者撤销信息。假如执行下述的命令:

UPDATE EMP SET SAL=SAL*1.5 WHERE EMPNO=7782;

这个语句怎样被执行?

1、  检查EMPNO=7782记录在Buffer Cache中是否存在,如果不存在则读取到Buffer Cache中

2、  在回滚表空间的相应回滚段事务表上分配事务槽,这个操作需要记录REDO信息。

3、  从回滚段读入或者在BUFFER CACHE中创建SAL=3000的前镜像,这需要产生REDO信息并记入REDO LOG BUFFER

4、  修改SAL=SAL*1.5,这是UPDATE的数据变更,需要记入REDO LOG BUFFER

5、  当用户提交时,会在REDO LOG BUFFER记录提交信息,并在回滚段标记该事务为非激活(INACTIVE)。

注意到在一个事务的进行过程中,REDO 和UNDO是交替出现的,而且对于数据库来说都是非常重要的。

 

回滚段存储的内容

Redo中只会记录少量信息,这些信息足以重演事务;同样Undo中也只记录精简的信息,这些信息足以撤销事务。

 

l  对于Insert操作,回滚段只需要记录插入记录的rowid,如果回滚,只需要将该记录根据rowid删除即可。

l  对于Update操作,回滚段只需要记录被更新字段的旧值即可(前镜像),回滚时通过旧值覆盖新值即可完成回退。

l  对于Delete操作,Oracle必须记录整行的数据,在回退时,Oracle通过一个反向操作恢复删除的数据。

通过以上的分析,我们可以看到,对于相同数据量的数据操作,Insert操作产生的Undo最少,其次是Update操作,而Delete操作会产生最多的Undo数据。这也就是我们通常看到的,当一个大的DELETE操作进行时,总是需要很长的时间来处理完成,并且会有大量的Redo产生。所以,通常在进行大量数据删除时,推荐通过分批次删除,然后再提交。以减少对于回滚段的占用和冲击。

 

并发控制和一致性读取

允许多用户并发访问是数据库必须满足的功能,但是如何实现并发访问、控制和数据修改就成为了一个非常复杂的问题。

Oracle一方面通过锁定机制来实现数据库的并发控制;一方面通过了多版本模型来进行并发数据访问。通过多版本控制,Oracle实现了读写分离技术,使得读不阻塞写数据,修改数据;写不阻塞读取数据。

多版本模型在Oracle数据库中是通过一致性读取来实现的,一致性读取也是回滚表空间的主要作用之一。

Oracle一方面不允许其它用户读取未提交的数据,一方面要保证用户读取的数据要来自同一时间点。

时间点

SESSION 1

SESSION 2

说明

T1

SELECT SAL FORM EMP WHERE EMPNO=7782;

 

SESSION1看到这个结果,例如薪水为800

T2

 

UPDATE EMP SET SAL=SAL*1.5 WHERE EMPNO=7782;

SESSION2更新薪水,但是未提交

T3

SELECT SAL FORM EMP WHERE EMPNO=7782;

 

SESSION1查询数据看到薪水仍然为800,它看不到SESSION2未提交的数据。Oracle需要通过回滚段记录的前镜像进行一致性读取(与T1时刻的数据一致),将800恢复出来提供给用户。

T4

 

COMMIT;

提交数据,发生改变

T5

SELECT SAL FORM EMP WHERE EMPNO=7782;

 

都可以看到变化以后的数据。

T6

 

 

 

 

 

在提交一个事务时,该事务的撤销数据就不再需要了。但是该撤销数据却呆在撤销表空间中,直到为记录更加新的事务的撤销数据而需要空间为止。在更加新的事务的撤销数据进入时,如果没有足够的可用空间,可能会覆盖旧的撤销数据(来自于自己提交的事务)。对于为了一致性的目的而需要保留较旧的撤销数据的长时间运行的查询,存在着它所需要的数据已经被其他更加新的事务覆盖的可能。在这种情况下,可能会从数据库得到一条错误消息(“快照太旧”),指出事务的前像已经被覆盖。这个错误表现为:ORA-01555错误。

 

使用撤销数据的闪回错误纠正

在Oracle数据库9i版本以前,纠正用户错误的唯一办法就是使用基于时间点的恢复,这种办法很冗长,也很复杂。Oracle9i数据库引入了闪回的特性,Oracle10g数据库对闪回的功能做了很大的增强。

Oracle10g数据库提供了几种根据撤销数据纠正错误的技术。但是所有这些特性都是在使用AUTO UNDO MANAGEMENT 的前提下才有可能。Oracle10g中的以下闪回特性依赖撤销数据:

1、  闪回查询:从过去的时间点检索数据。

2、  闪回版本查询:给出表行的不同版本,提供元数据,如创建行版本的特定事务的开始和结束时间。

3、  闪回事务查询:允许检索一个给定事务的历史数据,以及用SQL代码撤销对特定行所做的更改。

4、  闪回表:快速恢复一个表到它以前的时间点的状态而不必执行基于时间点的恢复。

 

还有其它闪回特性,例如闪回删除(FLASHBACK DROP)和闪回数据库(FLASHBACK DATABASE)等,但它们不使用撤销数据。

 

如果想要更好的使用闪回特性,应该保证提供了足够尺寸的撤销表空间。最好使用自动扩展撤销表空间,以使Oracle能够保留撤销数据比最长的查询时间更长。此外,应该为撤销数据指定GETENION GUARANTEE。简单地设置较大的UNDO_RETENTION值并不能保证Oracle不丢弃未过期的撤销数据。

抱歉!评论已关闭.