当前位置: 首页 > Oracle, oracle 11g > 正文

oracle 11g的表增加带有默认值的字段什么情况下只改数据字典不改表

前几天和朋友讨论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

可见,在增加含有默认值的字段时,只有非空约束的才会只更改数据字典,速度非常快,如果没有非空约束,就会修改表的数据,就会很慢。

本文固定链接: https://www.dbdream.com.cn/2015/11/oracle-11g%e7%9a%84%e8%a1%a8%e5%a2%9e%e5%8a%a0%e5%b8%a6%e6%9c%89%e9%bb%98%e8%ae%a4%e5%80%bc%e7%9a%84%e5%ad%97%e6%ae%b5%e4%bb%80%e4%b9%88%e6%83%85%e5%86%b5%e4%b8%8b%e5%8f%aa%e6%94%b9%e6%95%b0%e6%8d%ae/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2015年11月13日发表在 Oracle, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: oracle 11g的表增加带有默认值的字段什么情况下只改数据字典不改表 | 信春哥,系统稳,闭眼上线不回滚!
关键字:

oracle 11g的表增加带有默认值的字段什么情况下只改数据字典不改表:目前有1 条留言

  1. 沙发
    shunzi:

    [哨子]

    2015-11-18 13:46 [回复]

发表评论

快捷键:Ctrl+Enter