熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫中利用ASSM改善分段存儲

2013-11-13 16:03:57  來源: Oracle 

  為了保持其最強大和最靈活數據庫的地位Oracle在最近發布的幾個版本裡一直都在創建新的機制來對表格和索引的存儲進行簡化和分塊從Oraclei開始Oracle開始在tablespace內部將對象管理進行自動化第一個增強的地方原來叫做本地管理tablespace(或者簡寫作LMT)在LMT裡Oracle將tablespace裡的信息從數據字典的表格空間裡移出去而直接將其保存到tablespace自身裡這在Oraclei裡已經成為了一個事實的標准因為它減輕了數據字典的負擔

  表格空間的第二個主要增強的是自動分段空間管理(ASSM)它首次出現在Oraclei裡有了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取代傳統單向的鏈接列表freelistASSM的tablespace會將freelist的管理自動化並取消為獨立的表格和索引指定PCTUSEDFREELISTS和FREELIST GROUPS存儲參數的能力

  Oracle值得贊揚的地方是這兩個空間管理的方法都是可選的特性而且Oracle的老手可能仍會使用更加詳細的方法只要他們願意的話要注意位圖區段管理在Oraclei裡是可選的而且只能在tablespace這一層實現這一點是十分重要的原有的系統還能夠繼續使用傳統方法來管理freelist

  位圖freelist挑戰傳統的空間管理

  在我討論位圖freelist和傳統的空間管理之前讓我們看看位圖freelist是如何實現的我會從使用區段空間管理自動參數創建tablespace開始

  create tablespace
    asm_lmt_ts
  datafile
    c:\oracle\oradata\diogenes\asm_lmtdbf
  size
    m
  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的值會被忽略而Oraclei會使用位圖數組來自動地管理tablespace裡表格和索引的freelist對於在LMT的tablespace內部創建的表格和索引而言這個NEXT擴展子句是過時的因為由本地管理的tablespace會管理它們但是INITIAL參數仍然是需要的因為Oracle不可能提前知道初始表格加載的大小對於ASSM而言INITIAL最小的值是三個區塊

  關於一個萬能的方法對於Oracle來說是否是最好的方法還有一些爭論在大型數據庫裡單獨的對象設置會帶來性能和存儲上的巨大不同
PCTFREE的問題

  PCTFREE參數是用來指定數據塊剩余空間大小的這一空間為將來數據行的擴展而保留如果PCTFREE設置得不得當SQL的更新聲明就可能導致大量的數據行碎片和斷鏈

  數據行在剛保存的時候還很小而在後來進行了擴展在這種情況下PCTFREE的設置就顯得尤其重要了在這樣的系統裡通常會把PCTFREE設置成等於這就告訴Oracle要為數據行今後的擴展保留%的數據區段空間

  PCTUSED的問題

  對PCTUSED不正確的設置(例如設得太小了)會導致SQL插入聲明性能的急劇下降如果數據區塊剩余空間不是很多那麼在SQL插入操作的過程中就會產生過量的I/O這是因為被重新使用的Oracle數據區塊會被迅速地填滿從極端的角度來看沒有正確地設置PCTUSED會導致數據區塊的剩余空間要比表格數據行的平均長度小在這樣的情況下Oracle會五次嘗試從freelist鏈取回區塊在五次嘗試以後Oracle會提升表格的水位並為插入操作騰出五個新的數據塊

  有了Oraclei的ASSMPCTUSED就不再控制表格數據塊的重新鏈接阙值了但是你必須依靠Oracle的判斷來確定區塊在什麼時候會有足夠的剩余空間放置到freelist裡

  盡管有了本地管理的tablespace和ASSM之後Oraclei會忽略PCTUSEDFREELISTS和FREELIST GROUPS等參數但是當它們用於表格定義的時候Oracle還是不會給出錯誤信息

  SQL> create table
   test_table
   (c number)
   tablespace
   asm_test
   pctfree pctused
   storage
   ( freelists next m ) ;
  Table created
  

  
    如果你不記得帶有ASSM的本地管理tablespace會略掉任何為PCTUSEDNEXT和FREELISTS所指定的值的話這將是一個十分嚴重的問題

  使用ASSM的一個巨大優勢是位圖freelist肯定能夠減輕緩沖區忙等待(buffer busy wait)的負擔這個問題在Oraclei以前的版本裡曾是一個嚴重的問題現在讓我們來仔細看看這個特性

  在沒有多個freelist的時候每個Oracle表格和索引在表格的頭部都曾有一個數據塊用來管理對象所使用的剩余區塊並為任何SQL插入聲明所創建的新數據行提供數據塊當數據緩沖內的數據塊由於被另一個DML事務處理鎖定而無法使用的時候緩沖區忙等待就會發生當你需要將多個任務插入到同一個表格裡的時候這些任務就被強制等待而同時Oracle會在同時分派剩余的區塊一次一個

  有了ASSM之後Oracle宣稱顯著地提高了DML並發操作的性能因為(同一個)位圖的不同部分可以被同時使用這樣就消除了尋找剩余空間的串行化根據Oracle的測試結果使用位圖freelist會消除所有分段頭部(對資源)的爭奪還能獲得超快的並發插入操作(圖A)

  =) windowopen(/sql/UploadFiles_//jpg); src= if(thiswidth > )thiswidth = ;if(thisheight > ) thisheight = ; border=>

  圖A Oracle公司對使用位圖freelist進行SQL插入操作的測試結果

  ASSM的局限性

  盡管ASSM顯示出了令人激動的特性並能夠簡化Oracle DBA的工作但是Oraclei的位圖分段管理還是有一些局限性的

  一旦DBA被分配之後它就無法控制tablespace內部的獨立表格和索引的存儲行為

  大型對象不能夠使用ASSM而且必須為包含有LOB數據類型的表格創建分離的tablespace

  你不能夠使用ASSM創建臨時的tablespace這是由排序時臨時分段的短暫特性所決定的

  只有本地管理的tablespace才能夠使用位圖分段管理

  使用超高容量的DML(例如INSERTUPDATE和DELETE等)的時候可能會出現性能上的問題


From:http://tw.wingwit.com/Article/program/Oracle/201311/17754.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.