当前位置:  数据库>oracle

Oracle 12c中性能优化&功能增强新特性之临时undo

    来源: 互联网  发布时间:2017-06-26

    本文导语: 临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题。 1)  写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库中不能用临时表。 2)  临时表中存储...

临时表最有意思的特点之一是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

 

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

 

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块。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle如何致力于增强Linux技术
  • Oracle 11g R1中资源管理器增强
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • java开发知识 iis7站长之家
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • ORACLE中DBMS_RANDOM随机数生成包
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3