1 临时undo的概述
临时表被广泛用作暂存中间结果的区域。这是因为更改这些表要比更改非临时表快得多。性能的提高主要是因为没有直接为临时表上的更改生成重做条目。但是,对临时表(和索引)操作的undo仍然记录在重做日志中。
临时表的undo对于临时对象生命周期内的一致读取和事务回滚非常有用。在此范围之外,undo是多余的。因此,不需要在重做日志中持久化它。例如,事务恢复只是放弃对临时对象的undo。
从Oracle数据库12c开始,由临时表事务生成的undo可以直接存储在临时表空间的一个单独的undo中,以避免undo被记录在重做日志中。这种模式称为临时undo。
注意:一个临时的undo段是会话私有的。它存储对属于相应会话的临时表(通常是临时对象)更改的undo。
2 临时undo的启用及禁用
启用临时undo有以下好处:
临时undo减少了在undo表空间中存储的undo数量,节省了undo的空间。
临时undo可以减小重做日志的大小。性能得到了提高,因为写入重做日志的数据更少了,而解析重做日志记录的组件(如LogMiner)的性能更好,因为需要解析的重做数据更少了。
通过使用Oracle Active data Guard选项,临时undo允许对物理备用数据库中的临时表进行数据操作语言(DML)操作。但是,创建临时表的数据定义语言(DDL)操作必须在主数据库上发出。
可以为特定会话或整个数据库启用临时undo。当使用ALTER SESSION语句为会话启用临时undo时,会话将在不影响其他会话的情况下创建临时undo。当使用ALTER SYSTEM语句为系统启用临时undo时,所有现有会话和新会话都会创建临时undo。
ALTER session SET temp_undo_enabled = true; ALTER system SET temp_undo_enabled = true;
复制
当会话第一次使用临时对象时,将为会话的其余部分设置TEMP_UNDO_ENABLED初始化参数的当前值。因此,如果为会话启用了临时undo,而该会话使用了临时对象,则不能为该会话禁用临时undo。类似地,如果会话禁用了临时undo,而该会话使用了临时对象,则不能为该会话启用临时undo。
对于初始化参数至少设置为12.1.0.0.0的数据库,可以使用临时undo功能。
注意:对于物理备用数据库,默认情况下使用Oracle Active Data Guard选项启用临时undo。由于是默认设置,TEMP_UNDO_ENABLED初始化参数对带有Active Data Guard选项的物理备用数据库没有影响。
3 监视临时undo
SELECT to_char(BEGIN_TIME,'dd/mm/yy hh24:mi:ss'), TXNCOUNT,MAXCONCURRENCY,UNDOBLKCNT,USCOUNT,NOSPACEERRCNT FROM V$TEMPUNDOSTAT;
复制
VTEMPUNDOSTAT显示了与这个数据库实例的临时undo日志相关的各种统计信息。它显示统计数据的柱状图,以显示系统如何工作。视图中的每一行保存实例中收集的统计信息,时间间隔为10分钟。行按BEGIN_TIME列值的降序排列。这个视图类似于VUNDOSTAT视图。
V$TEMPUNDOSTAT视图中的一些重要列:
BEGIN_TIME:标识时间间隔的开始
TXNCOUNT:在相应的时间间隔内绑定到临时undo段的事务总数
MAXCONCURRENCY:并发执行的最大事务数,这些事务在相应的时间间隔内修改临时对象
UNDOBLKCNT:在相应的时间间隔内消耗的临时undo块的总数
USCOUNT:在相应的时间间隔内创建的临时undo段
NOSPACEERRCNT:在相应的时间间隔内,没有剩余空间进行临时undo的错误的总次数