shared pool

1、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';
简述数据字典

2、硬解析、软解析
硬解析步骤、软解析步骤
讲解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%'


3、SQL共享,绑定变量
SQL语句组成,动态部分、静态部分
cursor_sharing

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

4、找出没有共享的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;

5、解析命中率
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;

6、解决4031错误的方法
1、alter system flush shared_pool;
2、共享SQL
3、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
4、保留区
select REQUEST_MISSES from v$shared_pool_reserved;
5、增加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;

7、查看执行计划
select * from table(dbms_xplan.display_cursor('g4pkmrqrgxg3b'));

8、在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;

原文地址:https://www.cnblogs.com/dbalightyear/p/11241873.html