临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题。

1)  写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库中不能用临时表。

2)  临时表中存储的是临时数据,恢复数据库时不需要恢复它们,因此,浪费redo来保护它们没必要。

3)  临时表的undo占用满足undo保留时间的表空间。

Oracle12c中,允许将临时表的undo数据存储在临时表空间中,这使得临时表可以用于物理备库和只读库中,因为临时表没必要产生redo。

1.   启用/禁用临时undo

Oracle12c中,临时表的undo段默认还是通过常规undo表空间管理。临时undo通过TEMP_UNDO_ENABLED参数在会话或系统级别启用或禁用。

-- 会话级别

ALTER SESSION SETTEMP_UNDO_ENABLED = TRUE;

ALTER SESSION SETTEMP_UNDO_ENABLED = FALSE;

-- 系统级别

CONN sys@pdb1 AS SYSDBA

ALTER SYSTEM SETTEMP_UNDO_ENABLED = TRUE;

ALTER SYSTEM SETTEMP_UNDO_ENABLED = FALSE;

以下为临时undo的注意事项。

1)  临时undo功能仅在 COMPATIBLE参数设置为12.0.0或更高时才可用。

2)  一旦会话创建了一些临时undo,无论用常规还是临时undo,怎么设置TEMP_UNDO_ENABLED参数也是无济于事的,除非退出会话,期间,也不会有什么报错。

3)  临时undo在备库上是默认的设置,因此,无论在备库上怎么设置TEMP_UNDO_ENABLED参数,都没什么作用。

2.   监控临时undo

常规undo活动通过V$UNDOSTAT视图监控。Oracle12c中,增加了V$TEMPUNDOSTAT视图来监控临时undo活动。下面通过创建一个临时表来测试。

CONN test/test@pdb1

DROP TABLE g_t_tab PURGE;

CREATE GLOBAL TEMPORARY TABLEg_t_tab (

c1          NUMBER,

c2 VARCHAR2(20)

)

ON COMMIT DELETE ROWS;

确信用户可以访问V$TEMPUNDOSTAT视图。

CONN sys@pdb1 AS SYSDBA

GRANT SELECT ONv_$tempundostat TO test;

下面的测试创建一个会话,往临时表里加载一些数据,然后,检查redo和undo的使用变化。下例中没有用到临时undo。

CONN test/test@pdb1

SET AUTOTRACE ON STATISTICS;

--加载数据

INSERT INTO g_t_tab

WITH data AS (

SELECT 1 AS c1

FROM  dual

CONNECT BY level < 10000

)

SELECT rownum,TO_CHAR(rownum)

FROM   data a, data b

WHERE  rownum <= 1000000;

1000000 rows created.

Statistics

----------------------------------------------------------

46 recursive calls

15346 db block gets

2379 consistent gets

16 physical reads

2944564 redo size

855 bytes sent via SQL*Net to client

986 bytes received via SQL*Net from client

3 SQL*Net roundtrips to/from client

5 sorts (memory)

0 sorts (disk)

1000000 rows processed

SQL>

SET AUTOTRACE OFF

-- 检查该事务产生的undo

SELECT t.used_ublk,

t.used_urec

FROM   v$transaction t,

v$session s

WHERE  s.saddr = t.ses_addr

AND    s.audsid = SYS_CONTEXT('USERENV','SESSIONID');

USED_UBLK USED_UREC

---------- ----------

302      6238

SQL>

我们可以看到该操作产生了302个undo块,这就是统计信息显式产生了2.9M redo的原因,是为了保护这些undo块。

下例创建一个会话,开启临时undo,往临时表中加载一些数据,再检查redo和undo使用变化,即通过V$TEMPUNDOSTAT视图来检查产生的undo。

CONN test/test@pdb1

-- 打开临时undo

ALTER SESSION SETTEMP_UNDO_ENABLED = TRUE;

SET AUTOTRACE ON STATISTICS;

-- 加载数据

INSERT INTO g_t_tab

WITH data AS (

SELECT 1 AS c1

FROM   dual

CONNECT BY level < 10000

)

SELECT rownum,TO_CHAR(rownum)

FROM   data a, data b

WHERE  rownum <= 1000000;

1000000 rows created.

Statistics

----------------------------------------------------------

25 recursive calls

15369 db block gets

2348 consistent gets

16 physical reads

1004 redo size

853 bytes sent via SQL*Net to client

986 bytes received via SQL*Net from client

3 SQL*Net roundtrips to/from client

3 sorts (memory)

0 sorts (disk)

1000000 rows processed

SQL>

SET AUTOTRACE OFF

-- 检查该事务产生的undo

SELECT t.used_ublk,

t.used_urec

FROM   v$transaction t,

v$session s

WHERE  s.saddr = t.ses_addr

AND    s.audsid = SYS_CONTEXT('USERENV','SESSIONID');

USED_UBLK USED_UREC

---------- ----------

1          1

SQL>

--检查产生的临时undo

SET LINESIZE 200

ALTER SESSION SETNLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

