Oracle9i的動態SGA特性(2)
SGA的閥值摘要
由下面的表一可以看到,在監視SGA的記憶體使用時,有幾個明顯的閥值可以利用。我們可以寫一些指令碼並在其中整合一些智慧,這樣就可以在處理的需求變化時重新設定SGA。
RAM Area Too-small Condition Too-Large Condition
Shared pool Library cache misses No misses
Data buffer cache Hit ratio < 90% Hit ratio > 95%
PGA aggregate high multi-pass executions 100% optimal executions
表1:SGA中的異常條件指示
檢視SGA記憶體區域的負載
Oracle9i使用了一些新的內部檢視或者在現有的檢視中加入新的列來幫助檢視Oracle9i中的內部記憶體分配情況。以下的新V$檢視可以幫助監視Oracle9i連線的記憶體使用。
V$PROCESS -在Oracle9i中加入了三個新的列以監視PGA記憶體的使用,新列的名字是pga_used_mem, pga_alloc_mem 和pga_max_mem。
V$SYSSTAT -加入了很多新的統計行,包括有area statistics for optimal, one-pass和multi-pass。
V$PGASTAT -該新檢視展示了全部後臺程式和專用連線的PGA記憶體使用
V$SQL_PLAN--這個新檢視包含了全部當前執行的SQL的執行計劃資訊。對於需要最最佳化的SQL語句的效能調整專家來說這是非常吸引人的。
V$WORKAREA -這個新檢視提供了Oracle9i連線的累積記憶體統計的詳細資訊。
V$WORKAREA_ACTIVE - 這個新的檢視提供了當前全部正在執行的SQL語句的內部記憶體使用資訊。
它們的目的是透過這些V$檢視來監視SGA中的記憶體使用,然後根據Oracle例項的處理要求,透過ALTER SYSTEM命令重新分配記憶體。我們以下來看一些這些新的Oracle9i特性和指令碼,它可以幫助我們檢視詳細的記憶體使用。
當然我們不可能在這裡詳述所有的技術,以下就讓我們看一個簡單的例子,它透過使用V$SYSSTAT檢視來決定何時重新設定PGA_AGGREGATE_TARGET引數。
以下的查詢可以得到自資料庫例項啟動後work areas被執行的全部數目和百分比。
work_area.sql
select
name profile,
cnt,
decode(total, 0, 0, round(cnt*100/total)) percentage
from
(
select
name,
value cnt,
(sum(value) over ()) total
from
v$sysstat
where
name like 'workarea exec%'
);
這個查詢的輸出可能如下:
PROFILE CNT PERCENTAGE
----------------------------------- ---------- ----------
workarea executions - optimal 5395 95
workarea executions - onepass 284 5
workarea executions - multipass 0 0
這個查詢的輸出是用來告訴DBA何時動態調整PGA_AGGREGATE_TARGET引數。在通常的情況下,如果multi-pass的執行大於0, 就需要增加PGA_AGGREGATE_TARGET的值,並且在optimal executions是100%時減少它的值。
我們還可以使用V$PGASTAT檢視來決定我們的Oracle例項的記憶體使用。V$PGASTAT檢視提供了PGA使用和自動記憶體管理的例項級摘要統計資訊。以下的指令碼提供了全部Oracle9i連線的整體記憶體使用的統計資訊。
以下是一個用來檢測Oracle9i中PGA記憶體使用的簡單指令碼。
check_pga.sql
column name format a30
column value format 999,999,999
select
name,
value
from
v$pgastat
;
The output of this query might look like the following:
NAME VALUE
------------------------------------------------------ ----------
aggregate PGA auto target 736,052,224
global memory bound 21,200
total expected memory 141,144
total PGA inuse 22,234,736
total PGA allocated 55,327,872
maximum PGA allocated 23,970,624
total PGA used for auto workareas 262,144
maximum PGA used for auto workareas 7,333,032
total PGA used for manual workareas 0
maximum PGA used for manual workareas 0
estimated PGA memory for optimal 141,395
maximum PGA memory for optimal 500,123,520
estimated PGA memory for one-pass 534,144
maximum PGA memory for one-pass
在上面的v$pgastat顯示中我們可以看到以下的統計。
Aggregate PGA auto target -該列給出了可用於Oracle9i連線的全部記憶體。我們已經提過,這個值是由PGA_AGGREGATE_TARGET設定的。
Global memory bound -該統計表示work area的最大值,Oracle建議在該統計值下降到1M時,你應該增加PGA_AGGREGATE_TARGET的值。
Total PGA allocated - 這個統計顯示了資料庫中全部PGA記憶體使用的高水位線。當使用增加時,你應該看到這個值接近PGA_AGGREGATE_TARGET的值。
Total PGA used for auto workareas - 這個統計監視記憶體的使用或者全部執行在自動記憶體模式中的全部連線。要記住的是,並不是全部的內部程式使用自動記憶體特性。例如,Java和PL/SQL 將分配記憶體,但是這部分將不會統計到這個值中。因此我們可使用整體PGA的值來減去該值,以得到連線和Java and PL/SQL使用的記憶體。
Estimated PGA memory for optimal/one-pass - 該統計估計optimal模式下執行全部的連線任務所需要的記憶體。要記住的是,如果Oracle9i遇到記憶體不足時,它就會呼叫multi-pass操 作。這個統計對於監視Oracle9i中的記憶體使用是非常重要的,大多數的Oracle DBA將會增加PGA_AGGREGATE_TARGET到這個值。
現在我們已經瞭解了這個概念,以下就讓我們來看一下自動重新配置SGA有哪些方法。
總述
在一個UNIX環境中,在處理需求改變時透過定時任務來修改記憶體配置是非常簡單的。例如,許多Oracle資料庫在一般的工作時間以OLTP模式運作,在晚上的時候則執行對記憶體需求很大的批次報告。
我們知道在一個OLTP資料庫中應該將DB_CACHE_SIZE設定為一個較大的值,而在需求記憶體很大的批次任務中則需要給PGA_AGGREGATE_TARGET分配額外的記憶體。
以下的UNIX指令碼可以用來重新設定OLTP和DSS的SGA值而無需將例項停下來。在這個例子中,我們假定有一個孤立的帶有8GB記憶體的的 Oracle伺服器。我們還假定保留20%的記憶體供UNIX使用,而剩下的6GB記憶體則用作Oracle和Oracle連線。這些指令碼是在HP/UX或者 Solaris中使用的,並且接受$ORACLE_SID作為一個引數。
DSS_CONFIG.KSH指令碼將在每晚的6:00 p.m執行,以重新設定Oracle在晚上執行對記憶體需求很大的批次任務。
dss_config.ksh
#!/bin/ksh
# First, we must set the environment . . . .
ORACLE_SID=$1
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
#ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
$ORACLE_HOME/bin/sqlplus -s /nologin
ALTER SYSTEM set db_cache_size=1500m;
ALTER SYSTEM set shared_pool_size=500m;
ALTER SYSTEM set pga_aggregate_target=400m;
exit
!
現在我們已經知道了一個常見的方式來修改Oracle的配置,我們也很容易地看到可以很簡單地開發一個技術來連續地監控Oracle的處理需求,並且根據現有的資料庫需求來使用ALTER SYSTEM作修改。
結論
雖然Oracle9i中的記憶體管理仍然需要很多的手工操作,不過大部分的Oracle管理員可以使用工具來連續地監控Oracle SGA中的記憶體使用,並且可以根據Oracle instance中現在的使用情況來自動地重新分配記憶體。這樣就可以令Oracle 管理員根據系統的變化來靈活地重新設定他們的系統。 [@more@]
由下面的表一可以看到,在監視SGA的記憶體使用時,有幾個明顯的閥值可以利用。我們可以寫一些指令碼並在其中整合一些智慧,這樣就可以在處理的需求變化時重新設定SGA。
RAM Area Too-small Condition Too-Large Condition
Shared pool Library cache misses No misses
Data buffer cache Hit ratio < 90% Hit ratio > 95%
PGA aggregate high multi-pass executions 100% optimal executions
表1:SGA中的異常條件指示
檢視SGA記憶體區域的負載
Oracle9i使用了一些新的內部檢視或者在現有的檢視中加入新的列來幫助檢視Oracle9i中的內部記憶體分配情況。以下的新V$檢視可以幫助監視Oracle9i連線的記憶體使用。
V$PROCESS -在Oracle9i中加入了三個新的列以監視PGA記憶體的使用,新列的名字是pga_used_mem, pga_alloc_mem 和pga_max_mem。
V$SYSSTAT -加入了很多新的統計行,包括有area statistics for optimal, one-pass和multi-pass。
V$PGASTAT -該新檢視展示了全部後臺程式和專用連線的PGA記憶體使用
V$SQL_PLAN--這個新檢視包含了全部當前執行的SQL的執行計劃資訊。對於需要最最佳化的SQL語句的效能調整專家來說這是非常吸引人的。
V$WORKAREA -這個新檢視提供了Oracle9i連線的累積記憶體統計的詳細資訊。
V$WORKAREA_ACTIVE - 這個新的檢視提供了當前全部正在執行的SQL語句的內部記憶體使用資訊。
它們的目的是透過這些V$檢視來監視SGA中的記憶體使用,然後根據Oracle例項的處理要求,透過ALTER SYSTEM命令重新分配記憶體。我們以下來看一些這些新的Oracle9i特性和指令碼,它可以幫助我們檢視詳細的記憶體使用。
當然我們不可能在這裡詳述所有的技術,以下就讓我們看一個簡單的例子,它透過使用V$SYSSTAT檢視來決定何時重新設定PGA_AGGREGATE_TARGET引數。
以下的查詢可以得到自資料庫例項啟動後work areas被執行的全部數目和百分比。
work_area.sql
select
name profile,
cnt,
decode(total, 0, 0, round(cnt*100/total)) percentage
from
(
select
name,
value cnt,
(sum(value) over ()) total
from
v$sysstat
where
name like 'workarea exec%'
);
這個查詢的輸出可能如下:
PROFILE CNT PERCENTAGE
----------------------------------- ---------- ----------
workarea executions - optimal 5395 95
workarea executions - onepass 284 5
workarea executions - multipass 0 0
這個查詢的輸出是用來告訴DBA何時動態調整PGA_AGGREGATE_TARGET引數。在通常的情況下,如果multi-pass的執行大於0, 就需要增加PGA_AGGREGATE_TARGET的值,並且在optimal executions是100%時減少它的值。
我們還可以使用V$PGASTAT檢視來決定我們的Oracle例項的記憶體使用。V$PGASTAT檢視提供了PGA使用和自動記憶體管理的例項級摘要統計資訊。以下的指令碼提供了全部Oracle9i連線的整體記憶體使用的統計資訊。
以下是一個用來檢測Oracle9i中PGA記憶體使用的簡單指令碼。
check_pga.sql
column name format a30
column value format 999,999,999
select
name,
value
from
v$pgastat
;
The output of this query might look like the following:
NAME VALUE
------------------------------------------------------ ----------
aggregate PGA auto target 736,052,224
global memory bound 21,200
total expected memory 141,144
total PGA inuse 22,234,736
total PGA allocated 55,327,872
maximum PGA allocated 23,970,624
total PGA used for auto workareas 262,144
maximum PGA used for auto workareas 7,333,032
total PGA used for manual workareas 0
maximum PGA used for manual workareas 0
estimated PGA memory for optimal 141,395
maximum PGA memory for optimal 500,123,520
estimated PGA memory for one-pass 534,144
maximum PGA memory for one-pass
在上面的v$pgastat顯示中我們可以看到以下的統計。
Aggregate PGA auto target -該列給出了可用於Oracle9i連線的全部記憶體。我們已經提過,這個值是由PGA_AGGREGATE_TARGET設定的。
Global memory bound -該統計表示work area的最大值,Oracle建議在該統計值下降到1M時,你應該增加PGA_AGGREGATE_TARGET的值。
Total PGA allocated - 這個統計顯示了資料庫中全部PGA記憶體使用的高水位線。當使用增加時,你應該看到這個值接近PGA_AGGREGATE_TARGET的值。
Total PGA used for auto workareas - 這個統計監視記憶體的使用或者全部執行在自動記憶體模式中的全部連線。要記住的是,並不是全部的內部程式使用自動記憶體特性。例如,Java和PL/SQL 將分配記憶體,但是這部分將不會統計到這個值中。因此我們可使用整體PGA的值來減去該值,以得到連線和Java and PL/SQL使用的記憶體。
Estimated PGA memory for optimal/one-pass - 該統計估計optimal模式下執行全部的連線任務所需要的記憶體。要記住的是,如果Oracle9i遇到記憶體不足時,它就會呼叫multi-pass操 作。這個統計對於監視Oracle9i中的記憶體使用是非常重要的,大多數的Oracle DBA將會增加PGA_AGGREGATE_TARGET到這個值。
現在我們已經瞭解了這個概念,以下就讓我們來看一下自動重新配置SGA有哪些方法。
總述
在一個UNIX環境中,在處理需求改變時透過定時任務來修改記憶體配置是非常簡單的。例如,許多Oracle資料庫在一般的工作時間以OLTP模式運作,在晚上的時候則執行對記憶體需求很大的批次報告。
我們知道在一個OLTP資料庫中應該將DB_CACHE_SIZE設定為一個較大的值,而在需求記憶體很大的批次任務中則需要給PGA_AGGREGATE_TARGET分配額外的記憶體。
以下的UNIX指令碼可以用來重新設定OLTP和DSS的SGA值而無需將例項停下來。在這個例子中,我們假定有一個孤立的帶有8GB記憶體的的 Oracle伺服器。我們還假定保留20%的記憶體供UNIX使用,而剩下的6GB記憶體則用作Oracle和Oracle連線。這些指令碼是在HP/UX或者 Solaris中使用的,並且接受$ORACLE_SID作為一個引數。
DSS_CONFIG.KSH指令碼將在每晚的6:00 p.m執行,以重新設定Oracle在晚上執行對記憶體需求很大的批次任務。
dss_config.ksh
#!/bin/ksh
# First, we must set the environment . . . .
ORACLE_SID=$1
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
#ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
$ORACLE_HOME/bin/sqlplus -s /nologin
ALTER SYSTEM set db_cache_size=1500m;
ALTER SYSTEM set shared_pool_size=500m;
ALTER SYSTEM set pga_aggregate_target=400m;
exit
!
現在我們已經知道了一個常見的方式來修改Oracle的配置,我們也很容易地看到可以很簡單地開發一個技術來連續地監控Oracle的處理需求,並且根據現有的資料庫需求來使用ALTER SYSTEM作修改。
結論
雖然Oracle9i中的記憶體管理仍然需要很多的手工操作,不過大部分的Oracle管理員可以使用工具來連續地監控Oracle SGA中的記憶體使用,並且可以根據Oracle instance中現在的使用情況來自動地重新分配記憶體。這樣就可以令Oracle 管理員根據系統的變化來靈活地重新設定他們的系統。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017482/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle9i的動態SGA,PGA特性探索Oracle
- 關於SGA的常用動態效能檢視
- SGA相關的幾個動態效能檢視
- Oracle9i中的監聽動態註冊Oracle
- [譯] Swift 中的動態特性Swift
- 理解Oracle9i中的監聽動態註冊Oracle
- 理解Javascript的動態語言特性JavaScript
- 理解Oracle9i中的監聽動態註冊(zt)Oracle
- 【sga】資料庫啟動時的的SGA大小顯示資料庫
- 【轉】AIX 53新特性--動態減小JFS2檔案系統AI
- 自動SGA共享記憶體管理,ASMM,MMAN,sga_target,sga_max_size記憶體ASM
- Oracle效能優化視訊學習筆記-動態調整SGAOracle優化筆記
- Objective-C 動態特性應用指南Object
- BIND 高階特性(二)-- 動態更新(轉)
- Quartz (2) - 動態操作quartz
- SGA與共享記憶體2記憶體
- oracle9i中insert 語句新增特性(轉)Oracle
- 變更oracle 11.2.0.3 rac sga自動管理為sga手工管理Oracle
- 動態Lambda(2):優化優化
- Oracle9i中的PGA自動管理Oracle
- Oracle 10g SGA 的自動化管理Oracle 10g
- show sga和show parameter sga的區別
- Python 語言特性:編譯+解釋、動態型別語言、動態語言Python編譯型別
- 查詢(2)--動態查詢
- Linux使用者態與核心態的互動 (2)(轉)Linux
- Oracle9i啟動歸檔Oracle
- ordebug 手動修改Oracle sga scnOracle
- Oracle9i的Windows平臺自動啟動問題OracleWindows
- Oracle10g/11g動態、靜態關閉DRM特性方法Oracle
- 變更oracle 11.2.0.3 rac sga手工管理為sga及pga全自動管理Oracle
- Sga的結構
- RPi2BDDNS動態域名DNS
- Struts2 動態方法呼叫(十三)
- 開啟oracle 10g的sga自動管理-ammOracle 10g
- Oracle9i自動PGA管理(zt)Oracle
- 淺談10G SGA自動管理
- iOS 10.3新特性之動態替換App IconiOSAPP
- MySQL 5.7新特性之動態修改innodb_buffer_pool大小MySql