您的位置:首页 > 数据库 > Oracle

Oracle 11gR2 deferred segment creation 与 exp/imp 说明

2011-07-13 17:40 363 查看

一.deferredsegmentcreation说明

从Oracle11.2.0.1版本开始,Oracle又提供了一种新的空间分配方法:Create一个非分区表时,这个TableSegment并没有立刻创建,而是直到有第一行记录插入的时候才去创建这个Segment,这和我们以前的Segment的创建和空间分配方法是不一样.这样的段也被称为延迟段.

从11.2.0.2版本开始,增加了对分区表和LOB字段的支持。并且功能得到增强:

(1)既支持分区对象也支持非分区对象,同时对于分区表,新的segments创建时缺省的extentsize为8M,而不再是以前的64K。

(2)对于从11.2.0.2之前版本升级过来的系统,如果有emptytables,可以通过dbms_space_admin.drop_empty_segments过程清除这些segments.

(3)11.2.0.2中,truncate命令得到了一些增强,truncatetable中的"DROPALLSTORAGE"选项可以让你象删除extents一样删除segments.

(4)借助可以dbms_space_admin.materialize_deferred_segments可以实例化tables、partitions、anddependentobjectsforwhichsegmentcreationwasdeferred

Deferredsegment的优点:

(1)降低空间的开销:当一次创建成百上千个表时,因为很多表短时间内根本不会用到,所以可以节约大量的磁盘开销

(2)加快应用的部署:因为没有分配Segment,所以建表的时候仅仅是操作数据字典而已,不设计空间的分配,所以效率自然就高了很多。

以上内容From:http://tomszrp.itpub.net/post/11835/510259

注意:
ThisnewfeatureinnotapplicabletoSYSandtheSYSTEMusersasthesegmenttothetableiscreatedalongwiththetablecreation.

--该特性不适用SYS和SYSTEM用户

控制deferredsegment的参数是:DEFERRED_SEGMENT_CREATION,默认为true.

官网对这个参数的说明如下:

http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams073.htm#REFRN10307

DEFERRED_SEGMENT_CREATION

Property

Description

Parametertype

Boolean

Defaultvalue

true

Modifiable

ALTERSESSION,ALTERSYSTEM

Rangeofvalues

true|false

Basic

No

DEFERRED_SEGMENT_CREATIONspecifiesthesemanticsofdeferredsegmentcreation.Ifsettotrue,thensegmentsfortablesandtheirdependentobjects(LOBs,indexes)willnotbecreateduntilthefirstrowisinsertedintothetable.

--如果deferred_segment_creation设置为true,那么表的segments和相关的对象(索引,lobs)都会在insert之后才创建。

Beforecreatingasetoftables,ifitisknownthatasignificantnumberofthemwillnotbepopulated,thenconsidersettingthisparametertotrue.Thissavesdiskspaceandminimizesinstalltime.

--设置该参数的目的是为了减少对磁盘空间的占用和创建时间

二.Exp/imp与deferredsegment说明

在MOS上有2篇文档对这个问题进行了说明:[ID1178343.1]和[ID960216.1]。

当启用deferredsegment之后,如果有空表,在使用exp进行导出时,会报:EXP-00011:'TableName'doesnotexist。即空表不被导出。这个问题在11.2.0.2中已经修复。

Expdp/impdp对deferredsegment是支持的,在11gr2及后续的版本中尽量使用expdp/impdp.

如果想在创建表时就分配segment,可以使用如下SQL:

createtableb_tab(idnumber,textvarchar2(10))segmentcreationimmediate;

也可以通过修改deferred_segment_creation为false来禁用这个功能,修改只对以后创建的table生效。对于已经存在的table不受影响。

那么对于已经存在的空表,可是使用以下2个命令来手动的分配segment。

SQL>altertabletable_namemove;
Tablealtered.
OR
SQL>altertabletable_nameallocateextent;
Tablealtered.

或者直接向空表里insert一条数据。

三.测试

参考ThomasZhang的blog:

http://tomszrp.itpub.net/post/11835/520574

SQL>select*fromv$versionwhererownum=1;

BANNER

--------------------------------------------------------------------------------

OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-Production

SQL>showparameterdeferred_segment_creation

NAMETYPEVALUE

-----------------------------------------------------------------------------

deferred_segment_creationbooleanTRUE

SQL>createtablet1asselect*fromdba_users;

Tablecreated.

SQL>createtablet2asselect*fromdba_userswhere1=2;

Tablecreated.

SQL>createtablet3asselect*fromdba_userswhere1=2;

Tablecreated.

