Oracle 11g的Deferred Segment Creation


  本篇主要介紹Oracle 11g中推出的“延遲段創建”(Deferred Segment Creation)特性,以及當我們使用這種特性時,需要注意的問題。

  1)Deferred Segment Creation

  在Oracle中,“表空間(Tablespace)、段(Segment)、分區(Extent)和塊(Block)”是邏輯存儲結構的四個層次。對數據表而言,通常是由一個或者多個段對象(分區表)Segment組成。也就是說,在數據表創建的時刻,Oracle會創建一個數據段Segment對象與之對應。

  當Segment創建之后,Oracle空間管理機制會根據需要分配至少一個extent作為初始化。每個extent的大小需要根據不同tablespace進行配置。但是在11g之前,數據表的創建同時,就發生了空間Segment分配的過程。但是在Oracle 11g中,引入了Deferred Segment Creation特性。

  首先我們創建一個數據表justForTest,來觀察數據庫是否為此表分配segment。

SQL> create table justForTest(test1 varchar2(2));

Table created

  但是,對應的段segment對象,卻沒有創建出來,如下:

select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='JUSTFORTEST';
SEGMENT_NAME    BYTES       BLOCKS    EXTENTS
------------ ---------- ---------- ----------

  這就是在Oracle 11g中引入的延遲段生成。一個數據表,如果剛剛創建出來的時候沒有數據加入。Oracle是不會為這個對象創建相應的段結構,也就不會分配對應的空間。

  使用dbms_metadata抽取出數據表的DDL語句,可以發現端倪,如下:

CREATE TABLE "test"."JUSTFORTEST" 
   (    "TEST1" VARCHAR2(2)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "testNS";

  使用DDL語句可以獲取到創建數據表的所有語句參數,包括默認參數。其中,我們發現了一個在過去版本中沒有參數“SEGMENT CREATION DEFERRED”,該參數就表示在數據表創建中使用延遲段生成。

  2)Segment Creation

  那么,在什么時點上Oracle才會創建對象呢?只要插入一條數據到數據表中,無論是否commit,都會伴隨着Oracle對數據表段的創建操作。

 

SQL> insert into justForTest values('1');
 
1 row inserted
 
SQL> select segment_name, BYTES, BLOCKS, EXTENTS  from user_segments where segment_name='JUSTFORTEST';
 
SEGMENT_NAME    BYTES       BLOCKS    EXTENTS
------------ ---------- ---------- ----------
JUSTFORTEST     65536          8        1

 

  Oracle推出Deferred Segment Creation的出發點很單純,就是出於對象空間節省的目的。如果一個空表從來就沒有使用過,創建segment對象,分配空間是“不合算”的,所以提出推遲段創建的時間點。

 

  該功能的啟用在Oracle中是存在控制參數的。

SQL>  show parameter deferred_segment_creation;
 
NAME                                 TYPE        VALUE
-------------------------------    ----------- ------------------------------
deferred_segment_creation            boolean     TRUE

  當然,我們可以將deferred_segment_creation參數調為false,這樣調整后建的表都會立即分配空間,但是調整前的表都不會改變,調整方法如下:

alter system set deferred_segment_creation=false;

  3)Oracle 11g導出空表、少表的解決辦法

  如果deferred_segment_creation為true,那么數據庫中空表就不會立即分配extent,即不占數據空間,當我們使用exp導出數據庫的時候,這些空表也會無法導出。如果想把空表也一起導出,我們可以參考Oracle 11g導出空表、少表的解決辦法這篇文章。

 

參考資料:

http://blog.itpub.net/17203031/viewspace-711008

http://blog.itpub.net/751371/viewspace-702058

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM