天天看點

如何保持Oracle資料庫優良性能

Oracle資料庫以其高可靠性、安全性、可相容性,得到越來越多的企業的青睐。如何使Oracle資料庫保持優良性能,這是許多資料庫管理者關心的問題,根據筆者經驗建議不妨針對以下幾個方面加以考慮。  

  一、分區

  根據實際經驗,在一個大資料庫中,資料空間的絕大多數是被少量的表所占有。為了簡化大型資料庫的管理,改善應用的查詢性能,一般可以使用分區這種手段。所謂分區就是動态表中的記錄分離到若幹不同的表空間上,使資料在實體上被分割開來,便于維護、備份、恢複、事務及查詢性能。當使用的時候可建立一個連接配接所有分區的視圖,使其在邏輯上仍以一個整體出現。   

  1.建立分區表   

  Create table Employee(

  EmpNo varchar2(10) primary key,

  Name varchar2(30),

  DeptNo Number(2)

  )

  Partition by range(DeptNo)

  (partition PART1 values less than (11)

  tablespace PART1_TS,

  partition PART2 values less than(21)

  tablespace PART2_TS,

  partition PART3 valuse less than(31)

  tablespace PART3_TS

  partition PART4 values less than(MAXVALUE)

  tablespace PART4_TS

  );

  表Employee依據DeptNo列進行分區。   

  2.分區索引   

  Create index Employee_DeptNo on Employee (DeptNo)local(

  partition PART1 tablespace PART1_NDX_TS,

  partition PART2 tablespace PART2_NDX_TS,

  partition PART3 tablespace PART3_NDX_TS,

  partition PART4 tablespace PART4_NDX_TS,

  當分區中出現許多事務并且要保證所有分區中的資料記錄的惟一性時采用全局索引,在建立全局索引時,Global子句允許指定索引的範圍值,這個範圍值可以不同于表分區的範圍值。隻有建立局部索引才會使索引分區與表分區間建立起一一對應關系。是以,在大多數情況下,應該使用局部索引分區。若使用了此索引,分區就能夠很容易地将索引分區與表分區建立關聯,局部索引比全局索引更易于管理。 

  3.分區管理

  根據實際需要,還可以使用Alter table指令來增加、删除、交換、移動、修改、重命名、劃分、截短一個已存在分區的結構。

二、重建索引

  如果表中記錄頻繁地被删除或插入,盡管表中的記錄總量保持不變,索引空間的使用量會不斷增加。雖然記錄從索引中被删除,但是該記錄索引項的使用空間不能被重新使用。是以,如果表變化不定,索引空間量會不斷增加,不論表中記錄數量是否增加,隻是因為索引中無效空間會增加。

  要回收那些曾被删除記錄使用的空間,需要使用Alter index rebuild指令。可以做一個定期運作的批處理程式,來重建最活動表的索引。這個批處理程式可以在空閑時運作,以避免該程式與其他應用程式沖突。若能堅持索引的這一程式規劃,便可以及時回收那些未使用空間,提高空間使用率。  

  三、段的碎片整理

  當生成一個資料庫對象時(一個表或一個索引),通過使用者預設值或指定值來為它指定表空間。一個在表空間中生成的段,用于存儲對象的相關資料。在段被關閉、收縮、截斷之前,段所配置設定的空間将不被釋放。

  一個段是由範圍組成,而範圍是由相鄰的Oracle塊組成。一旦存在的範圍不能再存儲新的資料,這個段就會去獲得新的範圍,但并不要求這些範圍是彼此相鄰的。這樣的擴充會一直繼續下去,直到表空間中的資料檔案不能提供更多的自由空間,或者範圍數量已達到極限。    

  是以,一個碎片太多的資料段,不僅會影響運作,也會引發表空間中的空間管理問題。是以,每個資料段隻含有一個範圍是十分有益的。借助監控系統,可以通過檢查DBA_SEGMENTS資料字典視圖來了解哪些資料庫對象含有10個或更多範圍的段,确定其資料段碎片。

  若一個段的碎片過多,可用兩種方法解決:

  1. 用正确的存儲參數建立一個新表,将舊表中的資料插入到新表中,再删除舊表;

  2. 利用Export/Import工具。   

  如:exp system/manager file=exp.dmpcompress=Y grants=Y indexes=Y

  tables=(T1,T2)

  若輸出成功,進入Oracle,删除上述表。

  注:compress=Y表示将在輸出過程中修改它們的存儲參數。

  imp system/manager file=exp.dmp commit=Y buffer=64000 full=Y   

  四、自由範圍的碎片整理

  表空間中的一個自由範圍是表空間中相連的自由(空間)塊的集合。當一個段關閉時,它的範圍将被釋放,并被标記為自由範圍。然而,這些自由範圍再也不能與相鄰的自由範圍合并,它們之間的界線始終存在。但是當表空間的預設值pctincrease設定不是0時,SMON背景程序會定期将這些相鄰的自由範圍合作。若pctincrease設定為0,那麼相鄰自由範圍不會被資料庫自動合并。但可以使用Alter table指令"coalesce"選項,來強迫進行相鄰自由範圍的合并。

  不進行自由範圍合并,在日後的空間請求中,會影響到表空間中的空間配置設定。當需要一個足夠大的範圍時,資料庫并不會合并相鄰的自由範圍,除非沒有其他選擇。這樣,當表空間中前面較小的自由範圍已被使用時,将使用表空間中後面部分最大的一個自由範圍。結果,會因為沒有足夠多的使用空間,進而導緻表空間需求的沖突。由于這樣的情況出現,使資料庫的空間配置設定距理想越來越遠。自由空間碎片常會出現在那些經常關閉又重新生成的資料庫表和索引中。

  在理想的Oracle表空間中,每一個資料庫對象存儲在一個單獨的範圍中,并且所有有效自由空間集中在一個巨大而連續的範圍中。這樣,在一個對象需要附加存儲空間時,可以在增加擷取足夠大自由空間的可能性的同時,最小化空間中的循環調用,提高自由空間使用率。