首页 > Linux操作系统 > Linux操作系统 > 表上新增列持有的TM锁
问题:
如果表中数据量太大,在表上新增/删除列时将耗费较长时间(阻塞表的正常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/ ,如需转载,请注明出处,否则将追究法律责任。