ITPub博客

首页 > 数据库 > Oracle > 11g_NotNull_Columns_with_Default_Values

11g_NotNull_Columns_with_Default_Values

原创 Oracle 作者:zhyuh 时间:2009-09-27 10:21:48 0 删除 编辑
先看以前版本中,增加有默认值的非空列有哪些影响。

准备环境。建表trans,插入10万条记录
SQL> create table trans (
cust_name varchar2(20),
trans_dt date,
trans_amt number(12,2),
store_id number(2)
)
/
Table created
.
SQL> declare
2 l_stmt varchar2(2000);
3 begin
4 for ctr in 1..100000 loop
5 l_stmt := 'insert into trans values ('||
6 ''''||dbms_random.string('U',20)||''','||
7 'sysdate - '||
8 round(dbms_random.value(1,365))||','||
9 round(dbms_random.value(1,99999999),2)||','||
10 round(dbms_random.value(1,99))||')';
11 dbms_output.put_line(l_stmt);
12 execute immediate l_stmt;
13 commit;
14 end loop;
15 end;
16 /
PL/SQL procedure successfully completed
[@more@]**********
* 10g
**********
SQL> select count(*) from dba_extents where segment_name='TRANS';
COUNT(*)
----------
39

SQL> select sid from v$mystat where rownum<2;
SID
----------
1107

SQL> alter table trans add col5 varchar2(20) default 'abcdefghijklmnopqrst' not null;
Table altered
Executed in 23.955 seconds

SQL> select count(*) from dba_extents where segment_name='TRANS';
COUNT(*)
----------
65

--another session
SQL> select * from v$transaction where addr=(select taddr from v$session where sid=1107);
USED_UBLK
----------
2134

可以看出,在10g中,
1. 表trans原先占用39个extents,增加col5后占用65个extents,多了26个(local management表空间,在extent数量达到一定级别以前每个extent大小都是一样的,被实验中每个extent大小我也确认过,确实都是一样的,128k)。
2. 增加col5这个操作用了近24秒钟。
3. 增加col5过程中,从另外一个session中观察到最多使用了2134个undo block。


**********
* 11g
**********
SQL> select count(*) from dba_extents where segment_name='TRANS';

COUNT(*)
----------
21

SQL> alter table trans add col5 varchar2(20) default 'abcdefghijklmnopqrst' not
null;
Table altered.
Elapsed: 00:00:00.63

SQL> select count(*) from dba_extents where segment_name='TRANS';
COUNT(*)
----------
21

在11g中,
1. 增加col5前后占用extent的数量没有变化。
2. 增加col5这个动作不到1秒钟就完成了。
3. 没有观察到undo的使用情况(时间太短来不及观察?其实是根本就没有使用undo tablespace)。

在11g中,对于原先的10万条记录,"add col5 varchar2(20) default 'abcdefghijklmnopqrst' not null"这个操作并没有把值'abcdefghijklmnopqrst'真正加到每条记录中,所以运行需要的时间很短,空间也没有什么变化。但是用户选取原先的纪录时,能不能看到新增加的列col5和值呢?能。Oracle会根据数据字典的定义给出col5的默认值。

这个新特性用到的时候还是很好的。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/207/viewspace-1027390/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 11g_DDL_Lock_Timeout
下一篇: 11g_Virtual_Columns
请登录后发表评论 登录
全部评论
  • 博文量
    233
  • 访问量
    2061863