文章詳情頁
Oracle9i自動分段空間管理改善分段存儲
瀏覽:155日期:2023-11-13 10:49:29
為了保持其最強大和最靈活數據庫的地位,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_tsdatafile 'c:oracleoradatadiogenesasm_lmt.dbf'size 5mEXTENT MANAGEMENT LOCAL -- Turn on LMTSEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM;一旦你定義好了tablespace,那么表格和索引就能夠使用各種方法很輕易地被移動到新的tablespace里。下面就是我進行創建的代碼: create table new_custtablespace assm_lmt_tsas 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 table2 test_table3 (c1 number)4 tablespace5 asm_test6 pctfree 20 pctused 307 storage8 ( 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等)的時候可能會出現性能上的問題。

排行榜