热门标签 | 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。



推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
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社区 版权所有