本篇主要介紹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;
如果deferred_segment_creation為true,那么數據庫中空表就不會立即分配extent,即不占數據空間,當我們使用exp導出數據庫的時候,這些空表也會無法導出。如果想把空表也一起導出,我們可以參考Oracle 11g導出空表、少表的解決辦法這篇文章。
參考資料:
http://blog.itpub.net/17203031/viewspace-711008
http://blog.itpub.net/751371/viewspace-702058