oracle PGA详解

2023-10-09 18:08
文章标签 oracle 详解 pga

本文主要是介绍oracle PGA详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  一、 PGA与SGA的区别。

  PGA(程序缓存区)与SGA (系统全局区)类似,都是Oracle数据库系统为会话在服务器内存中分配的区域。不过两者的作用不同,共享程度也不同。

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

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

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

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

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

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

  在程序缓存区内还包含着一个会话区。虽然绝大部分情况下,管理员不要维护这个会话区,可以让数据库系统进行维护。但是,管理员还是需要了解一下这个会话区的作用。因为这个会话区直接关系着数据库系统中数据的安全性。数据库系统不仅是存放数据的一个很好的载体,而且还提供了一个统一管理数据的平台,可以根据实际需要,为不同的用户设置不同的访问权限。简单的说,在数据库中可以控制用户可以访问哪些数据,从而提高数据的安全性。

  当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内。如此的话,用户进程在访问数据时,系统就会核对会话区内的用户权限信息,看看其是否具有相关的访问权限。由于系统将这个用户的权限信息存放在内存上,所以其核对用户权限的速度非常的快。因为系统不用再去硬盘中读取数据,直接从内存中读取。而从内存读取数据的效率要比硬盘上快几千倍。

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

        四、 堆栈区保存变量信息。

  有时候为了提高SQL语句的重用性,会在语句中使用绑定变量。简单的说,就是SQL语句可以接受用户传入的变量。从而用户只需要输入不同的变量值,就可以满足不同的查询需求。如现在用户需要查询所有员工的信息。然后其又要查询所有工龄在3年以上的员工等等。此时其实他们采用的是同一个SQL语句,只是传递给系统的变量不同而已。这可以在很大程度上降低数据库开发的工作量。这个变量在Oracle数据库系统中就叫做绑定变量。利用绑定变量可以加强与用户的互动性。另外在这个堆栈区内还保存着会话变量、SQL语句运行时的内存结构等重要的信息。

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

  五、 游标区。

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

  游标区是一个动态的区域。当用户执行游标语句时,系统就会在这个游标区内创建一个区域。当关闭游标时,这个区域就会被释放。这创建与释放,需要站用一定的系统资源,花费一定的时间。为此在使用游标时,如果频繁的打开和关闭游标,就会降低语句的执行性能。所以笔者建议,在写语句时,如果真的有必要使用游标技术时,则要注意游标不要频繁的打开和关闭。

  另外在Oracle数据库中,还可以通过限制游标的数量来提高数据库的性能。如在数据库系统中有一个初始化参数OPEN_CURSORS。管理员可以根据实际的需要,来设置这个参数,控制用户能够同时打开游标的数目。不过需要注意的是,在确实需要才有游标的情况下,如果硬件资源能够支持的话,那么就需要放宽这个限制。这可以避免用户进程频繁的打开和关闭游标。因为频繁的打开和关闭游标这对游标的操作是不利的,会影响数据库的性能。

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

这篇关于oracle PGA详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输