一、shared pool的組成
3塊區域:free、library cache、row cache
select * from v$sgastat a where a.NAME = 'library cache';
select * from v$sgastat a where a.pool = 'shared pool' and a.NAME = 'free memory';
select * from v$sgastat a where a.NAME = 'row cache';
簡述數據字典sql
二、硬解析、軟解析
硬解析步驟、軟解析步驟
講解shared pool內存塊組成結構
兩個概念:chain、chunk
ora-4031錯誤
select count(*) from x$ksmsp;
select count(*) from dba_objects;
select count(*) from x$ksmsp;
alter system flush shared_pool; 緩存
軟硬解析的具體狀況
select name,value from v$sysstat where name like 'parse%'oracle
三、SQL共享,綁定變量
SQL語句組成,動態部分、靜態部分
cursor_sharingoop
declare v_sql varchar2(50);
begin for i in 1..10000 loop
v_sql := 'insert /*hello*/ into test(id) values (:1)';
execute immediate v_sql using i;
end loop;
commit;
end; 性能
select SQL_ID,sql_text,EXECUTIONS from v$sql where SQL_TEXT like spa
四、找出沒有共享的SQL語句
如何找出不能共享cursor的sql
在v$sql查找執行次數較小的sql語句,觀察這些sql語句是不是常常執行的。
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 and sql_text like '%from t%';
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 order by sql_text;操作系統
五、解析命中率
select sum(pinhits)/sum(pins)*100 from v$librarycache;
select sum(gets),sum(getmisses),100*sum(gets-getmisses)/sum(gets) from v$rowcache where gets>0;component
六、解決4031錯誤的方法
一、alter system flush shared_pool;
二、共享SQL
三、select * from v$db_object_cache where sharable_mem > 10000
and (type = 'PACKAGE' or type='PACKAGE BODY' or type = 'FUNCTION' or type='PROCEDURE')
and kept = 'NO';
執行dbms_shared_pool.keep('對象名');
DBMS_SHARED_POOL
@?/rdbms/admin/dbmspool.sql
四、保留區
select REQUEST_MISSES from v$shared_pool_reserved;
五、增長shared pool空間
select COMPONENT,CURRENT_SIZE from V$SGA_DYNAMIC_COMPONENTS;
show parameter sga_target
show parameter sga_max_size
alter system set shared_pool_size=150M scope=both;對象
七、查看執行計劃
select * from table(dbms_xplan.display_cursor('g4pkmrqrgxg3b'));進程
八、在Oracle10g中容許有多個sub shared pool,能夠設置大於1G的shared pool
設置shared pool的大小
SELECT
shared_pool_size_for_estimate "SP",
estd_lc_size "EL",
estd_lc_memory_objects "ELM",
estd_lc_time_saved "ELT", estd_lc_time_saved_factor "ELTS",
estd_lc_memory_object_hits "ELMO"
FROM v$shared_pool_advice;
SELECT 'Shared Pool' component,shared_pool_size_for_estimate estd_sp_size,estd_lc_time_saved_factor parse_time_factor,
CASE
WHEN current_parse_time_elapsed_s + adjustment_s < 0
THEN 0
ELSE
current_parse_time_elapsed_s + adjustment_s
END response_time
FROM (SELECT shared_pool_size_for_estimate,shared_pool_size_factor,estd_lc_time_saved_factor,a.estd_lc_time_saved,e.VALUE/100 current_parse_time_elapsed_s,c.estd_lc_time_saved - a.estd_lc_time_saved adjustment_s FROM v$shared_pool_advice a,(SELECT * FROM v$sysstat WHERE NAME = 'parse time elapsed') e,(SELECT estd_lc_time_saved FROM v$shared_pool_advice WHERE shared_pool_size_factor = 1) c);
首先斷定是否ORA-04031 錯誤是由共享池保留空間中的庫高速緩衝的碎片產生的。提交下的查詢:
SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
last_failure_size
FROM v$shared_pool_reserved;
若是:
REQUEST_FAILURES > 0 而且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC
那麼ORA-04031 錯誤就是由於共享池保留空間缺乏連續空間所致。要解決這個問題,能夠考慮加大SHARED_POOL_RESERVED_MIN_ALLOC 來下降緩衝進共 享池保留空間的對象數目,並增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 來加大共享池保留空間的可用內存。
若是:
REQUEST_FAILURES > 0 而且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或者
REQUEST_FAILURES 等於0 而且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
那麼是由於在庫高速緩衝缺乏連續空間致使ORA-04031 錯誤。
第一步應該考慮下降SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的對象到共享池保留空間中而且加大SHARED_POOL_SIZE。
看了下memory_max_target配置的值爲21G,再查看了下操做系統使用的內存達到15G左右,因此memory_max_target的值和
OS使用內存已經大大超過了物理內存值,所以致使出現了錯誤,將內存合理調整分配後問題獲得解決。
可使用「free」命令查看當前內存的使用狀況,
其中各項的含義以下,total:總計物理內存的大小;used:已使用的內存大小;free:可用的內存大小;Shared:多個進程共享的內存總額;Buffers/cached:磁盤緩存的大小。
第二行(mem)的used/free與第三行(-/+ buffers/cache)used/free的區別在因而從不一樣的角度來看內存的佔用,「Mem」是從操做系統的角度來看,對於OS,buffers/cached都是屬於被使用,總共使用的內存包含內核(OS)使用+Application(X,oracle,etc)使用+buffers+cached。「-/+ buffers/cache」所指的是從應用程序角度來看,對於應用程序來講,buffers/cached 是可用的內存,由於buffer/cached是爲了提升文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
free(選項)
選項
-b:以Byte爲單位顯示內存使用狀況;
-k:以KB爲單位顯示內存使用狀況;
-m:以MB爲單位顯示內存使用狀況;
-o:不顯示緩衝區調節列;
-s<間隔秒數>:持續觀察內存使用情況;
-t:顯示內存總和列;
-V:顯示版本信息。
alter system set cursor_sharing=SIMILAR | FORCE; select sum(bytes) from v$sgastat where pool='shared pool'; select pool,sum(bytes)/1024/1024 from v$sgastat group by pool; select sum(bytes)/1024/1024 mb from v$sgastat where pool='shared pool'; SELECT KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ) SIZ, To_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),'999,999.00')||'k' "AVG SIZE" FROM X$KSMSP GROUP BY KSMCHCLS; SELECT KSMCHIDX,KSMCHDUR, KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ) SIZ,to_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),'999,999.00')||'k' "AVG SIZE" FROM X$KSMSP GROUP BY KSMCHIDX,KSMCHDUR, KSMCHCLS order by 1,2,3;