oracle 11g的表增加带有默认值的字段什么情况下只改数据字典不改表
Nov132015
前几天和朋友讨论11g在向有数据的表中增加带有默认值的字段时,什么情况下不改表的数据只改数据字典,今天整理下。以下是实验过程,数据库版本是11.2.0.4.0,先创建张大表用做测试。
SQL> create table chgshs.t_add_test tablespace TS_BSC as select * from dba_objects; Table created. SQL> insert into chgshs.t_add_test select * from chgshs.t_add_test; 111785 rows created. SQL> / 223570 rows created. SQL> / 447140 rows created. SQL> / 894280 rows created. SQL> / 1788560 rows created. SQL> / 3577120 rows created. SQL> / 7154240 rows created. SQL> / 14308480 rows created. SQL> / 28616960 rows created. SQL> commit; Commit complete. SQL> select count(*) from chgshs.t_add_test; COUNT(ADDCOL) ------------- 57233920 SQL> select bytes/1024/1024/1024 from dba_segments where segment_name ='T_ADD_TEST'; BYTES/1024/1024/1024 -------------------- 6.4375
先向测试表增加一个没有非空约束的含有默认值的字段,看看是否修改表的数据。
SQL> set timing on SQL> alter table chgshs.t_add_test add addcol varchar2(10) default 'ADD'; Table altered. Elapsed: 00:05:13.63 SQL> select count(addcol) from chgshs.t_add_test; COUNT(ADDCOL) ------------- 57233920
以上所见,增加一个没有非空约束的含有默认值的字段,需要5分钟以上,可以判断这个操作是修改了表中的数据,将默认值直接修改到表的记录上了。下面在试试增加一个含有非空约束的带有默认值的字段是不是也这样。
SQL> alter table chgshs.t_add_test add addcolumn varchar2(10) default 'ADDCOL' not null; Table altered. Elapsed: 00:00:00.09 SQL> select count(addcolumn) from chgshs.t_add_test; COUNT(ADDCOLUMN) ---------------- 57233920
可见,增加一个非空的默认值字段,只需要不到0.1秒,也就是说11g只有增加带有非空约束条件的默认值字段才会只更新数据字典而不修改表的数据。那么既然只修改数据字典,表上的数据并没有修改,那么,将这个非空条件的字段修改成可为空,会怎么样?会不会将默认值修改到表的数据中呢?请看下面的实验。
SQL> alter table chgshs.t_add_test modify ADDCOLUMN null; Table altered. Elapsed: 00:09:49.70 SQL> select count(ADDCOLUMN) FROM chgshs.t_add_test where ADDCOLUMN='ADDCOL'; COUNT(ADDCOLUMN) ---------------- 57233920 Elapsed: 00:00:12.89
可见,在将添加的有非空约束的带默认值的字段修改成可以为空状态,是需要将值修改到表的的数据上的。再将这个字段修改为非空,就会非常快了。
SQL> alter table chgshs.t_add_test modify ADDCOLUMN not null; Table altered. Elapsed: 00:00:00.01
可见,在增加含有默认值的字段时,只有非空约束的才会只更改数据字典,速度非常快,如果没有非空约束,就会修改表的数据,就会很慢。
[哨子]
2015-11-18 13:46