SELECT *

FROM   v$tempundostat

WHERE  end_time >= SYSDATE - INTERVAL '1' MINUTE;

BEGIN_TIME           END_TIME                UNDOTSN   TXNCOUNT MAXCONCURRENCY MAXQUERYLENMAXQUERYID    UNDOBLKCNT     EXTCNT   USCOUNT SSOLDERRCNT NOSPACEERRCNT   CON_ID

---------------------------------------- ---------- ---------- -------------- ------------------------ ---------- ---------- ---------- ----------- -----------------------

24-NOV-2014 15:11:0923-NOV-2014 15:17:30          3          2              0           0                      321          4         1           0           0           0

SQL>

该例中,看到仅产生了少量的常规undo,导致产生了1K的redo。V$TEMPUNDOSTAT视图显示产生了321个临时undo块。

Oracle12c中性能优化&amp;功能增强新特性之临时undo的更多相关文章

  1. Oracle12c中性能优化&amp;功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...

  2. Oracle12c中性能优化&amp;功能增强新特性之重大突破——内存列存储新特性

    内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数据存在内存中的好处显而易见,而列 ...

  3. Oracle12c(12.1)中性能优化&amp;功能增强之通过参数THREADED_EXECTION使用多线程模型

    1.   后台 UNIX/Linux系统上,oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle  15356  ...

  4. Oracle12c中性能优化增强新特性之数据库智能闪存

    智能闪存功能最初在XD中引入.从Oracle11.2.0.2开始,除了用于XD存储,还可用于任何闪盘.Oracle12c中,不需卷管理器就可以使用闪盘. 1.  简介 智能闪存在solaris和lin ...

  5. Oracle12c功能增强 新特性之管理功能的增强

    1.    数据文件在线重命名和迁移 不想先前的版本号.在Oracle12cR1中,数据文件的迁移或重命名不再要求一系列的步骤,比如:将表空间至于仅仅读模式,然后数据文件逻辑等操作.在12cR1中.数 ...

  6. Oracle12c中数据删除(delete)新特性之数据库内归档功能

    有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已.这种需求通常通过如下方法实现: 1)  给相关表增加一个另外的列,该列存储标志数据被删除的标记. 2)  给 ...

  7. Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数

    Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载.Oracle12c文档中包括了该函数,因此, ...

  8. Oracle12c 中RAC功能增强新特性之ASM&amp;Grid

    1.    自动存储管理(ASM)方面的增强 1.1.   Flex ASM 在典型的网格架构安装中,每个节点有自己的ASM实例运行并扮演该节点上数据库的存储容器的角色,对这种安装配置,存在单点失败的 ...

  9. Oracle12c功能增强新特性之维护&amp;升级&amp;恢复&amp;数据泵等

    1.   内容提要 1)   表分区维护的增强. 2)   数据库升级改善. 3)   跨网络还原/恢复数据文件. 4)   数据泵的增强. 5)   实时ADDM. 6)   并发统计信息收集. 2 ...

随机推荐

  1. Fedora 20: How to enable SSH

    1. systemctl  enable sshd.service 2. service sshd restart

  2. RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)

    RTB(real time bidding)实时竞价允许广告买家根据活动目标.目标人群以及费用门槛等因素对每一个广告及每次广告展示的费用进行竞价.竞价成功后获得广告展示机会,在展示位置上展示广告. 其 ...

  3. PA 项目任务创建资源

    -- 创建资源 DECLARE p_project_id NUMBER := 155233; p_task_id NUMBER := 244639; p_resource_list_member_id ...

  4. 关于Debug和Release之本质区别的讨论

    一.Debug 和 Release 编译方式的本质区别     Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化 ...

  5. nginx 安装php

    1. 安装PHP 5.5.0 下载   1 2 cd /usr/local/src/ wget http://www.php.net/get/php-5.5.0.tar.bz2/from/jp1.ph ...

  6. 13_Android的生命周期

     Activity的生命周期图 2 Android生命周期中涉及到的几个过程 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Ac ...

  7. Linux管道编程实例

    /*管道 可以把管道想象为两个实体之间的单向连接器.注意,管道是半双工的, 如果需要全双工通讯,应该转而考虑套接字. 匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中: 命名 ...

  8. java工具类(四)之实现日期任意跳转

    Java实现日期任意跳转 项目开发过程中,需要进行订单提醒日期的设置,主要包括设置每月指定的日期或者指定的天数,代码如下: public static String DateOperation(Str ...

  9. androd输入管理系统机制解析

     android的输入管理系统主要完成按键.触摸板.鼠标等输入设备的事件输入,功能包括,输入设备的事件输入及向焦点窗口和焦点视图的事件派发,事件的插入,事件的过滤,事件的拦截等功能. 整个输入系统 ...

  10. infiniDB在linux下完成倒库

    在网看到自己的文章被四处烂用,经常搜到自己的文章.关键是,你能把我头像删除了不,有本事,你 把网址也给出http://blog.csdn.net/longshenlmj/article/details ...