热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

undochangevectorsizeoracle,ddl操作是否会产生undo?

ddl是否会产生undo?这可能是每一个初学Oracle的人都会有的疑问;ddl操作又不能rollback回滚,要什么undo数据呢?事实

01fac6460a22031b8af8da5848698a70.png

ddl是否会产生undo?

这可能是每一个初学Oracle的人都会有的疑问;ddl操作又不能rollback回滚,要什么undo数据呢?

事实是几乎每个ddl操作都会产生undo,我们来探究一下:

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 0

SQL> create table YOUYUS (t1 int);

Table created.

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 1992

/*create table的ddl语句产生了大约1992 bytes的撤销变化向量*/

SQL> drop table YOUYUS;

Table dropped.

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 4528

/* drop table语句产生2563 bytes的undo数据,多于create table;我们可以猜测create table时Oracle需要向基表中insert数据,而drop table时则需要delete/update数据,显然后者产生更多的undo*/

/*我们尝试创建一个由254个列组成的表*/

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 0

create table YOUYUS (

t1 int,

t2 char(4) default 'oooo',

t3 char(4) default 'oooo',

t4 char(4) default 'oooo',

t5 char(4) default 'oooo',

t6 char(4) default 'oooo',

t7 char(4) default 'oooo',

t8 char(4) default 'oooo',

t9 char(4) default 'oooo',

............................

t248 char(4) default 'oooo',

t249 char(4) default 'oooo',

t250 char(4) default 'oooo',

t251 char(4) default 'oooo',

t252 char(4) default 'oooo',

t253 char(4) default 'oooo',

t254 char(4) default 'oooo'

);

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 85832

/*产生了83k的undo,ddl所产生的undo量视乎其所要维护数据字典的操作类型和操作量*/

SQL> oradebug setmypid;

Statement processed.

SQL> oradebug event 10046 trace name context forever,level 1;

Statement processed.

SQL> drop table YOUYUS;

Table dropped.

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 214020

/*drop 产生了125k的undo*/

SQL> oradebug tracefile_name;

/home/maclean/app/maclean/diag/rdbms/prod/PROD/trace/PROD_ora_5433.trc

/* 我们来看看drop table 到底做了哪些递归操作? */

[maclean@rh2 ~]$ cat PROD_ora_5433.trc|egrep "delete|update"

'Need use delete_topo_geometry_layer() to deregister table '