SQL>selecttable_namefromtabswheretable_namein('T1','T2','T3');

TABLE_NAME

------------------------------

T1

T2

T3

--TABSisasynonymforUSER_TABLES.

SQL>selectsegment_namefromuser_segmentswheresegment_namein('T1','T2','T3');

SEGMENT_NAME

--------------------------------------------------------------------------------

T1

--这里只有T1表分配了segment

SQL>selecttable_name

2fromtabst

3wherenotexists(selectsegment_namefromuser_segmentsswheres.segment_name=t.table_name);

TABLE_NAME

------------------------------

T3

T2

--查看未分配segment的table

--使用exp导出3张表

C:\Users\Administrator.DavidDai>expicd/icdtables=(t1,t2,t3)file='D:\temp.dmp';

Export:Release11.2.0.1.0-ProductiononWedJul1317:13:222011

Copyright(c)1982,2009,Oracleand/oritsaffiliates.Allrightsreserved.

Connectedto:OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-Production

WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

ExportdoneinZHS16GBKcharactersetandAL16UTF16NCHARcharacterset

AbouttoexportspecifiedtablesviaConventionalPath...

..exportingtableT135rowsexported

EXP-00011:ICD.T2doesnotexist

EXP-00011:ICD.T3doesnotexist

Exportterminatedsuccessfullywithwarnings.

--提示我们t2和t3表不存在

--手工分配segment。这里方法很多,insert一条数据,或者使用alter命令来操作。

--方法1使用allocateextent,这里我们只对t2操作

SQL>select'altertable'||table_name||'allocateextent(size64k);'

2fromtabst

3wherenotexists(selectsegment_namefromuser_segmentsswheres.segment_name=t.table_name);

'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT(SIZE64K);'

---------------------------------------------------------------------

altertableT3allocateextent(size64k);

altertableT2allocateextent(size64k);

SQL>altertableT2allocateextent(size64k);

Tablealtered.

--方法2,使用altertablemove

SQL>altertableT3move;

Tablealtered.

--确认segment分配情况

SQL>selectsegment_namefromuser_segmentswheresegment_namein('T1','T2','T3');

SEGMENT_NAME

--------------------------------------------------------------------------------

T1

T2

T3

--再次exp

C:\Users\Administrator.DavidDai>expicd/icdtables=(t1,t2,t3)file='D:\temp1.dmp';

Export:Release11.2.0.1.0-ProductiononWedJul1317:18:292011

Copyright(c)1982,2009,Oracleand/oritsaffiliates.Allrightsreserved.

Connectedto:OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-Production

WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

ExportdoneinZHS16GBKcharactersetandAL16UTF16NCHARcharacterset

AbouttoexportspecifiedtablesviaConventionalPath...

..exportingtableT135rowsexported

..exportingtableT20rowsexported

..exportingtableT30rowsexported

Exportterminatedsuccessfullywithoutwarnings.

在11.2.0.2中,deferredsegment可以使用增加的materialize_deferred_segments和drop_empty_segments来分配和dropsegment。因为手头没有11.2.0.2的环境,所以这部分测试可以参考ThomasZhang的blog。

相关语法如下:

--创建Table

SQL>CREATETABLEt(

2idNUMBER,

3cCLOB,

4CONSTRAINTt_pkPRIMARYKEY(id)USINGINDEXLOCAL

5)

6SEGMENTCREATIONDEFERRED

7PARTITIONBYHASH(id)PARTITIONS4;

--查看segment

SQL>SELECTsegment_name,segment_type,bytes,extents

2FROMuser_segments

3WHEREsegment_nameIN('T','T_PK')

4ORsegment_nameIN(SELECTsegment_name

5FROMuser_lobs

6WHEREtable_name='T')

7ORDERBY1,2;

--用materialize_deferred_segments对该分区表的segment进行实例化

SQL>BEGIN

2sys.dbms_space_admin.materialize_deferred_segments(

3schema_name=>'STUDY',

4table_name=>'T'

5);

6END;

7/

--用drop_empty_segments将空的segment删除

SQL>BEGIN

2dbms_space_admin.drop_empty_segments(

3schema_name=>'STUDY',

4table_name=>'T'

5);

6END;

7/

-------------------------------------------------------------------------------------------------------

Blog:http://blog.csdn.net/tianlesoftware
Email:dvd.dba@gmail.com

DBA1群:62697716(满);DBA2群:62697977(满)DBA3群:62697850(满)

DBA超级群:63306533(满);DBA4群:83829929DBA5群:142216823

DBA6群:158654907聊天群:40132017聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: