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:
注意:ThisnewfeatureinnotapplicabletoSYSandtheSYSTEMusersasthesegmenttothetableiscreatedalongwiththetablecreation.
--该特性不适用SYS和SYSTEM用户
控制deferredsegment的参数是:DEFERRED_SEGMENT_CREATION,默认为true.
官网对这个参数的说明如下:
DEFERRED_SEGMENT_CREATION
Property | Description |
Parametertype | Boolean |
Defaultvalue | true |
Modifiable | ALTERSESSION,ALTERSYSTEM |
Rangeofvalues | true|false |
Basic | No |
--如果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: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:
Email:dvd.dba@gmail.com
DBA1群:62697716(满);DBA2群:62697977(满)DBA3群:62697850(满)
DBA超级群:63306533(满);DBA4群:83829929DBA5群:142216823
DBA6群:158654907聊天群:40132017聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
相关文章推荐
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11gR2 deferred segment creation 与 exp/imp 说明
- Oracle 11g exp导出 deferred_segment_creation参数配置
- 11gr2 deferred segment and exp/imp
- Oracle 中deferred_segment_creation 的用法以及exp时解决办法
- Oracle EXP/IMP使用说明
- ORACLE EXP/IMP 说明
- ORACLE EXP/IMP 说明 .
- oracle 11g使用deferred_segment_creation 延迟段创建特性时遇到的问题总结
- ORACLE EXP/IMP 说明
- ORACLE EXP/IMP 说明
- ORACLE EXP/IMP 说明
- ORACLE EXP/IMP 说明
- Oracle 数据库导出(exp)导入(imp)说明
- Oracle Initialization Parameters:DEFERRED_SEGMENT_CREATION