前言
OracleDatabase Concepts 11gRelease 2 (11.2)Part Number E25789-01进行的1:1原文翻译。Memory Architecture 也是oracle中最为重要的一部分,同时也是一个学习的过程,与 上流传的10g concepts中文版有一定的区别,因为11g的内存结构做了很多的改进性的变化。有人说越老的concepts写的越好,确实10g的编写人在力图给人以清晰明了的阐述,另一方面给我感觉11g的concepts感觉要比10g写得内容多且深,同时让我在翻译的时候遇到了很多麻烦,11g的concepts语法写得确实要比10g的晦涩些!本次翻译有很多不足的地方,也全当一次爱好了!
14内存体系结构
本章讨论的Oracle数据库实例的内存架构
本章包含以下部分:
l介绍Oracle数据库内存体系结构
l用户全局区(User Global Area)概述
l程序全局区(Program Global Area)概述
l系统全局区(System Global Area)概述
l软件代码区(Software Code Area)概述
See Also:
lOracle Database Administrator’s Guidefor instructions for configuring and managing memory
数据库内存结构介绍
当一个实例启动的时候,oracle会分配一段内存区域并且开始后台进程。这个内存区域存储如下信息:
l程序代码
l每个Session的连接信息,即使是不活跃的连接
l程序的执行信息,例如,一个多行查询需要被提取的状态
l在程序之间那些需要被共享和交互数据的锁信息
l高速缓存的数据,例如数据块和重做记录,还有那些存在于磁盘上的信息
基本内存结构
与oracle数据库有关的基础内存结构有:
l系统全局区(SGA)
SGA是一组共享内存结构,SGA的组件包含一个数据库实例的数据和控制信息。SGA被所有的服务和后台进程所共享,例如,存储在SGA中的存储数据,包括高速缓冲数据块和共享SQL区。
l程序全局区(PGA)
PGA不是一个共享的内存区域,他包含的数据和控制信息只被一个数据库程序所使用,当数据库启动的时候PGA被创建。
每个PGA的区域一一的与服务进程和后台进程所对应,有些个别的PGA集合是整个实例的PGA。数据库初始化参数设置了PGA实例的大小。
l用户全局区(UGA)
UGA内存与一个用户的session相关。
l软件代码区
软件代码区提供了一个区域去存储那些被运行的代码。Oracle数据库代码被存储在软件域,通常用户程序占用不同的区域–一个独占或者是被保护的区域。
Oracle数据库内存体系结构
Oracle数据库内存管理
内存管理要求Oracle实例的内存结构对数据库变化的需求保持最佳的尺寸。Oracle数据库管理内存是基于内存相关的初始化参数的设置。用于内存管理的基本选项如下:
l 自动内存管理
你指定了目标实例内存大小。数据库实例的自动调谐到目标内存大小,重新分配内存实例的SGA和PGA之间所需要的。 –11g新特性现在只设置一个内存参数就可以了
l 自动共享内存管理
这种管理模式是部分自动化。你设定的目标SGA的大小,然后可以选择单独设置PGA或管理PGA工作区的总目标大小。 –10g不同于9i的特性
l 手动内存管理
设置的总内存大小,而是你设置的初始化参数单独来管理组件SGA和实例PGA。
如果您创建一个数据库,数据库配置助手(DBCA)和选择基本的安装选项,然后自动内存管理是默认设置。
如果你用DBCA命令去创建了一个数据库,在基础的安装选项中,自动内存管理师默认选项。
See Also:
- “Memory Management”for more information about memory management options for DBAs
- “Tools for Database Installation and Configuration”to learn about DBCA
- Oracle Database 2 Day DBAandOracle Database Administrator’s Guideto learn about memory management options
用户全局区概述
用户全局区是一个session内存区域,它为会话变量所用,例如登陆信息,和一些其他被数据库session请求的信息。本质上来说UGA存储的是session状态。
如果一个session载入了PL/SQL包到内存,然后UGA就包含了包的状态,其中存储了一特定时间包变量所设置的值。默认情况下,在这个持久会话中包变量是唯一的。
UGA中也存储了OLAP页面池。该池管理OLAP数据的 页,他等同于数据块。页池在OLAP会话开始的时候创建,结束的时候被释放。无论用户什么时候请求一个空间对象的时候,一个OLAP的会话都会自动开启的。
在一个会话周期内UGA对于数据库必须是可用的。正是由于这个原因,当使用一个共享服务时UGA不可能被存储在PGA中,因为PGA对单独的进程是特殊指定的。因此,当使用共享连接的时候,UGA存在于SGA中的,以便于共享服务进程可以通过它。当使用专有连接服务连接,UGA是存储在PGA中的。
See Also:
l “Connections and Sessions”
l Oracle Database Net Services Administrator’s Guideto learn about shared server connections
l Oracle OLAP User’s Guidefor an overview of Oracle OLAP
程序全局区概述
PGA指定了一块内存,这块内存被进程或线程所共用,但并不被其他的系统进程或线程所共用。因为PGA是一个特定的进程,从来没有在SGA中分配。
PGA是一个包含会话相关的变量,需要通过专用或共享服务器进程的内存堆。服务器进程分配内存结构,它需要在PGA中。
对于PGA,可以类比成一个临时的台面工作区文件员。在这个比喻中,档案管理员代表客户(客户端程序)服务器进程在做的工作。管理员清除工作区中的一部分,使用工作区来详细的存储解客户的要求和客户所要求的文件夹进行排序,然后给出相应的空间当上述工作完成后。
下图显示了PGA实例并没有被共享服务所配置,你可以使用初始化参数去设置PGA的目标最大值。这个独特的PGA值可以在目标大小范围内增长变化。
PGA的内容
PGA是细分成不同的区域,每个区域都有不同的用途。图14-4显示了一个专用的服务器会话的PGA的可能内容。并非所有的PGA区域在每一个情况下都会存在。
私有SQL区域
一个私有的SQL区域包含SQL的解析的状态信息和其他特定会话的信息,当服务器进程执行的SQL或PL / SQL代码,过程中使用的专用SQL区存储绑定变量的值,查询执行状态信息,以及查询执行工作领域。
不要混淆私有SQL区,认为这是在UGA,共享SQL区,或是SGA中存储的执行计划。相同或不同的会话中的多个私有SQL区可以指向SGA中的一个单独执行计划。例如,20次执行SELECT * FROM Employees在一个会话中和10次在不同的会话中执行相同的查询可以共享相同的计划。每次执行的专用SQL区不共享,并可能包含不同的值和数据。
一个游标就是一个名字或是句柄对于一个特定的私有SQL区域,如图14-5所示,你可以想象成一个指针在客户端和服务端的声明。因为指针是与私有SQL区域紧密相连的,一些时候术语是互相使用的。
一个私有SQL区域被分为如下几个方面:
l 运行时区
此区域包含查询的执行状态信息。例如,运行时区跟踪全表扫描检索的行数。
Oracle数据库创建运行时区是执行请求的第一步。对于DML语句,当SQL声明被关闭的时候,运行时区会被释放。
l 持久性区域
这个区域包含绑定变量值。绑定变量值提供给SQL语句,当执行该语句时。只有当游标被关闭,持久性区域会被释放。
客户端进程负责管理私有SQL区域。私有SQL区的分配和释放,在很大程度上取决于应用程序,尽管一个客户端的进程能分配的私有SQL区的数量是由初始化参数OPEN_CURSORS限制。
虽然大多数用户依赖于数据库实用程序自动游标处理,Oracle数据库编程接口为开发者提供更多的控制权限在游标方面。在一般情况下,应用程序应该关闭所有打开的游标,将不能再次使用,释放持久的区域,并尽量减少应用程序所需的内存。
See Also:
- “Shared SQL Areas”
- Oracle Database Advanced Application Developer’s GuideandOracle Database PL/SQL Language Referenceto learn how to use cursors
SQL工作区
一个工作区是在PGA中被私有化的分配用于内存中密集型操作。例如,一个排序操作使用的排序区去排序调整一组行信息。同样,一个哈希联接操作使用散列区建立一个哈希表从左边输入,而一个位图合并使用位图合并区域合并多个位图索引扫描检索的数据。
如下查询计划:
SQL> SELECT *
2 FROM employees e JOIN departments d
3 ON e.department_id=d.department_id
4 ORDER BY last_name;
.
—————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————-
| 0 | SELECT STATEMENT | | 106 | 9328 | 7 (29)| 00:00:01 |
| 1 | SORT ORDER BY | | 106 | 9328 | 7 (29)| 00:00:01 |
|* 2 | HASH JOIN | | 106 | 9328 | 6 (17)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPARTMENTS | 27 | 540 | 2 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 |
—————————————————————————-
在例14-1中,运行时区跟踪全表扫描的进度。会话执行哈希联接在哈希区域通过两个表去行匹配。在排序排序区中执行order by操作。
如果要被处理的数据,不能插入到一个工作区,Oracle数据库将会把输入数据划分成更小的碎片。在这种方式中,当要把剩余且稍后要执行的数据写入到临时的磁盘存储中,数据库处理一些数据碎片在内存中。
数据库自动调谐工作区的大小,当启用自动PGA内存管理时。您也可以手动控制和调整工作区的大小。有关更多信息,请参阅“内存管理”。
用户可以对工作区的容量进行控制与调优。一般来说,更大的工作区能够显著地提高 SQL操作的性能,但代价是消耗更多的内存。最理想的情况是,工作区能够容纳 SQL语句的全部输入数据及额外的控制内存结构。否则语句的响应时间将增加,因为部分输入数据必须放入临时磁盘区。在极端情况下,如果工作区容量远小于输入数据,那么输入数据需要在临时磁盘区与工作区间多次交换。这将显著地增加 SQL操作的响应时间。
See Also:
Oracle Database Administrator’s Guideto learn how to use automatic PGA management
Oracle Database Performance Tuning Guideto learn how to tune PGA memory
PGA在共享和专用服务模式下的使用
PGA内存的使用依赖于数据库是否使用了共享连接还是专用连接。表14-1给出了不同:
内存区 |
专用服务器 |
共享服务器 |
|
||
会话内存(session memory)的性质 |
私有的 |
共享的 |
持续数据区(persistent area)的位置 |
PGA |
SGA |
SELECT语句的运行时区(run-time area)的位置 |
PGA |
PGA |
DML/DDL 语句的运行时区的位置
|
PGA |
PGA |
See Also:
Oracle Database Net Services Administrator’s Guideto learn how to configure a database for shared server
系统全局区概述
SGA是一个读/写存储器区域,与Oracle后台进程,构成了数据库实例。代表用户执行所有服务进程都可以读取信息,在SGA实例中。几个进程写信息到SGA中在数据库操作过程。
Note:
不驻留在SGA中的服务和后台进程,是存在于一个特殊的内存空间中的
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!