Oracle 11gR2 deferred segment creation 與 exp/imp 說明

來源:互聯網
上載者:User
 一. 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資料表空間和資料檔案的關係,否則拒絕申請

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.