技术开发 频道

Oracle数据库优化之系统全局区(SGA)

  调整共享池

  数据字典或库快存的没有命中,其开销大大多于缓冲快存的没有命中,因此,首先应该为共享池分配足够的空间。

  使用如下语句可以确定库快存和数据字典快存的命中率:

  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。

0
相关文章