SGA介绍
以前一直看的馬馬虎虎,這次重新整理了下sga設置,組件等。當然這些涉及到了很多的參考,主要的參考的網址:
?
http://www.hellodba.com/reader.php?ID=104&lang=CN?
http://8xmax.blog.163.com/blog/static/1633631020084781125726/??
http://blog.sina.com.cn/s/blog_4c705ccb0100anl1.html?
?
系統全局區SGA:?SGA包含的組件:共享池(shared pool);數據庫緩沖區高速緩存(database buffer cache);日志緩沖區(redo buffer cache);大池;Java池;流池等。
?SGA相關視圖:
?? v$sga:V$SGA這個視圖包括了SGA的的總體情況,只包含兩個字段:name(SGA內存區名字)和value(內存區的值,單位為字節)。它的結果和show sga的結果一致。
?? v$sgastat:10g之前用于查看各SGA組件大小。V$SGAINFO的作用基本和V$SGA一樣,只不過把Variable size的部分更細化了一步
?? v$sgainfo:10g及10g之后才有的。用于查看SGA組件大小更簡便。
?? v$sga_dynamic_components:這個視圖記錄了SGA各個動態內存區的情況,它的統計信息是基于已經完成了的,針對SGA動態內存區大小調整的操作。
?? v$sga_dynamic_free_memory:這個視圖只有一個字段就是用來表示SGA當前可以用于調整各個組件的剩余大小。
?? v$sga_target_advice:該視圖可用于建議SGA大小設置是否合理。
?? SELECT a.sga_size,--sga期望大小
????????? a.sga_size_factor,--期望sga大小與實際sga大小的百分比
????????? a.estd_db_time,--sga設置為期望的大小后,其dbtime消耗期望的變化
????????? a.estd_db_time_factor,--修改sga為期望大小后,dbtime消耗的變化與修改前的變化百分比
????????? a.estd_physical_reads--修改前后物理讀的差值
???? FROM v$sga_target_advice a;
? ?
--查看當前的sga大小
show parameter sga_max_size;
--修改sga值
alter system set sga_max_size=864M scope=spfile;--要重啟數據庫
alter system set sga_target=864M;
一、共享池
1、共享池相關視圖
? 如何查看共享池多大合適,先查看statistics_level參數是否為typical或者all,然后統計共享池信息(內存顧問)
? 1.1 v$shared_pool_advice視圖:可用于建議共享池大小的設置
select shared_pool_size_for_estimate sp, --估算的共享池大小(m為單位)? ?
?????? shared_pool_size_factor?????? spf, --估算的共享池大小與當前大小比
?????? estd_lc_memory_objects??????? elm,--估算共享池中庫緩存的內存對象數
?????? estd_lc_size????????????????? el,--估算共享池中用于庫緩存的大小(M為單位)
?????? estd_lc_time_saved??????????? elt,--估算將可以節省的解析時間。這些節省的時間來自于請求處理一個對象時,重新將它載入共享池的時間消耗和直接從庫緩存中讀取的時間消耗的差值。
?????? estd_lc_time_saved_factor???? as elts,--估算的節省的解析時間與當前節省解析時間的比
?????? estd_lc_memory_object_hits??? as elmo--估算的可以直接從共享池中命中庫緩存的內存對象的命中次數
? from v$shared_pool_advice;
? 1.2 V$SHARED_POOL_RESERVED視圖 :存放了共享池保留區的統計信息
??????? --以下字段只有當參數SHARED_POOL_RESERVED_SIZE設置了才有效
select a.FREE_SPACE,--保留區的空閑空間數。
?????? a.AVG_FREE_SIZE,--保留區的空閑空間平均數。
?????? a.FREE_COUNT,--保留區的空閑內存塊數
?????? a.MAX_FREE_SIZE,--最大的保留區空閑空間數
?????? a.USED_SPACE,--保留區使用空間數
?????? a.AVG_USED_SIZE,--保留區使用空間平均數
?????? a.USED_COUNT,--保留區使用內存塊數
?????? a.MAX_USED_SIZE,--最大保留區使用空間數
?????? a.REQUESTS,--請求再保留區查找空閑內存塊的次數
?????? a.REQUEST_MISSES,--無法滿足查找保留區空閑內存塊請求,需要從LRU列表中清出對象的次數
?????? a.LAST_MISS_SIZE,--請求的內存大小,這次請求是最后一次需要從LRU列表清出對象來滿足的請求
?????? --以下字段無論參數SHARED_POOL_RESERVED_SIZE是否設置了都有效
?????? a.MAX_MISS_SIZE,--所有需要從LRU列表清出對象來滿足的請求中的內存最大大小
?????? a.REQUEST_FAILURES,--沒有內存能滿足的請求次數(導致4031錯誤的請求)
?????? a.LAST_FAILURE_SIZE,--沒有內存能滿足的請求所需的內存大小(導致4031錯誤的請求)
?????? a.ABORTED_REQUEST_THRESHOLD,--不清出對象的情況下,導致4031錯誤的最小請求大小
?????? a.ABORTED_REQUESTS,--不清出對象的情況下,導致4031錯誤的請求次數
?????? a.LAST_ABORTED_SIZE--不清出對象的情況下,最后一次導致4031錯誤的請求大小
? from V$SHARED_POOL_RESERVED a
可以根據后面4個字段值來決定如何設置保留區的大小以避免4031錯誤的發生
?
1.3?? v$db_object_cache:顯示了所有被緩存在library cache中的對象,包括表、索引、簇、同義詞、PL/SQL存儲過程和包以及觸發器
??? SELECT o.owner,--對象所有者
?????????? o.name,--對象名稱
?????????? o.db_link,--如果對象存在db link的話,db link的名稱
?????????? o.namespace,--庫緩存的對象命名空間
?????????? o.type,--對象類型
?????????? o.sharable_mem,--對象消耗的共享池中的共享內存
?????????? o.loads,--對象被載入次數。即使對象被置為無效了,這個數字還是會增長
?????????? o.executions,--對象執行次數,但本視圖中沒有被使用??梢詤⒖家晥Dv$sqlarea中執行次數
?????????? o.locks,--當前鎖住這個對象的用戶數(如正在調用、執行對象)
?????????? o.pins,--當前pin住這個對象的用戶數(如正在編譯、解析對象)
?????????? o.kept,-- 對象是否被保持,即調用了DBMS_SHARED_POOL.KEEP來永久將對象pin在內存中。(YES | NO)
?????????? o.child_latch,--正在保護該對象的子latch的數量
?????????? o.invalidations --無效數
????? FROM v$db_object_cache o;
???? ?
?1.4 v$sql、v$sqlarea 、v$sqltext:
????? 這三個視圖都可以用于查詢共享池中已經解析過的SQL語句及其相關信息。
????? V$SQL中列出了共享SQL區中所有語句的信息,它不包含GROUP BY字句,并且為每一條SQL語句中單獨存放一條記錄;
????? V$SQLAREA中一條記錄顯示了一條共享SQL區中的統計信息。它提供了有在內存中、解析過的和準備運行的SQL語句的統計信息;
????? V$SQLTEXT包含了庫緩存中所有共享游標對應的SQL語句。它將SQL語句分片顯示。
? SELECT s.sql_text,--游標中sql語句的前1000個字符
???????? s.sharable_mem,--被游標占用的共享內存大小。如果存在多個子游標,則包含所有子游標占用的共享內存大小。
???????? s.persistent_mem,--用于打開這條語句的游標的生命過程中的固定內存大小。如果存在多個子游標,則包含所有子游標生命過程中的固定內存大小。
???????? s.runtime_mem,--打開這條語句的游標的執行過程中的固定內存大小。如果存在多個子游標,則包含所有子游標執行過程中的固定內存大小。
???????? s.sorts,--所有子游標執行語句所導致的排序次數
???????? s.version_count,--緩存中關聯這條語句的子游標數
???????? s.loaded_versions,--緩存中載入了這條語句上下文堆(kgl heap 6)的子游標數
???????? s.open_versions,--打開語句的子游標數
???????? s.users_opening,--打開這些子游標的用戶數
???????? s.fetches,--sql語句的fetch數
???????? s.executions,--所有子游標的執行這條語句次數
???????? s.px_servers_executions,
???????? s.end_of_fetch_count,
???????? s.users_executing,--通過子游標執行這條語句的用戶數
???????? s.loads,--語句被載入和重載入的次數
???????? s.first_load_time,--語句被第一次載入的時間戳
???????? s.invalidations,--所有子游標的無效次數
???????? s.parse_calls,--所有子游標對這條語句的解析調用次數
???????? s.disk_reads,--所有子游標運行這條語句導致的讀磁盤次數
???????? s.direct_writes,
???????? s.buffer_gets,--所有子游標運行這條語句導致的讀內存次數
???????? s.application_wait_time,
???????? s.concurrency_wait_time,
???????? s.cluster_wait_time,
???????? s.user_io_wait_time,
???????? s.plsql_exec_time,
???????? s.java_exec_time,
???????? s.rows_processed,--這條語句處理的總記錄行數
???????? s.command_type,--oracle命令類型代號
???????? s.optimizer_mode,--執行這條的優化器模型
???????? s.optimizer_cost,
???????? s.optimizer_env,
???????? s.optimizer_env_hash_value,
???????? s.parsing_user_id,--第一次解析這條語句的用戶的id
???????? s.parsing_schema_id,--第一次解析這條語句所用的schema的id
???????? s.parsing_schema_name,
???????? s.kept_versions,--所有被dbms_shared_pool包標識為保持(keep)狀態的子游標數
???????? s.address,--指向語句的地址
???????? s.hash_value,--這條語句在library cache中hash值
???????? s.old_hash_value,
???????? s.plan_hash_value,
???????? s.module,--在第一次解析這條語句是通過調用dbms_application_info.set_module設置的模塊名稱
???????? s.module_hash,--模塊的hash值
???????? s.action,--在第一次解析這條語句是通過調用dbms_application_info.set_action設置的動作名稱
???????? s.action_hash,--動作的hash值
???????? s.serializable_aborts,--所有子游標的事務無法序列化的次數,這會導致ora-08177錯誤
???????? s.outline_category,
???????? s.cpu_time,
???????? s.elapsed_time,
???????? s.outline_sid,
???????? s.last_active_child_address,
???????? s.remote,
???????? s.object_status,
???????? s.literal_hash_value,
???????? s.last_load_time,
???????? s.is_obsolete,--游標是否被廢除(y或n)。當子游標數太多了時可能會發生
???????? s.child_latch,--包含此游標的子latch數
???????? s.sql_profile,
???????? s.program_id,
???????? s.program_line#,
???????? s.exact_matching_signature,
???????? s.force_matching_signature,
???????? s.last_active_time,
???????? s.bind_data
??? FROM v$sqlarea s;
?查看當前會話所執行的語句以及會話相關信息:
select a.sid || '.' || a.SERIAL#,
?????? a.username,
?????? a.TERMINAL,
?????? a.program,
?????? s.sql_text
? from v$session a, v$sqlarea s
?where a.sql_address = s.address(+)
?? and a.sql_hash_value = s.hash_value(+)
?order by a.username, a.sid;
1.5 v$sql_plan:視圖V$SQL_PLAN包含了library cache中所有游標的執行計劃。
? SELECT p.address,--當前cursor父句柄位置
???????? p.hash_value,--在library cache中父語句的hash值
???????? p.operation,--在各步驟執行內部操作的名稱,例如:table access
???????? p.options,--描述列operation在操作上的變種,例如:full
???????? p.object_node,--用于訪問對象的數據庫鏈接database link 的名稱對于使用并行執行的本地查詢該列能夠描述操作中輸出的次序
???????? p.object#,--表或索引對象數量
???????? p.object_owner,--對于包含有表或索引的架構schema 給出其所有者的名稱
???????? p.object_name,--表或索引名
???????? p.optimizer,--執行計劃中首列的默認優化模式
???????? p.id,--在執行計劃中分派到每一步的序號
???????? p.parent_id,--對id 步驟的輸出進行操作的下一個執行步驟的id
???????? p.depth,--業務樹深度(或級)。
???????? p.cost,--cost-based方式優化的操作開銷的評估,如果語句使用rule-based方式,本列將為空
???????? p.cardinality,--根據cost-based方式操作所訪問的行數的評估
???????? p.bytes,--根據cost-based方式操作產生的字節的評估
???????? p.other_tag,--其它列的內容說明
???????? p.partition_start,--范圍存取分區中的開始分區
???????? p.partition_stop,--范圍存取分區中的停止分區
???????? p.partition_id,--計算partition_start和partition_stop這對列值的步數
???????? p.other,--其它信息即執行步驟細節,供用戶參考
???????? p.distribution,--為了并行查詢,存儲用于從生產服務器到消費服務器分配列的方法
???????? p.cpu_cost,--根據cost-based方式cpu操作開銷的評估。如果語句使用rule-based方式,本列為空
???????? p.io_cost,--根據cost-based方式i/o操作開銷的評估。如果語句使用rule-based方式,本列為空
???????? p.temp_space,--ost-based方式操作(sort or hash-join)的臨時空間占用評估。如果語句使用rule-based方式,本列為空
???????? p.access_predicates,--指明以便在存取結構中定位列,例如,在范圍索引查詢中的開始或者結束位置
???????? p.filter_predicates,--在生成數據之前即指明過濾列
??? FROM v$sql_plan p;
?通過結合v$sqlarea可以查出library cache中所有語句的查詢計劃。先從v$sqlarea中得到語句的地址,然后在由v$sql_plan查出它的查詢計劃:
SELECT LPAD(' ', 2 * (level - 1)) || operation "Operation",
?????? options "Options",
?????? DECODE(to_char(id),
????????????? '0',
????????????? 'Cost=' || nvl(to_char(position), 'n/a'),
????????????? object_name) "Object Name",
?????? optimizer
? FROM v$sql_plan a
?START WITH address = '4F6E452C'
??????? AND id = 0
CONNECT BY PRIOR id = a.parent_id
?????? AND PRIOR a.address = a.address
?????? AND PRIOR a.hash_value = a.hash_value;
2、查看共享池大小
--查看共享池各參數
SELECT name,(bytes)/1024/1024 a FROM v$sgastat WHERE pool='shared pool' ORDER BY a DESC;
--查看Shared Pool Size大小
select name,bytes/1024/1024 from v$sgainfo WHERE name='Shared Pool Size';
注:區分共享池與Shared Pool Size(Shared Pool Size只是共享池的一大部分)
3、修改共享池的大小:
ALTER SYSTEM SET SHARED_POOL_SIZE = 320M;
4、共享池包含的組件
? 庫高速緩存;數據字典高速緩存;用于保存共享服務器連接用戶全局區(UGA),只在共享服務器配置下有。 ?
?4.1 庫高速緩存
?? 存儲SQL語句或PL/SQL塊
?? 4.1.1 相關視圖
????? 4.1.1.1 v$librarycache視圖
????? 這個視圖包含了關于library cache的性能統計信息,對于共享池的性能調優很有幫助。
????? SELECT l.namespace,-- library cache的命名空間
???????????? l.gets,--請求GET該命名空間中對象的次數
???????????? l.gethits,--請求GET并在內存中找到了對象句柄的次數(鎖定命中)
???????????? l.gethitratio,--請求GET的命中率
???????????? l.pins,--讀取或執行該命名中對象的次數
???????????? l.pinhits,--庫對象的所有元數據在內存中被找到的次數(pin命中)
???????????? l.pinhitratio,--Pin命中率
???????????? l.reloads,--Pin請求需要從磁盤中載入對象的次數
???????????? l.invalidations,--命名空間中的非法對象(由于依賴的對象被修改所導致)數
???????????? l.dlm_lock_requests,--GET請求導致的實例鎖的數量
???????????? l.dlm_pin_requests,--PIN請求導致的實例鎖的數量
???????????? l.dlm_pin_releases,--請求釋放PIN鎖的次數
???????????? l.dlm_invalidation_requests,--GET請求非法實例鎖的次數
???????????? l.dlm_invalidations--從其他實例那的得到的非法pin數
??????? FROM v$librarycache l;
? ?
????? 4.1.1.2 v$library_cache_memory視圖
???? select a.lc_namespace,-- Library cache命名空間
???????? a.lc_inuse_memory_objects,--存在與庫高速緩存的對象數目
???????? a.lc_inuse_memory_size,--存在庫高速緩存對象大小(M)
???????? a.lc_freeable_memory_objects,--空閑的庫高速緩存數量
???????? a.lc_freeable_memory_size --空閑的庫高速緩存大小
??? from v$library_cache_memory a;
?? 通過此視圖可了解目前在庫高速緩存中的對象及可繼續存放的數目。
? ?
?? 4.1.2 查看庫緩存的命中率
????? select sum(pinhits)/sum(pins) from v$librarycache;
????? select(sum(pins-reloads))/sum(pins) "Library cache" from v$librarycache;--考慮了reloads
???? 當命中率小于99%或未命中率大于1%時,說明系統中硬解析過多,要做系統優化(增加Shared Pool、使用綁定變量、修改cursor_sharing等措施。
??? ?
????? 注:
????? I)不能單看庫高速緩存命中率的大小,結合v$librarycache中的reloads來分析。如果reloads值比較大,表明許多sql語句在老化退出后又被
????? 重新裝入庫池。若sql語句是因為沒有使用綁定變量導致reloads值變大,可修改該sql采用綁定變量的方式;若sql語句無法使用綁定變量,
????? 則可考慮將sql語句用dbms_shared_pool中的keep過程將需要釘在庫池中的對象釘住,用unkeep過程釋放。
????? sys.dbms_shared_pool.keep(name => ,flag => )--Name是需要固定的對象的名稱,flag是要固定的對象的類型
???? II)dbms_shared_pool說明:
?? 1)默認下該包沒安裝,可利用$ORACLE_HOME/rdbms/admin目錄下的dbmspool.sql腳本來安裝(sys用戶執行),其他用戶需要sys用戶授權后
才可使用。 ?
?? 2)對于固定在共享池中的對象,當共享池空間不足的時候,ORACLE不會釋放這些對象以獲取創建新的項目所需要的空間,甚至刷新共享池的時候,
這些對象也不會被清除。 ?
?? 3)dbms_shared_pool包的keep和unkeep過程中的flag的取值:
??????? ? Q????????? sequence
????????? R????????? trigger
????????? T????????? type
????????? JS???????? java source
????????? JC???????? java class
????????? JR???????? java resource
????????? JD???????? java shared data
????????? C????????? CURSOR
??????? 固定SQL的keep示例:dbms_shared_pool.keep('address,hash_value','C'),其中SQL語句的ADDRESS和HASH_VALUE可以在V$SQLAREA中找到;
對于函數、過程和包示例如下:dbms_shared_pool.keep('name','P')。
注:如果采用該過程將程序固定到共享池后,刷新緩沖區(alter system flush shared_pool)也不會清除,必須使用unkeep過程清除。
?
?4.1.3 調優庫高速緩存
? 優化庫高速緩存的目的是重用以前分析過的或執行過的代碼。最簡單的方法就是使用綁定變量,減少硬分析。
? 4.1.3.1 游標共享cursor_sharing參數的使用,使之使用綁定變量
? cursor_sharing參數有三個值:
? SIMILAR:只在認為綁定變量不會對優化產生負面影響時才使用綁定變量。
? FORCE:強制在所有情況下使用綁定變量。
? EXACT:默認情況下為該值
? ORACLE建議使用CURSOR_SHARING=SIMILAR,因為使用CURSOR_SHARING=FORCE有可能使執行計劃變壞。但實際上CURSOR_SHARING=FORCE
對執行計劃的好處要遠遠大于壞處。在觀察到由于不使用綁定變量而導致大量硬分析時,通過把默認的CURSOR_SHARING=EXACT改成CURSOR_SHARING=FORCE
可極大的改善性能??稍趇nit.ora或spfile中更改這個參數,也可使用alter system 或alter session 動態的執行更改。
? 4.1.3.2 硬分析語句的查詢與改進? ?
? 查看硬分析語句
select s.sid, s.value "execute counts", t.value "hard parse"
? from v$sesstat s, v$sesstat t
?where s.sid = t.sid
?? and s.statistic# in
?????? (select statistic# from v$statname where name = 'execute count')
?? and t.statistic# in
?????? (select statistic# from v$statname where name = 'parse count (hard)')
?order by t.value desc;
?將硬分析語句采用綁定變量方式或者直接將該sql固定到緩存中。
?4.1.3.3 減少軟分析,降低庫高速緩存閂鎖爭用
?? 通過以下措施可將軟分析保持為最低:
?? 1)設置 SESSION_CACHED_CURSORS
??? SESSION_CACHED_CURSORS,就是說的是一個session可以緩存多少個cursor,讓后續相同的SQL語句不再打開游標,從而避免軟解析的過程來提高性能。
?(綁定變量是解決硬解析的問題),軟解析同硬解析一樣,比較消耗資源.所以這個參數非常重要。
??? 當一個cursor關閉之后,oracle會檢查這個cursor的request次數是否超過3次,如果超過了三次,就會放入session cursor cache list的MRU端,
?這樣在下次打算parse一個sql時,它會先去pga內搜索session cursor cache list,如果找到那么會把這個cursor脫離list,然后當關閉的時候再把這個
?cursor加到MRU端. session_cached_cursor提供了快速軟分析的功能,提供了比soft parse更高的性能。session cursor cache的管理也是使用LRU。
??? session_cached_cursors這個參數是控制session cursor cache的大小的。session_cached_cursors定義了session cursor cache中存儲的
?cursor的個數。這個值越大,則會消耗的內存越多。
?另外檢查這個參數是否設置的合理,可以從兩個statistic來檢查。
SQL> select name,value from v$sysstat where name like '%cursor%';
NAME VALUE
---------------------------------------------------------------- ----------
opened cursors cumulative 17889
opened cursors current 34
session cursor cache hits 16481
session cursor cache count 777
cursor authentications 294
SQL>select name,value from v$sysstat where name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse time cpu 331
parse time elapsed 2021
parse count (total) 12134
parse count (hard) 1355
parse count (failures) 3
session cursor cache hits 和parse count(total) 就是總的parse次數中,在session cursor cache中找到的次數,所占比例越高,性能越好。
如果比例比較低,并且有剩余內存的話,可以考慮加大該參數。
Oracle 9i及以前,該參數缺省是0,10G上缺省是20。
open_cursors 是充許打開的游標的數量
session_cached_cursors 是充許放入緩存的游標的數量
?? 2)在應用程序預編譯器中設置 HOLD_CURSOR
?? HOLD_CURSOR=YES|NO;缺省值為NO。
?? 當執行SQL操縱語句時,其相關的光標被連到光標高速緩沖存儲器中的一項上,該項又被依次連接到ORACLE專用的SQL區域上,該區域存儲處理該語句
?所需的信息。
?? 當HOLD_CURSOR=NO時,在ORACLE執行完SQL語句或關閉光標后,預編譯程序直接撤去該鏈,釋放分析塊和分配給專用SQL區域的內存,并把該鏈標為可再
?使用。這時另一個SQL語句就又可使用該鏈來指向光標高速緩沖存儲器的項了。
?? 當HOLD_CURSOR=YES時,該鏈被保留,預編譯程序不再使用它。這對經常使用的SQL語句是有用的。
?? 如果RELEASE_CURSOR=no(默認 no),HOLD_CURSOR=yes(默認為no),當ORACLE執行完SQL語句,為private SQL AREA分配的內存空間被保留,
cursor和private SQL AREA之間的link也被保留,預編譯程序不再使用它,同樣可以通過這個指針直接在private SQL AREA獲得語句。
注意:RELEASE_CURSOR=YES優先于HOLD_CURSOR=YES;HOLD_CURSOR=NO優先于RELEASE_CURSOR=NO。
?
?? 3)設置 CURSOR_SPACE_FOR_TIME 默認為false? 廢棄
???? 該參數本意是通過設置為true可以保證游標在關閉前不能重新分配游標。
???? 但是注意,該參數已廢棄。
?
?4.1.3.4 修改share_pool大小
?? 查看庫緩存命中率大小,若大小,可試著加大share_pool。
?
4.2 數據字典緩沖區
--查看數據字典緩沖區的使用率(應該在90%以上,否則需要增加共享池的大小)
select (sum(gets-getmisses-usage-fixed))/sum(gets) "Data dictionary cache" from v$rowcache;
二、數據緩沖區
show parameter db_cache_size
--修改一些DB_CACHE相關參數
alter system set db_cache_size=100m; --默認池(所有段塊一般都在這個池)
alter system set db_keep_cache_size=12m;--保持池(訪問非常頻繁的段可放置該池,防止在默認池老化)
alter system set db_recycle_cace_size=16m;--回收池(訪問很隨機的大段一般可放于該池)
--查看db_cache命中率
select name, value
? from v$sysstat
?where name in ('db block gets from cache', 'consistent gets from cache',
??????? 'physical reads cache');
db_cache命中率算法
db_cache命中率=1-(physical reads cache/(db block gets from cache+consistent gets from cache)) --命中率應該在90%以上,否則需要增加數據緩沖區的大小
--采用v$buffer_pool_statistics視圖推導緩沖區高速緩存的命中率
SELECT name,
?????? physical_reads,
?????? db_block_gets,
?????? consistent_gets,
?????? 1 - (physical_reads / (db_block_gets + consistent_gets)) Hitratio
? FROM v$buffer_pool_statistics;
--v$db_cache_advice視圖用于建議緩沖區高速緩存設置
SELECT size_for_estimate???????? "size",
?????? buffers_for_estimate????? "buffers",
?????? estd_physical_read_factor "read_factor",
?????? estd_physical_reads?????? "reads"
? FROM v$db_cache_advice
?WHERE NAME = 'DEFAULT'
?? AND block_size =
?????? (SELECT VALUE FROM v$parameter WHERE NAME = 'db_block_size');
注:對于常用的小表可以將其保存在keep池,這樣就不會因為緩沖區滿而被清出。
? ?? alter table table_name storage(buffer_pool keep) 。
?
三、重做日志緩沖區
? Redo Log Buffer是SGA中一段保存數據庫修改信息的緩存。這些信息被存儲在重做條目(Redo Entry)中.重做條目中包含了由于INSERT、UPDATE、
DELETE、CREATE、ALTER或DROP所做的修改操作而需要對數據庫重新組織或重做的必須信息。在必要時,重做條目還可以用于數據庫恢復。
? 重做條目是Oracle數據庫進程從用戶內存中拷貝到Redo Log Buffer中去的。重做條目在內存中是連續相連的。后臺進程LGWR負責將Redo Log Buffer中
的信息寫入到磁盤上活動的重做日志文件(Redo Log File)或文件組中去的。
?? 參數LOG_BUFFER決定了Redo Log Buffer的大小。它的默認值是512K(一般這個大小都是足夠的),最大可以到4G。當系統中存在很多的大事務或者
事務數量非常多時,可能會導致日志文件IO增加,降低性能。這時就可以考慮增加LOG_BUFFER。
?? 但是,Redo Log Buffer的實際大小并不是LOB_BUFFER的設定大小。為了保護Redo Log Buffer,oracle為它增加了保護頁(一般為11K):
SQL> show parameter log_buffer
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
log_buffer?????????????????????????? integer???? 7024640
SQL> select * from v$sgastat where name = 'log_buffer';
POOL???????? NAME??????????????????????????? BYTES
------------ -------------------------- ----------
???????????? log_buffer??????????????????? 7135232
調整操作
alter system set log_buffer=3500000 scope=spfile;
四、大池(用于減輕共享池的負擔,當有大規模的I/O操作或者備份恢復操作,或者是共享服務器進程)
其主要大小由參數large_pool_size決定
show parameter large_pool_size;
?大池是SGA中的一塊可選內存池,根據需要時配置。在以下情況下需要配置大池:
?? 用于共享服務(Shared Server MTS方式中)的會話內存和Oracle分布式事務處理的Oracle XA接口
?? 使用并行查詢(Parallel Query Option PQO)時
?? IO服務進程
?? Oracle備份和恢復操作(啟用了RMAN時)
?? 通過從大池中分配會話內存給共享服務、Oracle XA或并行查詢,oracle可以使用共享池主要來緩存共享SQL,以防止由于共享SQL緩存收縮導致的性能
消耗。此外,為Oracle備份和恢復操作、IO服務進程和并行查詢分配的內存一般都是幾百K,這么大的內存段從大池比從共享池更容易分配得到。
?? 參數LARGE_POOL_SIZE設置大池的大小(alter system set large_pool_size=10M)。大池是屬于SGA的可變區(Variable Area)的,它不屬于共享池。
?對于大池的訪問,是受到 large memory latch 保護的。大池中只有兩種內存段:空閑(free)和可空閑(freeable)內存段。它沒有可重建
(recreatable)內存段,因此也不用LRU鏈表來管理(這和其他內存區的管理不同)。大池最大大小為4G。
?? 為了防止大池中產生碎片,隱含參數 _LARGE_POOL_MIN_ALLOC 設置了大池中內存段的最小大小,默認值是16K(同樣,不建議修改隱含參數)。
?? 此外,large pool是沒有LRU鏈表的。
五、JAVA池(使用java語言,java命令分析時需要使用)
其主要大小由參數java_pool_size決定
show parameter java_pool_size;
? Java池也是SGA中的一塊可選內存區,它也屬于SGA中的可變區。
? Java池的內存是用于存儲所有會話中特定Java代碼和JVM中數據。Java池的使用方式依賴與Oracle服務的運行模式。
? Java池的大小由參數JAVA_POOL_SIZE設置(alter system set java_pool_size=10M;)。Java Pool最大可到1G。
? 在Oracle 10g以后,提供了一個新的建議器——Java池建議器——來輔助DBA調整Java池大小。建議器的統計數據可以通過視圖
V$JAVA_POOL_ADVICE來查詢。
六、流池
?? 流池是Oracle 10g中新增加的。是為了增加對流(流復制是Oracle 9iR2中引入的一個非常吸引人的特性,支持異構數據庫之間的復制。10g中得到了
完善)的支持。
?? 流池也是可選內存區,屬于SGA中的可變區。它的大小可以通過參數 STREAMS_POOL_SIZE 來指定。如果沒有被指定,oracle會在第一次使用流時自動創
建。如果設置了SGA_TARGET參數,Oracle會從SGA中分配內存給流池;如果沒有指定SGA_TARGET,則從buffer cache中轉換一部分內存過來給流池。轉換
的大小是共享池大小的10%。
?? Oracle同樣為流池提供了一個建議器——流池建議器。建議器的統計數據可以通過視圖V$STREAMS_POOL_ADVICE查詢。
?
?
轉載于:https://www.cnblogs.com/lanzi/archive/2011/08/08/2131412.html
總結
- 上一篇: 安卓蓝牙键盘按键映射_安卓手游键盘映射工
- 下一篇: 小波同态滤波 matlab,matlab