一. deferred segment creation 說明
從Oracle 11.2.0.1版本開始,Oracle又提供了一種新的空間分配方法: Create一個非分區表時,這個Table Segment並沒有立刻建立, 而是直到有第一行記錄插入的時候才去建立這個Segment,這和我們以前的Segment的建立和空間分配方法是不一樣.這樣的段也被稱為延遲段.
從11.2.0.2版本開始,增加了對分區表和LOB欄位的支援。並且功能得到增強:
(1)既支援分區對象也支援非分區對象,同時對於分區表,新的segments建立時預設的extent size為8M,而不再是以前的64K。
(2)對於從11.2.0.2之前版本升級過來的系統,如果有empty tables,可以通過dbms_space_admin.drop_empty_segments 過程清除這些segments.
(3) 11.2.0.2中,truncate 命令得到了一些增強, truncate table中的"DROP ALL STORAGE" 選項可以讓你象刪除extents一樣刪除segments.
(4)藉助可以dbms_space_admin.materialize_deferred_segments可以執行個體化tables、partitions、and dependent objects for whichsegment creation was deferred
Deferred segment 的優點:
(1)降低空間的開銷:當一次建立成百上千個表時,因為很多表短時間內根本不會用到,所以可以節約大量的磁碟開銷
(2)加快應用的部署:因為沒有分配Segment,所以建表的時候僅僅是操作資料字典而已,不設計空間的分配,所以效率自然就高了很多。
以上內容From:http://tomszrp.itpub.net/post/11835/510259
注意:
Thisnew feature in not applicable to SYS and the SYSTEM users as the segment to thetable is created along with the table creation.
--該特性不適用SYS 和 SYSTEM 使用者
控制deferred segment 的參數是: DEFERRED_SEGMENT_CREATION,預設為true.
官網對這個參數的說明如下:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams073.htm#REFRN10307
DEFERRED_SEGMENT_CREATION
Property |
Description |
Parameter type |
Boolean |
Default value |
true |
Modifiable |
ALTER SESSION, ALTER SYSTEM |
Range of values |
true | false |
Basic |
No |
DEFERRED_SEGMENT_CREATIONspecifies the semantics of deferred segment creation. Ifset to true, then segments for tables and their dependent objects (LOBs,indexes) will not be created until the first row is inserted into the table.
--如果deferred_segment_creation 設定為true,那麼表的segments和相關的對象(索引,lobs)都會在insert 之後才建立。
Beforecreating a set of tables, if it is known that a significant number of them willnot be populated, then consider setting this parameter to true. This saves disk space and minimizes install time.
--設定該參數的目的是為了減少對磁碟空間的佔用和建立時間
二. Exp/imp與deferred segment 說明
在MOS 上有2篇文檔對這個問題進行了說明:[ID1178343.1] 和 [ID960216.1]。
當啟用deferred segment 之後,如果有空表,在使用exp進行匯出時, 會報:EXP-00011: 'Table Name' does not exist。即空表不被匯出。 這個問題在11.2.0.2 中已經修複。
Expdp/impdp對deferred segment是支援的,在11gr2及後續的版本中盡量使用expdp/impdp.
如果想在建立表時就分配segment,可以使用如下SQL:
createtable b_tab (id number, text varchar2(10)) segment creation immediate;
也可以通過修改deferred_segment_creation 為false 來禁用這個功能,修改只對以後建立的table 生效。 對於已經存在的table不受影響。
那麼對於已經存在的空表,可是使用以下2個命令來手動的分配segment。
SQL>alter table table_name move;
Table altered.
OR
SQL> alter table table_nameallocate extent;
Table altered.
或者直接向空表裡insert一條資料。
三. 測試
參考Thomas Zhang 的blog:
http://tomszrp.itpub.net/post/11835/520574
SQL> select * from v$version whererownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - Production
SQL> show parameterdeferred_segment_creation
NAME TYPE VALUE
----------------------------------------------- ------------------------------
deferred_segment_creation boolean TRUE
SQL> create table t1 as select * fromdba_users;
Table created.
SQL> create table t2 as select * from dba_userswhere 1=2;
Table created.
SQL> create table t3 as select * fromdba_users where 1=2;
Table created.
SQL> select table_name from tabs where table_namein ('T1','T2','T3');
TABLE_NAME
------------------------------
T1
T2
T3
--TABS is a synonym for USER_TABLES.
SQL> select segment_name fromuser_segments where segment_name in ('T1','T2','T3');
SEGMENT_NAME
--------------------------------------------------------------------------------
T1
-- 這裡只有T1 表分配了segment
SQL> select table_name
2 from tabs t
3 where not exists (select segment_name from user_segments swhere s.segment_name=t.table_name);
TABLE_NAME
------------------------------
T3
T2
--查看未分配segment的table
--使用exp 匯出3張表
C:\Users\Administrator.DavidDai>expicd/icd tables=(t1,t2,t3) file='D:\temp.dmp';
Export: Release 11.2.0.1.0 - Production onWed Jul 13 17:13:22 2011
Copyright (c) 1982, 2009, Oracle and/or itsaffiliates. All rights reserved.
Connected to: Oracle Database 11gEnterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Miningand Real Application Testing options
Export done in ZHS16GBK character set andAL16UTF16 NCHAR character set
About to export specified tables viaConventional Path ...
. . exporting table T1 35 rows exported
EXP-00011: ICD.T2 doesnot exist
EXP-00011: ICD.T3 doesnot exist
Export terminated successfully withwarnings.
--提示我們t2 和 t3表不存在
--手工分配segment。 這裡方法很多,insert一條資料,或者使用alter 命令來操作。
--方法1 使用allocateextent,這裡我們只對t2 操作
SQL> select 'alter table'||table_name||' allocate extent(size 64k);'
2 from tabs t
3 where not exists (selectsegment_name from user_segments s where s.segment_name=t.table_name);
'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT(SIZE64K);'
---------------------------------------------------------------------
alter table T3 allocate extent(size 64k);
alter table T2 allocate extent(size 64k);
SQL> alter table T2 allocate extent(size64k);
Table altered.
--方法2,使用altertable move
SQL> alter table T3 move;
Table altered.
--確認segment分配情況
SQL> select segment_name fromuser_segments where segment_name in ('T1','T2','T3');
SEGMENT_NAME
--------------------------------------------------------------------------------
T1
T2
T3
--再次exp
C:\Users\Administrator.DavidDai>expicd/icd tables=(t1,t2,t3) file='D:\temp1.dmp';
Export: Release 11.2.0.1.0 - Production onWed Jul 13 17:18:29 2011
Copyright (c) 1982, 2009, Oracle and/or itsaffiliates. All rights reserved.
Connected to: Oracle Database 11gEnterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Miningand Real Application Testing options
Export done in ZHS16GBK character set andAL16UTF16 NCHAR character set
About to export specified tables via ConventionalPath ...
. . exporting table T1 35 rows exported
. . exporting table T2 0 rows exported
. . exporting table T3 0 rows exported
Export terminated successfully withoutwarnings.
在11.2.0.2 中,deferred segment可以使用增加的materialize_deferred_segments和drop_empty_segments 來分配和drop segment。 因為手頭沒有11.2.0.2的環境,所以這部分測試可以參考Thomas Zhang的blog。
相關文法如下:
--建立Table
SQL> CREATE TABLE t (
2 id NUMBER,
3 c CLOB,
4 CONSTRAINT t_pk PRIMARY KEY(id) USING INDEX LOCAL
5 )
6 SEGMENT CREATION DEFERRED
7 PARTITION BY HASH(id)PARTITIONS 4;
--查看segment
SQL> SELECT segment_name, segment_type,bytes, extents
2 FROM user_segments
3 WHERE segment_name IN('T','T_PK')
4 OR segment_name IN (SELECTsegment_name
5 FROM user_lobs
6 WHEREtable_name = 'T')
7 ORDER BY 1,2;
--用materialize_deferred_segments對該分區表的segment進行執行個體化
SQL> BEGIN
2 sys.dbms_space_admin.materialize_deferred_segments(
3 schema_name => 'STUDY',
4 table_name => 'T'
5 );
6 END;
7 /
--用drop_empty_segments將空的segment刪除
SQL> BEGIN
2 dbms_space_admin.drop_empty_segments(
3 schema_name => 'STUDY',
4 table_name => 'T'
5 );
6 END;
7 /
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請