ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 表上新增列持有的TM锁

表上新增列持有的TM锁

原创 Linux操作系统 作者:redhouser 时间:2013-03-01 16:17:47 0 删除 编辑

问题:
如果表中数据量太大,在表上新增/删除列时将耗费较长时间(阻塞表的正常dml操作).

对于alter table add(x int default 0),优化的方案是分三步执行:
第一步,先添加列,alter table add(x int),可以在很短时间内完成;
第二步,修改列缺省值,alter table modify(x default 0),由于只涉及修改表上的元数据,所需时间很短;注意:有not null约束,alter table modify(x default 0 not null),因为需要验证数据是否满足约束条件,耗时仍会很长。
第三步,通过并行更新设置新添加列为缺省值(优化的关键在此,通过并行大大缩短所需维护时间)。
前两步执行时间短,在停产窗口中实施,最后一步可联机执行,可以大大缩短停产时间。

下面给出不同的列维护操作所需持有的TM锁。

版本:
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


--1,测试准备

create table p(x int);

alter table p
  add constraint pk_p primary key(x);


insert into p values(1);
insert into p values(2);
insert into p values(3);

commit;

select object_name,object_type,object_id,to_char(object_id,'xxxxxxx') from user_objects;
OBJECT_NAM OBJECT_TYPE          OBJECT_ID TO_CHAR(
---------- ------------------- ---------- --------
P          TABLE                   156099    261c3
PK_P       INDEX                   156100    261c4


--2,比较增加列时TM持有情况
2.1 add(y1 int)
alter session set events '10704 trace name context forever,level 12';
alter table p add(y1 int);
alter session set events '10704 trace name context off';

--bocnet_ora_12929.trc
*** 2028-09-20 14:53:37.140
ksqgtl *** TM-000261c3-00000000 mode=6 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3dbc3080, ktcdix=2147483647, topxcb=0x0x3dbc3080
 ktcipt(topxcb)=0x0
*** 2028-09-20 14:53:37.276
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=6的TM锁

2.2 modify y1 default 0
alter session set events '10704 trace name context forever,level 12';
alter table p modify y1 default 0;
alter session set events '10704 trace name context off';

--bocnet_ora_17385.trc
*** 2028-09-20 15:27:28.088
ksqgtl *** TM-000261c3-00000000 mode=6 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3dbdb8ac, ktcdix=2147483647, topxcb=0x0x3dbdb8ac
 ktcipt(topxcb)=0x0
*** 2028-09-20 15:27:28.252
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=6的TM锁,该操作只修改表的定义,与表中数据量无关,会很快完成。

2.3 modify y1 not null
update p set y1=0;
commit;

alter session set events '10704 trace name context forever,level 12';
alter table p modify y1 not null;
alter session set events '10704 trace name context off';

--bocnet_ora_17569.trc
*** 2028-09-20 15:28:46.168
ksqgtl *** TM-000261c3-00000000 mode=6 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3db4e07c, ktcdix=2147483647, topxcb=0x0x3db4e07c
 ktcipt(topxcb)=0x0
*** 2028-09-20 15:28:46.248
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=6的TM锁,需要验证数据,持有时间较长


2.4 add(y2 int default 0)
alter session set events '10704 trace name context forever,level 12';
alter table p add(y2 int default 0);
alter session set events '10704 trace name context off';

--bocnet_ora_13028.trc
*** 2028-09-20 14:54:20.611
ksqgtl *** TM-000261c3-00000000 mode=6 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3dbc3080, ktcdix=2147483647, topxcb=0x0x3dbc3080
 ktcipt(topxcb)=0x0
*** 2028-09-20 14:54:20.657
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=6的TM锁,需要给每行添加数据,持有时间较长

2.5 add(y3 int default 0 not null)
alter session set events '10704 trace name context forever,level 12';
alter table p add(y3 int default 0 not null);
alter session set events '10704 trace name context off';

--bocnet_ora_13124.trc
*** 2028-09-20 14:54:48.809
ksqgtl *** TM-000261c3-00000000 mode=6 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3db6c014, ktcdix=2147483647, topxcb=0x0x3db6c014
 ktcipt(topxcb)=0x0
*** 2028-09-20 14:54:48.892
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=6的TM锁,需要给每行添加数据,持有时间较长


2.6 drop column y3
alter session set events '10704 trace name context forever,level 12';
alter table p drop column y3;
alter session set events '10704 trace name context off';

--bocnet_ora_13183.trc
*** 2028-09-20 14:55:13.384
ksqgtl *** TM-000261c3-00000000 mode=5 flags=0x401 timeout=0 ***
ksqgtl: xcb=0x0x3db4eac4, ktcdix=2147483647, topxcb=0x0x3db4eac4
 ktcipt(topxcb)=0x0
*** 2028-09-20 14:55:13.474
ksqcnv: TM-000261c3,00000000 mode=6 timeout=0
*** 2028-09-20 14:55:13.474
ksqcmi: TM,261c3,0 mode=6 timeout=0
ksqcmi: returns 0
ksqcnv: RETURNS 0
*** 2028-09-20 14:55:13.622
ksqrcl: TM,261c3,0
ksqrcl: returns 0
==>获取表mode=5的TM锁,随后转换为mode=6的TM锁


 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18922393/viewspace-755068/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-26

  • 博文量
    211
  • 访问量
    876667