以下的文章主要介紹的是Oracle ASSM改善分段存儲,在實際的操作中我們為了保持其最為強大與最為靈活的相關數據庫地位,所以Oracle公司最近發布的幾個相關版本裡一直都在創建新的機制來對表格和索引的存儲進行簡化和分塊。
從Oracle8i開始,Oracle開始在tablespace內部將對象管理進行自動化。第一個增強的地方原來叫做本地管理tablespace(或者簡寫作LMT)。在LMT裡,Oracle將tablespace裡的信息從數據字典的表格空間裡移出去,而直接將其保存到tablespace自身裡。這在Oracle9i裡已經成為了一個事實的標准,因為它減輕了數據字典的負擔。
表格空間的第二個主要增強的是自動分段空間管理(ASSM),它首次出現在Oracle9i裡。有了OracleASSM,鏈接列表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,Oracle ASSM的tablespace會將freelist的管理自動化,並取消為獨立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存儲參數的能力。
Oracle值得贊揚的地方是,這兩個空間管理的方法都是可選的特性,而且Oracle的老手可能仍會使用更加詳細的方法,只要他們願意的話。要注意,位圖區段管理在Oracle9i裡是可選的,而且只能在tablespace這一層實現,這一點是十分重要的。原有的系統還能夠繼續使用傳統方法來管理freelist。
位圖freelist挑戰傳統的空間管理
在我討論位圖freelist和傳統的空間管理之前,讓我們看看位圖freelist是如何實現的。我會從使用區段空間管理自動參數創建tablespace開始:
- create tablespace
- asm_lmt_ts
- datafile
- 'c:\Oracle\oradata\diogenes\asm_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不可能提前知道初始表格加載的大小。對於OracleASSM而言,INITIAL最小的值是三個區塊。
關於一個萬能的方法對於Oracle來說是否是最好的方法還有一些爭論。在大型數據庫裡,單獨的對象設置會帶來性能和存儲上的巨大不同。