Oracle9i的自動分段空間管理改善了分段儲存的本質

tolywang發表於2005-04-19

                  為了保持其最強大和最靈活資料庫的地位,Oracle在最近釋出的幾個版本里一直都在建立新的機制來對錶格和索引的儲存進行簡化和分塊。從Oracle8i開始,Oracle開始在tablespace內部將物件管理進行自動化。第一個增強的地方原來叫做本地管理tablespace(或者簡寫作LMT)。在LMT裡,Oracle將tablespace裡的資訊從資料字典的表格空間裡移出去,而直接將其儲存到tablespace自身裡。這在Oracle9i裡已經成為了一個事實的標準,因為它減輕了資料字典的負擔。


   
  
  表格空間的第二個主要增強的是自動分段空間管理(ASSM),它首次出現在Oracle9i裡。有了ASSM,連結列表freelist被點陣圖所取代,它是一個二進位制的陣列,能夠迅速有效地管理儲存擴充套件和剩餘區塊(free block),因此能夠改善分段儲存本質。
  
  管理空間的兩種方法
  
  讓我們從比較這兩種空間管理開始:
  
  本地管理tablespace(LMT)——LMT是透過把EXTENT MANAGEMENT LOCAL子句新增到tablespace的定義句法而實現的。和原來由字典管理的tablespace(DMT)不同,LMT會將擴充套件管理自動化,並保持Oracle DBA不會被用來指定管理擴充套件大小的NEXT儲存引數。這個原則唯一的例外是在NEXT和MINEXTENTS一起用在表格建立的時候。
  自動區段空間管理(ASSM)——ASSM的tablespace是透過將SEGMENT SPACE MANAGEMENT AUTO子句新增到tablespace的定義句法裡而實現的。透過使用點陣圖freelist取代傳統單向的連結列表freelist,ASSM的tablespace會將freelist的管理自動化,並取消為獨立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS儲存引數的能力。
  
  Oracle值得讚揚的地方是,這兩個空間管理的方法都是可選的特性,而且Oracle的老手可能仍會使用更加詳細的方法,只要他們願意的話。要注意,點陣圖區段管理在Oracle9i裡是可選的,而且只能在tablespace這一層實現,這一點是十分重要的。原有的系統還能夠繼續使用傳統方法來管理freelist。
  點陣圖freelist挑戰傳統的空間管理
  在我討論點陣圖freelist和傳統的空間管理之前,讓我們看看點陣圖freelist是如何實現的。我會從使用區段空間管理自動引數建立tablespace開始:
  
  
    
    create tablespace
      asm_lmt_ts
    datafile
      'c:oracleoradatadiogenesasm_lmt.dbf'
    size
      5m
    EXTENT MANAGEMENT LOCAL    -- Turn on LMT
    SEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM
    ;
    
  
  
  一旦你定義好了tablespace,那麼表格和索引就能夠使用各種方法很容易地被移動到新的tablespace裡。下面就是我進行建立的程式碼:
  
    
    create table
      new_cust
    tablespace
      assm_lmt_ts
    as
      select * from customer;
    
    alter index cust_name_idx rebuild tablespace assm_lmt_ts;
    
   
   
  
  要注意,當表格或者索引被分配到這個tablespace以後,用於獨立物件的PCTUSED的值會被忽略,而Oracle9i會使用點陣圖陣列來自動地管理tablespace裡表格和索引的freelist。對於在LMT的tablespace內部建立的表格和索引而言,這個NEXT擴充套件子句是過時的,因為由本地管理的tablespace會管理它們。但是,INITIAL引數仍然是需要的,因為Oracle不可能提前知道初始表格載入的大小。對於ASSM而言,INITIAL最小的值是三個區塊。
  
  關於一個萬能的方法對於Oracle來說是否是最好的方法還有一些爭論。在大型資料庫裡,單獨的物件設定會帶來效能和儲存上的巨大不同。
  PCTFREE的問題
  
   
  
  PCTFREE引數是用來指定資料塊剩餘空間大小的,這一空間為將來資料行的擴充套件而保留。如果PCTFREE設定得不得當,SQL的更新宣告就可能導致大量的資料行碎片和斷鏈。
  
  資料行在剛儲存的時候還很小,而在後來進行了擴充套件,在這種情況下,PCTFREE的設定就顯得尤其重要了。在這樣的系統裡,通常會把PCTFREE設定成等於95,這就告訴Oracle要為資料行今後的擴充套件保留95%的資料區段空間。
  
  
  
  PCTUSED的問題
  
  對PCTUSED不正確的設定(例如設得太小了)會導致SQL插入宣告效能的急劇下降。如果資料區塊剩餘空間不是很多,那麼在SQL插入操作的過程中就會產生過量的I/O,這是因為被重新使用的Oracle資料區塊會被迅速地填滿。從極端的角度來看,沒有正確地設定PCTUSED會導致資料區塊的剩餘空間要比表格資料行的平均長度小。在這樣的情況下,Oracle會五次嘗試從freelist鏈取回區塊。在五次嘗試以後,Oracle會提升表格的水位,併為插入操作騰出五個新的資料塊。
  
  有了Oracle9i的ASSM,PCTUSED就不再控制表格資料塊的重新連結闕值了,但是你必須依靠Oracle的判斷來確定區塊在什麼時候會有足夠的剩餘空間放置到freelist裡。
  
  儘管有了本地管理的tablespace和ASSM之後Oracle9i會忽略PCTUSED、FREELISTS和FREELIST GROUPS等引數,但是當它們用於表格定義的時候,Oracle還是不會給出錯誤資訊:
  
  
    
    SQL> create table
    2 test_table
    3 (c1 number)
    4 tablespace
    5 asm_test
    6 pctfree 20 pctused 30
    7 storage
    8 ( freelists 23 next 5m ) ;
    Table created.
   
  
  
  如果你不記得帶有ASSM的本地管理tablespace會略掉任何為PCTUSED、NEXT和FREELISTS所指定的值的話,這將是一個十分嚴重的問題。.
  
  使用ASSM的一個巨大優勢是,點陣圖freelist肯定能夠減輕緩衝區忙等待(buffer busy wait)的負擔,這個問題在Oracle9i以前的版本里曾是一個嚴重的問題。現在讓我們來仔細看看這個特性。
  緩衝區不再忙等待
  在沒有多個freelist的時候,每個Oracle表格和索引在表格的頭部都曾有一個資料塊,用來管理物件所使用的剩餘區塊,併為任何SQL插入宣告所建立的新資料行提供資料塊。當資料緩衝內的資料塊由於被另一個DML事務處理鎖定而無法使用的時候,緩衝區忙等待就會發生。當你需要將多個任務插入到同一個表格裡的時候,這些任務就被強制等待,而同時Oracle會在同時分派剩餘的區塊,一次一個。
  
  有了ASSM之後,Oracle宣稱顯著地提高了DML併發操作的效能,因為(同一個)點陣圖的不同部分可以被同時使用,這樣就消除了尋找剩餘空間的序列化。根據Oracle的測試結果,使用點陣圖freelist會消除所有分段頭部(對資源)的爭奪,還能獲得超快的併發插入操作(圖A)。
  
  圖A
    
  Oracle公司對使用點陣圖freelist進行SQL插入操作的測試結果
  
  ASSM的侷限性
  儘管ASSM顯示出了令人激動的特性並能夠簡化Oracle DBA的工作,但是Oracle9i的點陣圖分段管理還是有一些侷限性的:
  
  一旦DBA被分配之後,它就無法控制tablespace內部的獨立表格和索引的儲存行為。
  大型物件不能夠使用ASSM,而且必須為包含有LOB資料型別的表格建立分離的tablespace。
  你不能夠使用ASSM建立臨時的tablespace。這是由排序時臨時分段的短暫特性所決定的。
  只有本地管理的tablespace才能夠使用點陣圖分段管理。
  使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的時候可能會出現效能上的問題。
  
 

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

相關文章