select decode(u.type#, 2, u.ext_username, u.name), o.name, t.update$, t.insert$, t.delete$, t.enabled, decode(bitand(t.property, 8192),8192, 1, 0), decode(bitand(t.property, 65536), 65536, 1, 0), decode(bitand(t.property, 131072), 131072, 1, 0), (select o.name from obj$ o where o.obj# = u.spare2 and o.type# =57) from sys.obj$ o, sys.user$ u, sys.trigger$ t, sys.obj$ bo where t.baseobject=bo.obj# and bo.name = :1 and bo.spare3 = :2 and bo.namespace = 1 and t.obj#=o.obj# and o.owner#=u.user# and o.type# = 12 and bitand(property,16)=0 and bitand(property,8)=0 order by o.obj#

delete from object_usage where obj# in (select a.obj# from object_usage a, ind$ b where a.obj# = b.obj# and b.bo# = :1)

delete from sys.cache_stats_1$ where dataobj# = :1

delete com$ where obj#=:1

delete from hist_head$ where obj# = :1

delete from dependency$ where d_obj#=:1

delete from source$ where obj#=:1

delete from compression$ where obj#=:1

m_stmt:='delete from sdo_geor_ddl__table$$ where id=2';

m_stmt:='delete from sdo_geor_ddl__table$$';

delete from sdo_geor_ddl__table$$ where id=2

delete from col$ where obj#=:1

delete from icol$ where bo#=:1

delete from icoldep$ where obj# in (select obj# from ind$ where bo#=:1)

delete from jijoin$ where obj# in ( select obj# from jijoin$ where tab1obj# = :1 or tab2obj# = :1)

delete from jirefreshsql$ where iobj# in ( select iobj# from jirefreshsql$ where tobj# = :1)

delete from ccol$ where obj#=:1

delete from ind$ where bo#=:1

delete from cdef$ where obj#=:1

delete ecol$ where tabobj# = :1

delete from tab$ where obj#=:1

delete from idl_ub1$ where obj#=:1 and part=:2

delete from idl_char$ where obj#=:1 and part=:2

delete from idl_ub2$ where obj#=:1 and part=:2

delete from idl_sb4$ where obj#=:1 and part=:2

delete from ncomp_dll$ where obj#=:1 returning dllname into :2

delete from idl_ub1$ where obj#=:1 and part=:2

delete from idl_char$ where obj#=:1 and part=:2

delete from idl_ub2$ where obj#=:1 and part=:2

delete from idl_sb4$ where obj#=:1 and part=:2

delete from ncomp_dll$ where obj#=:1 returning dllname into :2

delete from idl_ub1$ where obj#=:1 and part=:2

delete from idl_char$ where obj#=:1 and part=:2

delete from idl_ub2$ where obj#=:1 and part=:2

delete from idl_sb4$ where obj#=:1 and part=:2

delete from ncomp_dll$ where obj#=:1 returning dllname into :2

delete from col$ where obj#=:1

delete coltype$ where obj#=:1

delete from subcoltype$ where obj#=:1

delete ntab$ where obj#=:1

delete lob$ where obj#=:1

delete refcon$ where obj#=:1

delete from opqtype$ where obj#=:1

delete from cdef$ where obj#=:1

delete from objauth$ where obj#=:1

delete from obj$ where obj# = :1

update seg$ set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize=:9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, 65535, NULL, :13),groups=decode(:14, 65535, NULL, :14), cachehint=:15, hwmincr=:16, spare1=DECODE(:17,0,NULL,:17),scanhint=:18, bitmapranges=:19 where ts#=:1 and file#=:2 and block#=:3

update seg$ set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize=:9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, 65535, NULL, :13),groups=decode(:14, 65535, NULL, :14), cachehint=:15, hwmincr=:16, spare1=DECODE(:17,0,NULL,:17),scanhint=:18, bitmapranges=:19 where ts#=:1 and file#=:2 and block#=:3

delete from seg$ where ts#=:1 and file#=:2 and block#=:3

/*如果ddl操作执行失败又会如何呢?*/

SQL> oradebug setmypid;

Statement processed.

SQL> oradebug event 10046 trace name context forever,level 1;

Statement processed.

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 0

SQL> drop table YOUYUS;

drop table YOUYUS

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> select vs.name, ms.value

2 from v$mystat ms, v$sysstat vs

3 where ms.statistic# = vs.statistic#

4 and name = 'undo change vector size';

NAME VALUE

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

undo change vector size 264

/*同样产生了undo,量较少*/

SQL> oradebug tracefile_name;

/home/maclean/app/maclean/diag/rdbms/prod/PROD/trace/PROD_ora_5494.trc

[maclean@rh2 trace]$ cat PROD_ora_5494.trc|egrep "update|insert|delete"

'Need use delete_topo_geometry_layer() to deregister table '

m_stmt:='insert into sdo_geor_ddl__table$$ values (1)';

m_stmt:='insert into sdo_geor_ddl__table$$ values (2)';

insert into sdo_geor_ddl__table$$ values (2)

m_stmt:='delete from sdo_geor_ddl__table$$';

delete from sdo_geor_ddl__table$$

/*执行少量递归操作后,Oracle发现所要drop的对象并不存在,将会rollback之前的"部分"递归dml操作*/

其实我们可以把ddl操作分解为以下步骤:

begin

commit;

--编译ddl

begin

--实现ddl,包括一系列递归的数据字典维护操作及其他操作

commit;

exception

when others then

rollback;

end;

end;

ddl操作无需也不允许手动commit或rollback参与,但这并不代表ddl操作不产生undo。



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 在很多数据库中都存在一个自动增长的列,如果现在要想在oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。语法:CREAT ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
花甲墨者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有