Oracle 11g增加列,并带默认值的新特性
在Oracle 11g以前,如果要在一个大表中增加一列,并设置默认值,那将是一个非常悲剧的事情.有些时候不得不选择在线重定义功能来实现该需求.而在11g中增加新列并设置默认值,只是简单的修改数据字典来实现该功能,大大提供效率
10g加列(默认值)
SQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 ProductionTNS for Linux: Version 10.2.0.1.0 - ProductionNLSRTL Version 10.2.0.1.0 - ProductionSQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects;table created.SQL> select count(*) from t_xifenfei;count(*)----------49827SQL> desc t_xifenfeiName Null? Type----------------------------------------- -------- ----------------------------OBJECT_ID NUMBEROBJECT_NAME VARCHAR2(128)SQL> set timing onSQL> alter table t_xifenfei add c_xff varchar2(100) default 'www.xifenfei.com' not Null;table altered.Elapsed: 00:00:06.13--使用了6秒钟SQL> select rowid,2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,3 dbms_rowid.rowid_block_number(rowid)blockno,4 dbms_rowid.rowid_row_number(rowid) rowno5 from t_xifenfei where object_name='OBJ$';ROWID REL_FNO BLOCKNO ROWNO------------------ ---------- ---------- ----------AAAMwJAAEAAAAB8AAr 4 124 43SQL> alter system dump datafile 4 block 124;System altered.Elapsed: 00:00:00.08 |
11g增加列(默认值)
SQL> select * from v$version;BANNER-----------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ProductionPL/SQL Release 11.2.0.3.0 - ProductionCORE 11.2.0.3.0 ProductionTNS for Linux: Version 11.2.0.3.0 - ProductionNLSRTL Version 11.2.0.3.0 - ProductionSQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects;table created.SQL> select count(*) from t_xifenfei;count(*)----------74605SQL> select rowid,2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,3 dbms_rowid.rowid_block_number(rowid)blockno,4 dbms_rowid.rowid_row_number(rowid) rowno5 from t_xifenfei where object_name='OBJ$';ROWID REL_FNO BLOCKNO ROWNO------------------ ---------- ---------- ----------AAASpRAAEAAAACrAAu 4 171 46SQL> alter system dump datafile 4 block 171;System altered.SQL> set timing onSQL> alter table t_xifenfei add c_xff varchar2(100) default 'www.xifenfei.com' not Null;table altered.Elapsed: 00:00:00.19--只是使用了0.19秒SQL> select rowid,2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,3 dbms_rowid.rowid_block_number(rowid)blockno,4 dbms_rowid.rowid_row_number(rowid) rowno5 from t_xifenfei where object_name='OBJ$';ROWID REL_FNO BLOCKNO ROWNO------------------ ---------- ---------- ----------AAASpRAAEAAAACrAAu 4 171 46Elapsed: 00:00:00.04SQL> alter system dump datafile 4 block 171;System altered. |
通过10g和11g的增加相同列和默认值的对比可以发现,11g的速度要比10g快很多很多,下面我们通过上面dump出来相关的数据块来分析原因
dump分析
11g增加列之前dump
tab 0, row 0, @0x1f74tl: 12 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 15col 1: [ 5] 49 43 4f 4c 24tab 0, row 1, @0x1f66tl: 14 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 2fcol 1: [ 7] 49 5f 55 53 45 52 31tab 0, row 2, @0x1f5btl: 11 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 1dcol 1: [ 4] 43 4f 4e 24 |
11g增加列之后dump
tab 0, row 0, @0x1f74tl: 12 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 15col 1: [ 5] 49 43 4f 4c 24tab 0, row 1, @0x1f66tl: 14 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 2fcol 1: [ 7] 49 5f 55 53 45 52 31tab 0, row 2, @0x1f5btl: 11 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 1dcol 1: [ 4] 43 4f 4e 24tab 0, row 3, @0x1f4ftl: 12 fb: --H-FL-- lb: 0x0 cc: 2col 0: [ 2] c1 10col 1: [ 5] 55 4e 44 4f 24 |
10g增加列之后dump
因为10g在没有增加列之前的dump和11g未增加列之前类似,所以未dump出来
tab 0, row 0, @0x1f63tl: 29 fb: --H-FL-- lb: 0x2 cc: 3col 0: [ 2] c1 15col 1: [ 5] 49 43 4f 4c 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 1, @0x1f44tl: 31 fb: --H-FL-- lb: 0x2 cc: 3col 0: [ 2] c1 2dcol 1: [ 7] 49 5f 55 53 45 52 31col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 2, @0x1f28tl: 28 fb: --H-FL-- lb: 0x2 cc: 3col 0: [ 2] c1 1dcol 1: [ 4] 43 4f 4e 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 3, @0x1f0btl: 29 fb: --H-FL-- lb: 0x2 cc: 3col 0: [ 2] c1 10col 1: [ 5] 55 4e 44 4f 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d |
对比发现11g在增加列之后,以前的数据dump出来的内容未有任何改变.也就是说:在10g中,我们增加一个列和默认值,会自动的增加到真实的数据中,而在11g中增加列和默认值并未真的加到11g的表中已经存在的数据中.
11g中插入新数据dump测试
SQL> insert into chf.t_xifenfei(object_id,object_name)2 select object_id,object_name from dba_objects;74605 rows created.SQL> commit;commit complete.SQL> alter SYSTEM FLUSH BUFFER_CACHE;System altered.SQL> /System altered.--建议刷新SQL> SQL> SQL> select rowid,2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,3 dbms_rowid.rowid_block_number(rowid)blockno,4 dbms_rowid.rowid_row_number(rowid) rowno5 from chf.t_xifenfei where object_name='OBJ$';ROWID REL_FNO BLOCKNO ROWNO------------------ ---------- ---------- ----------AAASpRAAEAAAACrAAu 4 171 46AAASpRAAEAAAB5TAAu 4 7763 46SQL> alter SYSTEM DUMP DATAFILE 4 BLOCK 7763;System altered.--dump内容tab 0, row 0, @0x4e3tl: 29 fb: --H-FL-- lb: 0x1 cc: 3col 0: [ 2] c1 15col 1: [ 5] 49 43 4f 4c 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 1, @0x500tl: 31 fb: --H-FL-- lb: 0x1 cc: 3col 0: [ 2] c1 2fcol 1: [ 7] 49 5f 55 53 45 52 31col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 2, @0x51ftl: 28 fb: --H-FL-- lb: 0x1 cc: 3col 0: [ 2] c1 1dcol 1: [ 4] 43 4f 4e 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6dtab 0, row 3, @0x53btl: 29 fb: --H-FL-- lb: 0x1 cc: 3col 0: [ 2] c1 10col 1: [ 5] 55 4e 44 4f 24col 2: [16] 77 77 77 2e 78 69 66 65 6e 66 65 69 2e 63 6f 6d |
通过这里看看出:在11g中后续插入的数据,默认值也插入到数据文件中
相关推荐
dflyzx 2020-09-17
higheels 2020-07-20
Ericbig 2020-07-19
yinyang00 2020-05-15
lijiuchangxin 2020-05-14
yogoma 2020-05-09
jacktangj 2020-04-19
Yyqingmofeige 2020-03-26
idning 2020-02-14
宿舍 2020-01-31
luenxin 2020-01-22
水痕 2020-01-18
chouliqingke 2020-01-08
secondid 2019-12-18
XCodeRush 2019-12-17
ryuhfxz 2019-11-20
qonsnow 2014-03-07
coulder 2019-11-17