PGA详解

来源:互联网 发布:1995日本阪神地震数据 编辑:程序博客网 时间:2024/04/28 12:13

PGA详解

        当用户进程连接到数据库并创建一个对应的会话时, ORACLE服务进程会为这个用户专门设置一个PGA区, 用来存储这个用户会话的相关内容。 当这个用户会话终止时, 系统会自动释放这个PGA区所占用的内存。这个PGA区对于数据库的性能有比较大的影响, 特别是对于排序操作的性能。 所以, 在必要的时候合理管理PGA区, 能够在很大程度上提高数据库的性能。

一、 PGA与SGA的区别

        SGA系统全局区, 是对系统内的所有进程都是共享的。 当多个用户同时连接到一个例程时, 所有的用户进程、服务器进程都可以共享使用这个SGA区。为此这个SGA的主要用途就是为不同用户之间的进程与服务器进程提供一个交流的平台。 除了这个作用, 另外一个重要的作用就是各种数据库的操作主要就是在这个SGA区内完成。

        PGA程序全局区, 主要是为了某个用户进程所服务的。这个内存区不是共享的, 只有这个用户的服务进程本身才能够访问它自己的PGA区。做个形象的比喻, SGA就好象是操作系统上的一个共享文件夹, 不同用户可以以此平台进行数据方面的交流。 而PGA就好象是操作系统上的一个私有文件夹, 只有这个文件夹的所有者才能够进行访问, 其他用户都不能够访问。 虽然程序全局区不向其他用户的进程开放, 但是这个内存区仍然肩负着一些重要的使命, 如数据排序、权限控制等。

 

二、 为排序设置合理的排序区大小

        当用户需要对某些数据进行排序时, 数据是如何处理的呢? 首先, 数据库系统会将需要排序的数据保存到PGA程序全局区中的一个排序区内。然后再在这个排序区内对这些数据进行排序。 如需要排序的数据有2M, 那么排序区内必须至少要有2M的空间来容纳这些数据。 然后排序过程中又需要有2M的空间来保存排序后的数据。由于系统从内存中读取数据比从硬盘中读取数据的速度要快几千倍, 为此如果这个数据排序与读取的操作都能够在内存中完成, 无疑可以在很大程度上提高数据库排序与访问的性能。 如果这个排序的操作都能够在内存中完成, 显然这是很理想的。 但是如果PGA区中的排序区容量不够, 不能够容纳排序后的数据, 那会如何呢? 此时, 系统会从硬盘中获取一个空间, 用来保存这需要排序的数据。此时排序的效率就会降低许多。 为此在数据库管理中, 如果发现用户的很多操作都需要用到排序, 那么为用户设置比较大的排序区, 可以提高用户访问数据的效率。

        在ORACLE数据库中, 这个排序区主要用来存放排序操作产生的临时数据。 一般来说, 这个排序区的大小占据PGA程序全局区的的部分空间, 这是影响PGA区大小的主要因素。在小型应用中, 数据库管理员可以直接采用其默认的值。但是在一些大型的应用中, 或者需要进行大量记录排序操作的数据库系统中, 管理员可能需要手工调整这个排序区的大小, 以提高排序的性能。 如果系统管理员需要调整这个排序区大小的话, 需要通过初始化参数SORT_AREA_SIZE来实现。为了提高数据访问与排序的性能, 数据库系统利用内存比硬盘要快几千倍的事实, 会将准备排序的数据临时存放到这个排序区, 并在排序区内完成数据的排序。 管理员需要牢记这个原则, 并在适当的情况下调整排序区的大小, 以提高数据访问与数据排序的性能。

 

三、 会话区保存着用户的权限等重要信息

       在PGA内还包含着一个会话区。虽然绝大部分情况下,  管理员不需要维护这个会话区, 可以让数据库系统进行维护。但是管理员还是需要了解一下这个会话区的作用。因为这个会话区直接关系着数据库系统中数据的安全性。

       当用户进程与数据库建立会话时, 系统会将这个用户的相关权限查询出来, 然后保存在这个会话区内。如此的话, 用户进程在访问数据时, 系统就会核对会话区内的用户权限信息,  看看其是否具有相关的访问权限。 由于系统将这个用户的权限信息存放在内存上, 所以其核对用户权限的速度非常的快。

       通常情况下,  这个会话区内保存了会话所具有的权限、角色、性能统计等信息。 这个会话区一般都是由数据库进行自我维护的, 系统管理员不用干预

 

四、堆栈区保存变量信息

       有时候为了提高SQL的重要性, 会在语句中使用绑定变量。简单的说, 就是SQL语句可以接受用户传入的变量。从而用户只需要输入不同的变量值, 就可以满足不同的查询需求。这个变量在ORACLE数据库系统中就叫做绑定变量。 利用绑定变量可以加强与用户的互动性。 另外杂这个堆栈区内还保存着会话变量、SQL语句运行时的内存结构等重要信息。

       通常情况下, 这个堆栈区跟上面讲到的会话区一样, 都可以让数据库系统进行自我维护, 而管理员不用参与到其中。 这些分区的大小, 也是系统根据实际情况来进行自动分配的。 当这个用户会话结束时, 系统会自动释放这些区所占用的空间

 

五、游标区

        当运行使用游标的语句时,  ORACLE数据库系统会在程序全局区为其分配一块区域。 这块区域就叫做游标区。 通常情况下, 游标用来完成一些比较特殊的功能。而且一般来说,采用游标的语句要比其他语句的执行效率低一点。为此管理员在使用游标的时候, 还是需要慎重。

        游标区是一个动态的区域, 当用户执行游标语句时, 系统就会在这个游标区内创建一个区域(个人觉得应该是在程序全局区为游标创建一个区域???), 当关闭游标时, 这个区域就会被释放。这创建与释放, 需要占用一定的系统资源, 花费一定的时间。 为此在使用游标时,  如果频繁的打开和关闭游标时, 就会降低语句的执行性能。所以在写语句时, 如果真的有必要使用游标时, 则要注意游标不要频繁的打开和关闭。

        另外在ORACLE数据库中, 还可以通过限制游标的数量来提高数据库的性能。 如在数据库系统中有一个初始化参数OPEN_CURSOR。管理员可以根据实际的需要, 来设置这个参数, 控制用户能够同时打开游标的数目。

       

        从以上的分析可以看出, 程序全局区主要包含排序区、会话区、堆栈区和游标区四个部分的内容, 它们各司其职, 完成用户进程与数据库之间的会话。通常情况下,  系统管理员主要关注的是排序区, 在必要需要手工调整这个排序区的大小。 另外需要注意的是, 游标区是一个动态的区域, 在游标打开时创建, 关闭时释放。故在数据库开发时, 不要频繁的打开和关闭游标可以提高游标操作的效率,改善数据库的性能。其他分区的内容管理员只需要了解其用途,日常的维护交给数据库系统来完成即可。

 

       注意:

       以下是针对专用服务器和共享服务器关于PGA的会话区的补充:  SESSION INFORMATION(用户会话信息)在独占服务器中与在共享服务器中的所处的内存位置是不同的。

 

0 0