调整共享池
数据字典或库快存的没有命中,其开销大大多于缓冲快存的没有命中,因此,首先应该为共享池分配足够的空间。
使用如下语句可以确定库快存和数据字典快存的命中率:
select(sum(pins-reloads))/sum(pins)“Lib Cache”from v$librarycache ;
select (sum(gets-getmisses-usage-fixed))/sum(gets)“Row Cache”from v$librarycache;
共享池中的自由内存可以查看:
select * from v$sgastat where name=’free memory’;
当然,如果共享池满了并不一定存在问题,只要上面所说的比率接近于1,就不需要增加共享池大小;
如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.95,那么需要增加共享池的大小。
调整Library Cache
1. 检查库快存的活动
select sum(pins) “Executions”,sum(reloads)”Cache Misses while Executing” from v$librarycache ;
“Executions”列指明sql语句,pl/sql块和实体定义被访问执行了的次数,”Cache Misses while Executing”指明其中没有命中的次数。
2. 减少库快存的非命中
1、 分配更多的库快存(可以增加初始化参数shared pool size的值;为了利用增加的共享sql区,增加初始化参数open cursors的值);
2、 尽可能使用标准的sql语句(sql语句或pl/sql块必须一致,包括字符和空格;sql语句或pl/sql块中对schema实体的引用必须解析到同一schema的同一对象;sql语句中试用的变量的名字和数据类型必须匹配;sql语句必须使用相同的优化方法和优化目标);
尽可能使用标准的sql语句,策略:
语句中尽量使用变量而不要使用常量
确保应用用户不会改变优化方法和目标
标准化的变量命名和空格转换
尽可能使用存储过程
3、 使用cursor_space_for_time加速共享sql区的访问:该参数指定是否共享sql区可以释放,如果为false(默认值),一个共享sql区就可以被释放;如果为true,一个共享的sql区只存在所有与其相关的游标关闭后才可以被释放。
如果库快存在语句执行时有非命中,不要将其设置为true,否则对新的sql语句将没有空间。
调整Data Dictionary Cache
1、 监视数据字典快存的活动
select sum(gets) “Data Dictionary Gets”, sum(getmisses) “Data Dictionary Cache Get Misses” from v$rowcache ;
2、 减少数据字典快存的非命中
对频繁访问的数据字典快存没命中和命中比应少于10%-15%。
要增加数据字典快存可用的内存数,需要增加初始参数shared_pool_size的值。
调整多线程服务器的共享池
查询动态表v$sesstat可以确定会话信息的大小:
select sum(value)||‘bytes’”Total memory for all sessions” from v$sesstat, v$statname where name=’session uga memort’ and v$sesstat statistic#=v$statname.statistic#;
显示信息如下:
Total memory for all sessions
--------------------------------------
157125 bytes
结果指明当前分配给所有会话的内存。
调整共享池的保留空间
shared_pool_reserved_size为大的存储保留的shared_pool_size总量;
shared_pool_reserved_min_alloc-控制保留内存的分配;
要创建一个保留列表,shared_pool_reserved_size必须大于shared_pool_reserved_min_alloc。