oracle内存优化
发布时间:2020-12-12 15:37:43 所属栏目:百科 来源:网络整理
导读:一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且google很多下。现在记录下来,做下备份。 一、概述: oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global ar
一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且google很多下。现在记录下来,做下备份。
一、概述: oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global area or private global area)。对于 SGA 区域内的内存来说,是共享的全局的,在 UNIX 上,必须为 oracle 设置共享内存段(可以是一个或者多个),因为 oracle 在UNIX 上是多进程;而在 WINDOWS 上 oracle 是单进程(多个线程),所以不用设置共享内存段。PGA 是属于进程(线程)私有的区域。在 oracle 使用共享服务器模式下(MTS),PGA中的一部分,也就是 UGA 会被放入共享内存 large_pool_size 中。 发张图oracle内存架构组成,按照图上面的显示可以一目了然关键的参数和参数名称: 对于 SGA 部分,我们通过 sqlplus 中查询可以看到: SQL> select * from v$sga; NAME VALUE ---------- -------------------- Fixed Size 454032 Variable Size 109051904 Database Buffers 385875968 Redo Buffers 667648 Fixed Size: oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分组件的信息,可以看作引导建立 SGA 的区域。 Variable Size : 包含了 shared_pool_size、java_pool_size、large_pool_size 等内存设置 Database Buffers : 指数 据缓 冲区: 在 8i 中包 含 db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三 部 分内 存 。 在 9i 中 包 含 db_cache_size 、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。 Redo Buffers : 指日志缓冲区,log_buffer。在这里要额外说明一点的是,对于 v$parameter、v$sgastat、v$sga 查询值可能不一样。v$parameter 里面的值,是指用户在初 始化参数文件里面设置的值,v$sgastat 是 oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以 block 为最小单位进行分配的), v$sga 里面查询的值,是在 oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小大约是 11k(不同环境可能不一样)。 二、SGA内参数及设置: 2.1 Log_buffer 对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考 LGWR 写的触发条件之后,我们会发现通常超过 3M 意义不是很大。作为一个正式系统, 可能考虑先设置这部分为 log_buffer=3—5M 大小,然后针对具体情况再调整。 log_buffer是Redo log的buffer。 因此在这里必须要了解Redo Log的触发事件(LGWR) 1、当redo log buffer的容量达到1/3 2、设定的写redo log时间间隔到达,一般为3秒钟。 3、redo log buffer中重做日志容量到达1M 4、在DBWn将缓冲区中的数据写入到数据文件之前 5、每一次commit--提交事务。 上面的结论可以换句话说 1、log_buffer中的内容满1/3,缓存刷新一次。 2、最长间隔3秒钟,缓存刷新一次 3、log_buffer中的数据到达1M,缓存刷新一次。 4、每次提交一个“事务”,缓存刷新一次 2.2 Large_pool_size 对于大缓冲池的设置,假如不使用 MTS,建议在 20—30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是 RMAN 在备份的时候可能会使用到。 如果设置了MTS,则由于 UGA 部分要移入这里,则需要具体根据 server process 数量和相关会话内存参数的设置来综合考虑这部分大小的设置。 2.3 Java_pool_size 假如数据库没有使用 JAVA,我们通常认为保留 10—20M 大小足够。事实上可以更少,甚至最少只需要 32k,但具体跟安装数据库的时候的组件相关(比如 http server)。 2.4 Shared_pool_size Shared_pool_size的开销通常应该维持在300M 以内。除非系统使用了大量的存储过程、函数、包, 比如 oracle erp 这样的应用,可能会达到 500M 甚至更高。于是我们假定一个 1G 内存的系统,可能考虑 设置该参数为 100M,2G 的系统考虑设置为 150M,8G 的系统可以考虑设置为 200—300M 2.5SGA_MAX_SIZE SGA区包括了各种缓冲区和内存池,而大部分都可以通过特定的参数来指定他们的大小。但是,作为一个昂贵的资源,一个系统的物理内存大小是有限。 尽管对于CPU的内存寻址来说,是无需关系实际的物理内存大小的(关于这一点,后面会做详细的介绍),但是过多的使用虚拟内存导致page in/out, 会大大影响系统的性能,甚至可能会导致系统crash。所以需要有一个参数来控制SGA使用虚拟内存的最大大小,这个参数就是SGA_MAX_SIZE。当实例启动后, 各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的总和大小受到了SGA_MAX_SIZE的限制。 对于OLTP系统,参考: |