前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >相克军_Oracle体系_随堂笔记004-shared pool

相克军_Oracle体系_随堂笔记004-shared pool

作者头像
Alfred Zhao
发布2019-05-24 20:43:10
5010
发布2019-05-24 20:43:10
举报

本章主要阐述SGA中的shared pool。

Shared pool {

1.free

2.library cache(缓存sql语句及其执行计划)

3.row cache(数据字典缓存)

}

ps:对Oracle了解的多少的一个重要指标就是看你对数据字典了解多少。

--Shared pool

oracle 中只可以整体设置shared pool的大小,不可以对shared pool中的内存区域分别设置大小。

shared pool中容易出问题的是free和library cache;

1.free(shared pool中空闲的内存部分)

Q:何时需要从free中找chunk呢?

A:在硬解析的时候。

注意:如果硬解析失败,会报一个非常经典的错误Ora-4031。

产生这个错误的原因:①系统产生大量的硬解析;②大量的硬解析产生了大量碎片,此时又来一个大的sql需要解析,而free空间不够(有可能本身空间有剩余,但是都是碎片,没有符合需求所要大小的块,如下图4-1),导致报错。

2.library cache(缓存sql语句及其执行计划)

library cache 的内存块:

Q:shared pool中有多少chunk?

A:查询x表(x$ksmsp)的总数,

select count(*) from x$ksmsp;

Q:查询硬解析更直观的方法?

A:

select name, value 
from v$sysstat 
where name like 'parse%';

Q:如何清空library cache 和 row cache?

A:

alter system flush shared_pool;

(慎用flush命令,之后会产生大量的硬解析,能解决4031错误,但治标不治本。)

Q:如何减少硬解析?

A:共享sql,让sql完全相同。统一书写风格;使用绑定变量。

sql=>ASCII码值=>hash值=>运算=>挂哪个链上。

--使用绑定变量使得sql共享

declare v_sql varchar2(50);
begin for i in 1..10000 loop
v_sql := 'insert /*jingyu*/ into test values(:1)';
execute immediate v_sql using i;
end loop;
commit;
end;

--oracle有一个参数cursor_sharing

show parameter cursor
alter system set cursor_sharing='force'; 

(可以解决字面值没有使用绑定变量的问题。尽量先让开发去改,实在不行再改这个)

Q:如何找到没有共享的sql语句?

A:spool 1.txt

select sql_fulltext 
from v$sql 
where executions=1
order by sql_text;

spool off

注:结果不一定都是没有共享的sql语句,有可能是该sql语句本来就执行了一次。

Q:查看library cache命中率(容易出问题,正常很接近100%)

A:

select sum(pinhits)/sum(pins)*100
from v$librarycache;

Q:查看row cache命中率(一般没问题)

A:

select sum(gets), sum(getmisses), 100*sum(gets-getmisses)/sum(gets)
from v$rowcache;

Q:如何看一条sql语句的执行计划

A:先在v$sql中确认sql_id, 然后使用

select * from table(dbms_xplan.display_cursor('g4pkmrqrgxg3b'));

查看执行计划。

小结:

1.如何解决4031错误?

(1)alter system flush shared_pool;

(2)共享sql

(3)dbms_shared_pool.keep('大的对象名');

(4)保留区(在shared pool中单独划分出一个空间来,只用来放大对象)

把保留区设置的足够大,可减少很多4031的错误。

select request_misses from v$shared_pool_reserved;

查询结果应该是0.如果大于0,要调整shared_pool_reserved_size 参数。

(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;

10g之后,统一的一个参数sga_target (动态参数)

sga_max_size(静态参数,用来约束sga_target的)

注意:如果设置了sga_target,自动分配的shared pool的大小。

手工配置时,如果小于自动分配的大小,oracle直接忽略,此时show parameter sga,就不准确了。

2.shared pool到底该设置多大?

如果sql语句没有共享,硬解析非常多,shared pool的作用是反的,就是设置越大反而越不好。

10g以前。不超过1个g。

10g以后,可以超过1个g,2个g ,5个g。但也不建议设置太大。

利用一个sql语句看应该设置多少合适:

或者用EM 指导中心--内存指导--建议,看一下应该设置多大

3.row cache(数据字典缓存)

一般也不会出什么问题,暂不深入研究。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-07-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档