Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1051224
  • 博文数量: 171
  • 博客积分: 55
  • 博客等级: 民兵
  • 技术积分: 2077
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 10:11
个人简介

pugna

文章分类

全部博文(171)

文章存档

2021年(4)

2020年(1)

2019年(4)

2018年(5)

2017年(7)

2016年(9)

2015年(36)

2014年(8)

2013年(96)

2012年(1)

分类: 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中查询表demotabinitial_extentnext_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
阅读(3145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~