Oracle 11gr2 的新特性-延遲段建立

Jujay發表於2011-10-09
在Oracle 11gr2中建立表所採用的預設模式是延遲段建立(deferred segment creation),即create table時,不會分配任何儲存空間,要延遲到insert時才會真正建立段(segment),下面通過一個小例子來說明:
1. 11gr2之前:
1) 確認資料庫版本:
A105024@O02DMS1>select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
2) 建立測試表:
A105024@O02DMS1>create table test (id number);

Table created.

3) 檢視空間分配情況:
A105024@O02DMS1>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';
SEGMENT_NAME            EXTENTS     BLOCKS      BYTES
------------------------------------ ----------           ----------         ----------
TEST                                    1                     8                   65536

可以發現在11gr2之前,建立表的同時就已經為該表預設分配了一個8 block的segment。

2. 11gr2:
1) 確認資料庫版本:
A105024@O07DMS0>select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
2) 建立測試表:
A105024@O07DMS0>create table test (id number);

Table created.
3) 檢視空間分配情況:
A105024@O07DMS0>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';

no rows selected

可以發現在11gr2中,建立表並不為該表分配任何空間。
4) 插入資料:
A105024@O07DMS0>insert into test values(1);

1 row created.

5) 再次檢視空間分配情況:
A105024@O07DMS0>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';

SEGMENT_NAME        EXTENTS     BLOCKS      BYTES
-------------------------------------------- ---------- ----------
TEST                                  1                  128           1048576

可以看到知道第一個insert後,才真正為表分配空間。

11gr2中這樣做無非就是為了節省空間,不過本人倒是覺得這樣節省下來的空間很少,卻帶來了一些意想不到的壞處,比如我就曾碰到用exp/expdp無法匯出延遲段建立的表,導致用imp/impdp匯入時丟失了這些表的定義。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26277071/viewspace-708835/,如需轉載,請註明出處,否則將追究法律責任。

相關文章