对oracle实例的内存(SGA和PGA)进行调整,优化数据库性能

2024-01-28 01:58

本文主要是介绍对oracle实例的内存(SGA和PGA)进行调整,优化数据库性能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过对oracle内存(SGA和PGA)进行调整,优化数据库性能

一、示例:
_______________________________________________________________
SGA:
     共享池:200MB           
     缓冲区高速缓存:24MB    
     大型池:9MB
     Java池:32MB

     SAG总容量:264.933
     SAG的最大大小:305.069

PGA:
     总记PGA目标:240MB      
     分配的当前PGA:8914KB
     分配的最大PGA(自启动以来)9081KB
     高速缓存命中百分比:100%

     PGA和SGA的和应小于系统内存总量前去操作系统和其他应用程序所需内存后得到的值。


_______________________________________________________________

二、名词解释:
_______________________________________________________________
SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;
      系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。
      共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,
          主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)
          共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息
      缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能
      大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境
      Java池:ava Pool为Java命令的语法分析提供服务
PGA:Program Global Area是为每个连接到Oracle database的用户进程保留的内存。

_______________________________________________________________

三、分析与调整:
_______________________________________________________________
      1、系统全局域:
         SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/2到1/3,当然,如果服务器上只有oracle的话,

可以分配的更大一些,如果还有其他服务,如IIS等,那就要分的小一些。
      1、共享池:
         修改共享池的大小,ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;
         查看共享SQL区的使用率:
             select(sum(pins-reloads))/sum(pins) "Library cache" from v$librarycache;--动态性能表
             这个使用率应该在90%以上,否则需要增加共享池的大小。
         查看数据字典缓冲区的使用率:
             select (sum(gets-getmisses-usage-fixed))/sum(gets) "Data dictionary cache" from v$rowcache;--动态性能表
             这个使用率也应该在90%以上,否则需要增加共享池的大小。
      2、缓冲区高速缓存:
         它的大小要根据数据量来决定:
              SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
         查看数据库数据缓冲区的使用情况:
             SELECT name,value FROM v$sysstat order by name WHERE name IN('DB BLOCK GETS','CONSISTENT GETS','PHYSICAL READS');
         计算出来数据缓冲区的使用命中率=1-(physical reads/(db block gets+consistent gets)),这个命中率应该在90%以上,否则需要

增加数据缓冲区的大小。
         select sum(pins) "请求存取数",sum(reloads) "不命中数",sum(reloads)/sum(pins) from v$librarycache  
      其中,pins,显示在库高速缓存中执行的次数;reload,显示在执行阶段库高速缓存不命中的数目,一般sum(reloads)/sum(pins)的

值应接近于零.如果大于1%就应该增加shared_pool_size的值, 来提高数据字典高速缓存可用的内存数量,减少不命中数.
         通过动态性能表v$rowcache来查询数据字典高速缓存的活动:  
             select sum(gets) "请求存取数",sum(getmisses) "不命中数" from v$rowcache   
             其中,gets,显示请求相应项的总数; getmisses,显示造成高速缓存不命中的数据请求数.   
         Hit ratio与wait events:
             select value from $pgastat where name ='cache hit percentage'
             Hit ratio与wait events是此消彼涨,在执行类似于
             select col1,col2,.. from tab1 a where exists (
                select 1 from tab2 where a.col3 = b.col3
             )
             where ....
             的语句的时候,如果tab1的记录很多的话,你会发现系统的hit ratio会有很大的提高,wait events是否会改观呢.

      3、日志缓冲区
         SELECT name, value   FROM v$sysstat WHERE name IN ('redo entries','redo log space requests')查看日志缓冲区的使用情况。

查询出的结果可以计算出日志缓冲区的申请失败率:   

    
   申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。
      3、大型池:
         可以减轻共享池的负担
         可以为备份、恢复等操作来使用
         不使用LRU算法来管理
其大小由数据库的‘共享模式/db模式’如果是共享模式的话,要分配的大一些
         指定Large Pool的大小,ALTER SYSTEM SET LARGE_POOL_SIZE=64M
      3、Java池:
         在安装和使用Java的情况下使用
         其大小由JAVA_POOL_SIZE指定

 

本帖转自(http://hi.baidu.com/zhao_e893/blog/item/183185dd8aad1d345982dd98.html)

这篇关于对oracle实例的内存(SGA和PGA)进行调整,优化数据库性能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652142

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN