在Oracle 11g以前,如果要在一个大表中增加一列,并设置默认值,那将是一个非常悲剧的事情.有些时候不得不选择在线重定义功能来实现该需求.而在11g中增加新列并设置默认值,只是简单的修改数据字典来实现该功能,大大提供效率
10g加列(默认值)SQL> select * from v$version; BANNEROracle 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 - Production SQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects; Table created. SQL> select count(*) from t_xifenfei; COUNT(*)49827 SQL> desc t_xifenfeiName Null? TypeOBJECT_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 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 ROWNOAAAMwJAAEAAAAB8AAr 4 124 43 SQL> alter system dump datafile 4 block 124; System altered. Elapsed: 00:00:00.08 |
11g增加列(默认值)SQL> select * from v$version; BANNEROracle 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 - Production SQL> create table t_xifenfei 2 as select object_id,object_name from dba_objects; Table created. SQL> select count(*) from t_xifenfei; COUNT(*)74605 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 ROWNOAAASpRAAEAAAACrAAu 4 171 46 SQL> 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 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 ROWNOAAASpRAAEAAAACrAAu 4 171 46 Elapsed: 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 ROWNOAAASpRAAEAAAACrAAu 4 171 46AAASpRAAEAAAB5TAAu 4 7763 46 SQL> ALTER SYSTEM DUMP DATAFILE 4 BLOCK 7763; System altered. tab 0, row 0, @0x4e3tl: 29 fb: col 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: col 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: col 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: col 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中后续插入的数据,默认值也插入到数据文件中更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12Oracle中表添加带有默认值列的讨论(包括11G新特性)通过在线重定义来增加大表列默认值相关资讯 Oracle 11g新特性
- Oracle 11g ASM新引入的特性 (04月10日)
- Oracle 11g新特性触发Direct Path (09/06/2015 21:51:03)
- Oracle 11g新特性之用户重命名 (05/26/2015 10:20:43)
| - Oracle 11gR2 ASM磁盘组管理与新特 (04月10日)
- Oracle 11g新特性之只读表 (08/05/2015 10:58:41)
- Oracle 11g新特性之收集多列统计信 (05/11/2015 12:28:32)
|
本文评论 查看全部评论 (0)