知识大全 小议Oracle11g的自治事务(六)
Posted 过程
篇首语:月缺不改光,箭折不改钢。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 小议Oracle11g的自治事务(六)相关的知识,希望对你有一定的参考价值。
小议Oracle11g的自治事务(六) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
自治事务提供了很方便的事务控制功能 使得用户可以在不影响当前事务的情况下 提交或回滚对数据库的修改 那么Oracle为了实现这个功能是否付出了很多的代价呢 下面对比一下自治事务和普通事务的统计信息
SQL> CREATE GLOBAL TEMPORARY TABLE T_SESSION_STAT (ID NUMBER NAME VARCHAR ( ) VALUE NUMBER) ON MIT PRESERVE ROWS;
表已创建
SQL> CREATE TABLE T_RECORD (ID NUMBER NAME VARCHAR ( ));
表已创建
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS BEGIN INSERT INTO T_RECORD VALUES ( TEST ); MIT; END; /
过程已创建
SQL> CREATE OR REPLACE PROCEDURE P_TEST_AUTO AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO T_RECORD VALUES ( TEST ); MIT; END; /
过程已创建
SQL> SET SERVEROUT OFF SQL> BEGIN INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST_AUTO; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); FOR C IN ( SELECT * FROM ( SELECT A NAME C VALUE + A VALUE * B VALUE VALUE FROM T_SESSION_STAT A T_SESSION_STAT B T_SESSION_STAT C WHERE A NAME = B NAME AND A NAME = C NAME AND A ID = AND B ID = AND C ID = ) WHERE ABS(VALUE) > ) LOOP DBMS_OUTPUT PUT_LINE(RPAD(C NAME ) || C VALUE); END LOOP; END; / PL/SQL 过程已成功完成 SQL> TRUNCATE TABLE T_SESSION_STAT;
表被截断
SQL> SET SERVEROUT ON SQL> BEGIN INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST_AUTO; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); FOR C IN ( SELECT * FROM ( SELECT A NAME C VALUE + A VALUE * B VALUE VALUE FROM T_SESSION_STAT A T_SESSION_STAT B T_SESSION_STAT C WHERE A NAME = B NAME AND A NAME = C NAME AND A ID = AND B ID = AND C ID = ) WHERE ABS(VALUE) > ) LOOP DBMS_OUTPUT PUT_LINE(RPAD(C NAME ) || C VALUE); END LOOP; END; /
recursive cpu usage
session logical reads
CPU used by this session
enqueue releases
db block gets
db block gets from cache
consistent gets
consistent gets from cache
consistent gets examination
db block changes
consistent changes
mit cleanout failures: block lost
mit cleanouts
calls to kcmgcs
calls to get snapshot scn: kcmgss
redo size
undo change vector size
mit txn count during cleanout
IMU mits
IMU Flushes
IMU undo allocation size
PL/SQL 过程已成功完成
由于第一次调用匿名块和过程会产生会导致递归调用信息 而这些可能干扰统计信息的结果 因此执行两次匿名块 取第二次的结果为最终结果
从二者的差异可以看到 自治事务产生的redo和undo都比普通事务要大一些 这时可以理解的 不过现在只是插入一条记录 不能说明什么问题 关键看这种差异随事务的增大成比例增长还是基本维持原状
下面修改两个存储过程
SQL> CREATE OR REPLACE PROCEDURE P_TEST AS BEGIN FOR I IN LOOP INSERT INTO T_RECORD VALUES ( TEST ); END LOOP; MIT; END; /
过程已创建
SQL> CREATE OR REPLACE PROCEDURE P_TEST_AUTO AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN FOR I IN LOOP INSERT INTO T_RECORD VALUES ( TEST ); END LOOP; MIT; END; /
过程已创建
SQL> EXEC P_TEST
PL/SQL 过程已成功完成
SQL> EXEC P_TEST_AUTO
PL/SQL 过程已成功完成
SQL> TRUNCATE TABLE T_SESSION_STAT;
表被截断
SQL> DELETE T_RECORD;
已删除 行
SQL> MIT;
提交完成
SQL> BEGIN INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST_AUTO; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); FOR C IN ( SELECT * FROM ( SELECT A NAME C VALUE + A VALUE * B VALUE VALUE FROM T_SESSION_STAT A T_SESSION_STAT B T_SESSION_STAT C WHERE A NAME = B NAME AND A NAME = C NAME AND A ID = AND B ID = AND C ID = ) WHERE ABS(VALUE) > ) LOOP DBMS_OUTPUT PUT_LINE(RPAD(C NAME ) || C VALUE); END LOOP; END; /
opened cursors cumulative
recursive calls
recursive cpu usage
session logical reads
CPU used by this session
enqueue requests
enqueue releases
db block gets
db block gets from cache
consistent gets
consistent gets from cache
consistent gets examination
db block changes
consistent changes
change write time
free buffer requested
mit cleanout failures: block lost
mit cleanouts
mit cleanouts successfully pleted
calls to kcmgcs
calls to kcmgas
calls to get snapshot scn: kcmgss
redo entries
redo size
redo ordering marks
undo change vector size
no work consistent read gets
deferred (CURRENT) block cleanout applications
mit txn count during cleanout
active txn count during cleanout
cleanout number of ktugct calls
IMU undo allocation size
IMU Redo allocation size
table scans (short tables)
table scan rows gotten
table scan blocks gotten
cluster key scans
cluster key scan block gets
index fetch by key
heap block press
session cursor cache hits
buffer is not pinned count
parse count (total)
execute count
PL/SQL 过程已成功完成
IMU是 g的IN MEMORY UNDO的缩写 这个值比较大主要是由于前面进行了DELETE 后面又插入相同的数据 因此Oracle采用了IMU操作 抛去这个因素 其他的差异于事务本身代价相比就小得多了
SQL> TRUNCATE TABLE T_SESSION_STAT;
表被截断
SQL> BEGIN INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); P_TEST_AUTO; INSERT INTO T_SESSION_STAT SELECT NAME VALUE FROM V$SESSTAT A V$STATNAME B WHERE A STATISTIC# = B STATISTIC# AND A SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM = ); FOR C IN ( SELECT * FROM ( SELECT A NAME B VALUE A VALUE VALUE FROM T_SESSION_STAT A T_SESSION_STAT B WHERE A NAME = B NAME AND A ID = AND B ID = ) WHERE ABS(VALUE) > ) LOOP DBMS_OUTPUT PUT_LINE(RPAD(C NAME ) || C VALUE); END LOOP; END; /
recursive calls
session logical reads
db block gets
db block gets from cache
db block changes
redo entries
redo size
undo change vector size
IMU undo allocation size
IMU Redo allocation size
execute count
PL/SQL 过程已成功完成
cha138/Article/program/Oracle/201311/17919相关参考
小议Oracle11g的自治事务(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 上一篇文章
小议Oracle11g的自治事务(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这两天看了
小议Oracle11g的自治事务(四) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!上一篇文章描述
小议Oracle外键约束修改行为(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracl
Oracle内存数据库11g和高速缓存11g上市 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!北京
Oracle9i数据库WITH查询语法小议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ora
Oracle11g默认目录结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracleg主流
Oracle11g安装图文攻略 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 呵呵花了一个多小时
Oracle11g备份恢复功能增强 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracleg
oracle11G空表默认不导出解决 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ORACLE