ORACLE 11g 新增了一个参数:deferred_segment_creation,从字面理解含义是段延迟创建,该参数取值范围是true和false,默认是true。具体是如果deferred_segment_creation为true,当新建表并且没有向其中插入数据的时候,这个表不会立即分配extent,即不占数据空间,只有insert数据后才分配空间,这样做可以节省少量的空间。如果deferred_segment_creation为false,那就和之前版本创建表一样,创建时即分配extent。 


一、问题提出
    如果deferred_segment_creation为默认值,当通过EXP命令来导出整个用户时,所有没有数据的表都导不出来。
二、问题分析
    1、新建表没有分配extent,在user_segments视图中必然查不到,但是在user_tables中是可以查到的。这样就可以找出哪些表是没有创建extent的:
        select * from user_tables where table_name not in (select segment_name from user_segments where segment_type = 'TABLE');

    2、通过alter table xxx allocate extent 语句立即为其分配extent:
        alter table t1 allocate extent (size 64k);


# cat a1 | awk  '{print "alter table "$1" allocate extent (size 64k);"}'^C
# cat a1 | head -10
ACCEPT_INFO
ACCT_FILE
ACCT_ITEM
ACCT_RECORD_INFO2
ACCT_RECORD_INFO3
ACCT_TRAN_ATTR
ACPT_DANG_VERI
ACPT_MATE_BILL
ACPT_PAY_MATU
ACPT_SIGN_MONEY
[root@zjtlcb ~]# cat a1 | awk  '{print "alter table "$1" allocate extent (size 64k);"}'
alter table ACCEPT_INFO allocate extent (size 64k);
alter table ACCT_FILE allocate extent (size 64k);
alter table ACCT_ITEM allocate extent (size 64k);
alter table ACCT_RECORD_INFO2 allocate extent (size 64k);
alter table ACCT_RECORD_INFO3 allocate extent (size 64k);
alter table ACCT_TRAN_ATTR allocate extent (size 64k);
alter table ACPT_DANG_VERI allocate extent (size 64k);
alter table ACPT_MATE_BILL allocate extent (size 64k);