Oracle9i數據庫在內部特性方面有著非常大的增強,其中一個最令Oracle DBA興奮的莫過於可以動態設置全部的Oracle SGA控制參數。與8i不同的是,原來都將初始化參數放到一個文本文件中,並且在數據庫啟動的時候讀取,Oracle9i卻可以通過ALTER DATABASE和ALTER SYSTEM命令復位全部的Oracle參數。
在9i前,如果想對Oracle數據庫的處理模式作一些改變的話,Oracle管理員必須關閉數據庫並且重新設置INIT.ORA文件中的參數,然後重新啟動數據庫。對於白天使用OLTP模式運作,晚上切換到數據倉庫模式的Oracle數據庫來說,這種重新設置是經常做的。
對於需要停止和重新啟動Oracle數據庫來修改參數來說,Oracle9i在這方面有明顯的加強,它令實現數據庫連續可用的目標變得更加簡單。
這種可以在Oracle SGA中動態增加和縮小不同區域的能力為Oracle數據庫管理員提供了一些令人激動的新特性。SGA每個區域的數據庫活動都可以獨立地被監視,而且也可以在Oracle數據庫中,根據使用的模式分配和取回資源。
我們首先來看以下Oracle9i數據庫和Oracle8i數據庫的一些區別。Oracle9i的一個最重要的加強是對於連接到Oracle數據庫的全部專用連接,都無需要擁有一個獨立的PGA空間。在Oracle8i中,對於專用的Oracle連接,我們都需要在內存中分配一個獨立的區域,稱為Program Global Area或者PGA。PGA空間中包含有SORT_AREA_SIZE和額外的RAM控制結構以用來維護連接任務的狀態。在Oracle9i中,PGA空間已經被Oracle SGA中的一個新內存空間代替,它是通過PGA_AGGREGATE_TARGET參數來設置的(見圖1)。
*********圖一************
(Oracle8i與Oracle9i在內存分配上的區別)
由於全部的內存使用都在Oracle SGA中分配,所以Oracle數據庫管理員可以將分配給Oracle服務器的內存加大,可以分配至直到Orace服務器全部內存的80%。Oracle建議將服務器其余的20%內存保留給操作系統的任務。
當用戶連接到Oracle9i數據庫時,排序工作所需要的內存將會在Oracle9i的PGA_AGGREGATE_TARGET區域中分配。這可以令Oracle9i比Oracle8i跑得更快,這是由於內存只在需要的期間才分配,並且在完成後就可以馬上釋放給其它連接的Oracle任務使用。
動態修改SGA區域
由於Oracle管理員現在可以增加和減少SGA的全部區域,因此我們可以快速地查看一下SGA區域是怎樣的,這樣我們就可以知道Oracle DBA如何監視這些區域的使用並且為Oracle數據庫更有效地重新分配內存。SGA的區域可以分為以下的部分。
數據緩沖(Data buffers)--Oracle9i擁有多達7個獨立的數據緩沖來保存磁盤送來的數據塊。這些包含有傳統的KEEP pool,RECYCLE pool和DEFAULT pool,還有為每個Oracle數據庫支持的塊大小(2K, 4K, 8K, 16K和32K) 而建立的獨立數據緩沖池(見圖2)。
圖2 獨立的Oracle9i數據緩沖
我們可以監視這7個數據緩沖區域的命中率,如果緩沖的命中率保持在百分之九十以上,我們可以減少分配給這些數據緩沖的內存,並且將它們重新分配給其它Oracle實例中需要額外內存的地方。
當數據緩沖的命中率(DBHR)下降時,我們可以將內存由一個數據緩沖中分離出來,並且將它重新分配給其它的數據緩沖(如圖3所示)。
圖3 在Oracle9i的數據緩沖之間重新分配內存
共享池(Shared pool)--Oracle9i的共享池有一個很重要的作用是分析和執行Oracle SQL語句。低的library cache命中率表示分配給library cache的內存不足,當shared pool需要對SQL語句進行大量的分析和執行時,Oracle9i的數據庫管理員可以使用ALTER SYSTEM來為shared pool加入額外的內存。
PGA區域--分配給PGA_AGGREGATE_TARGET的內存是用來讓Oracle連接維護與連接相關的信息(例如游標的狀態),並且對SQL的結果集進行排序。
Log buffer--對於Oracle redo log緩沖是否有大量活動,我們可以在log switch(日志轉換)的頻率上看出來。Oracle管理員可以監視redo log區域的活動,並且在Oracle數據庫需要額外的內存為原始的緩沖區域服務時,動態地增加內存。