當你安裝一個包含成千上萬的表和索引的應用時,如果每個表和索引都初始分配一個 10MB的初始
extent。你很快會意識到如果每個對象在建立時都要分配 10 MB的磁碟空間,則部署DDL需要花費大量的時間。你可能會想到讓
Oracle延遲每個對象的初始extent分配直到該表中實際插入記錄為止。
要延遲物件初始 segment的產生,唯一的方式就是使用
Oracle Database 11g R2。從 Oracle Database 11g R2以後,預設情況下,表(及其關聯的索引)的物理
extent分配會延遲到該表插入首條記錄時。
下面我們以一個簡單的小例子來說明這一新特性:
首先,我們建立一張表(不插入任何記錄):
SQL> create tabletest as select * from emp where 1=2;
Table created.
然後,我們查詢 USER_SEGMENTS和
USER_EXTENTS來驗證該表是否分配了物理的儲存空間:
SQL> selectcount(*) from user_segments where segment_name='TEST';
COUNT(*)
----------
0
SQL> selectcount(*) from user_extents where segment_name ='TEST';
COUNT(*)
----------
0
接下來我們往建立的 TEST表中插入一條記錄,驗證記錄插入後是否為該表分配儲存空間:
SQL> insert intotest select * from emp where rownum < 2;
1 row created.
SQL> selectcount(*) from user_extents where segment_name ='TEST';
COUNT(*)
----------
1
SQL> selectcount(*) from user_segments where segment_name='TEST';
COUNT(*)
----------
1
上面的行為與之前的 Oracle版本有很大區別。在之前的Oracle版本中,只要建立一個對象,就會為該對象分配初始化
segment及相應的 extent。Deferred segment generation同樣適用於分區表和分區索引。表在其初始記錄插入之前不會分配初始
extent空間。
從 Oracle Database 11g R2以後,對於在
local managed的資料表空間中建立的非分區堆表,其初始 segment會延遲到該表中的第一條記錄插入時建立。
Oracle 11g
R2 的新特性deferred segment creation:
在建立表對象時不會分配任何實體儲存體空間,直至該表插入首條記錄時才會分配初始 segment空間。這使得與之前的Oracle版本相比,在表中插入第一條記錄時的速度要稍顯得慢點,對於大多數情境,這種效能上的影響基本可以忽略。
將DEFERRED_SEGMENT_CREATION初始化參數設定為
FALSE可以禁用deferred segment creation特性。此參數的預設值為 TRUE。我們還可以在建立表時指定如下子句(新特性)來控制deferredsegment
creation的
行為:
SEGMENT CREATION IMMEDIATE and SEGMENT CREATION DEFERRED
樣本如下:
create table f_regs(
reg_id number
,reg_namevarchar2(2000))
segment creationimmediate;
注意要使用SEGMENTCREATION
DEFERRED子句,必須將 COMPATIBLE參數設定為11.2.0.0.0及以上版本。
轉載請註明作者出處及原文連結,否則將追究法律責任:
作者:xiangsir
原文連結:http://blog.csdn.net/xiangsir/article/details/9063657
QQ:444367417
MSN:xiangsir@hotmail.com