pugna
全部博文(171)
分类: Oracle
2013-03-03 23:47:53
Oracle 11gR2的新特性:DEFERRED SEGMENT CREATION
今天在Oracle中创建了一个表之后,能在dba_tables中查询到其相关信息,而在dba_extents中却查不到。
以下为我所遇到的情况:
创建表demotab
SQL> CREATE table demotab( x number ) tablespace demo storage ( initial 1000k next 1000k );
Table created
在dba_tables中查询表demotab的initial_extent和next_extent
SQL> select t.table_name,t.initial_extent,t.next_extent from dba_tables t where t.table_name = 'DEMOTAB';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT
------------------------------ -------------- -----------
DEMOTAB 1024000 1024000
在dba_extents中查询表demotab的个数
SQL> select count(*) FROM dba_extents where segment_name = 'DEMOTAB';
COUNT(*)
----------
0
后来,无意中发现在dba_tables中表demotab有一个名为” SEGMENT_CREATED”的字段,且其值为”NO”。根据这个字段和其值的意思可知Oracle并没有为此表分配segments。
SQL> select t.table_name,t.initial_extent,t.next_extent,t.segment_created from dba_tables t where t.table_name = 'DEMOTAB';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT SEGMENT_CREATED
------------------------------ -------------- ----------- ---------------
DEMOTAB 1024000 1024000 NO
然后在网上查询到,这是11gR2的一个新特性:DEFERRED SEGMENT CREATION,即建立表的时候,一开始并没有直接分配存储空间。直接在字典中记录了数据结构。而只有当真正有数据的时候才分配空间。参考这里。
查看本数据库关于此特性的参数设置
SQL> show parameters deferred_segment_creation;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
那如果要创建表时立即分配segments怎么办呢?
在表定义结束后,紧跟SEGMENT CREATION IMMEDIATE语句即可(若使用SEGMENT CREATION DEFERRED则表示需要时再分配)。
SQL> CREATE table demotab2( x number ) SEGMENT CREATION IMMEDIATE tablespace demo storage ( initial 1000k next 1000k ) ;
Table created
SQL> select t.table_name,t.initial_extent,t.next_extent,t.segment_created from dba_tables t where t.table_name = 'DEMOTAB2';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT SEGMENT_CREATED
------------------------------ -------------- ----------- ---------------
DEMOTAB2 1024000 1024000 YES
SQL> select count(*) FROM dba_extents where segment_name = 'DEMOTAB2';
COUNT(*)
----------
16
还可以在session级别更改此参数。
SQL> alter session set deferred_segment_creation=false;
Session altered
当然,也可以在数据库级别更改此参数。
SQL> alter system set deferred_segment_creation=false scope=both;
System altered
2013-03-03 23:47