oracle 的SGA与PGA分析(转载)
oracle 的SGA与PGA分析
oracle 的实例可以说是由内存和很多的进程组成的,这里的内存实际上是指SGA(system global area),严格意义上来说PGA(program global area)不属于实例的一部分。
SGA 系统全局区 由所有服务进程和后台进程共享,PGA为比较私有的区域,每一个用户会话进程都会有自己的PGA,这块区域不能被其他用户进程所访问。由每个服务进程、后台进程专有。
SGA
示意图,图片来源网络
来张英文的
Database buffer cache 这块区域对数据库对sql处理的性能有很大的影响,它缓存了从磁盘上检索的数据块。是ORACLE执行SQL的工作区域。在更新数据的时候,用户的会话不直接更新磁盘上的数据,包含关键数据的数据块首先要复制到这一区域,所有的数据库更改首先应用到缓存在这一区域的数据块上,此后数据块将在内存区域保留一段时间, 直至其被其他数据块缓存占用。理想情况下包含频繁访问的数据块都会缓存在这一区域。比如用户进程提交上来一个查询的sql,数据库为了执行这个查询sql会话的进程将扫描buffer cache 里相关的数据块,如果找到了就会发生一次缓存命中,假设缓存区没有相关数据块,oracle将首先包含相关行的数据从磁盘里检索出来,读取到这一区域,然后将结果才返回用户。如果用户发过来的是update等sql,如果buffer cache存在所涉及的数据块,update语句将首先在这以区域进行数据更新,然后将数据写到磁盘中。所以说buffer cache区域的大小直接影响了sql的执行效率。如果buffer cache区域大小设置得当,缓存命中可以达到90%以上。缓存命中率可以再AWR报告中查看。如果命中率很高但是空间很小,这样就会大量的去读写磁盘,影响I/O。直接影响数据库的性能。
Redo log buffer 日志缓冲区。日志缓冲区相对来说是比较小的,他的大小在数据库实例启动时被固定,不能实现自动管理。主要作用是用来记录数据库的每一次的更改,每当数据块发生变化后都被记录在日志离,会话进程不会将日志直接写到磁盘上,否则执行DDL操作的时候,会话就必须等待磁盘读写完成。会话日志先写到 redo log buffer 中当达到一定的数量与状态后,写到磁盘上。这块区域只有几M的空间,默认有oracle确认,如果过大,对性能也会产生极大的影响。如果过大,在DDL语句commit 时,需要写入的内容更多,在发出完成提交消息以及会话工作恢复之前,需要耗费更长的时间。所以这一区域一般由oracle默认分配。
share pool 共享池是SGA里可以说的最复杂的一块区域,缓存了各用户间可共享的各种结构。库缓存,数据字典缓存,PL/SQL区等
Large pool:一个可选的区域,用来缓存大的I/O请求,以支持并行查询、共享服务器模式以及某些备份操作。值得注意的是大池的大小对性能几乎没有影响。这块区域一般由oracle自动管理
Java pool:只有应用程 序需要在数据库中运行JAVA存储过程时才需要JAVA池。
Streams pool:比较高端,供oracle流使用,这里就不做介绍了
PGA
图片来源网络,原谅图片这么小吧
sort area:排序区,当用户需要对某些数据进行排序时,据库系统会将需要排序的数据保存到PGA一个排序区内。然后再在这个排序区内对这些数据进行排序。如需要排序的数据排序区能够容纳这些数据,排序会保存排序后的数据。由于系统从内存中读取数据比从硬盘中读取数据的速度要快几千倍,为此如果这个数据排序与读取的操作都能够在内存中完成,无疑可以在很大程度上提高数据库排序与访问的性能。如果这个排序的操作都能够在内存中完成,显然这是很理想的。但是如果PGA区中的排序区容量不够,不能够容纳排序后的数据,此时,系统会从硬盘中获取一个空间,用来保存这需要排序的数据。此时排序的效率就会降低许多。为此在数据库管理中,如果发现用户的很多操作都需要用到排序,那么用户会设置比较大的排序区,可以提高用户访问数据的效率。
USER SESSON DATA:会话区,一般不需要维护大小,会话区内保存了会话所具有的权限、角色、性能统计等信息,用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内。如此的话,用户进程在访问数据时,系统就会核对会话区内的用户权限信息,看看其是否具有相关的访问权限。
STACK SPACE:堆栈区还保存着会话变量、SQL语句运行时的内存结构等重要的信息。有时候为了提高SQL语句的重用性,会在语句中使用绑定变量。简单的说,就是SQL语句可以接受用户传入的变量。从而用户只需要输入不同的变量值,就可以满足不同的查询需求。可以大大提高语句的执行效率
CURSOR STATE:当运行使用游标的语句时,Oracle数据库系统会在程序缓存区中间为其分配一块区域。这块区域就叫做游标区。 游标区是一个动态的区域。当用户执行游标语句时,系统就会在这个游标区内创建一个区域。当关闭游标时,这个区域就会被释放。
---------------------
作者:ESinker
来源:CSDN
原文:https://blog.csdn.net/ezitai/article/details/53513034
版权声明:本文为博主原创文章,转载请附上博文链接!