ITPub博客

首页 > 数据库 > Oracle > 工作第15天记录—oracle concepts

工作第15天记录—oracle concepts

Oracle 作者:weiwangw 时间:2013-11-02 21:16:18 0 删除 编辑

共享的SQL区域

数据库表现每一个运行在下面SQL区域的SQL命令;

· 共享的SQL区域

数据库使用共享的区域来处理一条SQL命令的第一次事件。这个区域对于所有用户都可访问并且包含语句解析和执行计划。对于一个唯一的语句只有一个共享区域存在。

· 私有SQL区域

工作第15天记录—oracle <wbr>concepts

每个会话发出一个SQL语句在它的PGA中有个私有的SQL区域。

每个用户提交相同的语句都有一个私有的SQL区域指向相同的共享SQL区域。因此,很多在单独PGA里面私有的SQL区域可以联系相同的共享SQL 区域。

 

数据库自动的决定当应用提交相似的SQL语句。数据库同时考虑由用户直接发出的SQL语句和应用并且由其它语句内部的发出递归的SQL语句。

 

数据库执行以下的步骤:

1、检查共享池去查看是否存在一个共享的SQL区域在语法上和语意上存在相同的声明:

· 如果一个相同的语句存在,那么数据库试用共享SQL区域来执行后续新实例的执行语句,因此减少了内存的消耗。

 

· 如果一个相同的语句不存在,那么数据库在共享池里面分配一个新的共享SQL区。具有相同的语法但是不同的声明的语句使用一个子游标。

 

在这两种情况下面,私有的SQL区域用户指向的共享SQL区包含语句和执行计划。

 

2、分配一个代表会话的私有SQL区域

私有SQL区域的位置取决于已经连接的会话。如果一个会话通过共享服务连接,那么私有SQL区域的部分将会保留在SGA中。

 

14-10显示了一个专用的服务器架构两个会话保持相同的SQL语句副本在它们独有的PGAs中。在一个共享的服务器是在UGA的,在大型池或者在共享池当大型池没有的时候。

工作第15天记录—oracle <wbr>concepts

程序单元和库缓存

库缓存拥有PL/SQL程序和JAVA类的可执行形式。这些项目被统称为程序单元。

 

数据库执行程序单元类似执行SQL语句。例如,数据库分配一个共享区域去保持解析,一个PL / SQL程序的编译形式的。数据库分配一个私有的区域来维持特殊的值来运行程序的会话,包括本地,全局,和包变量,和执行SQL的缓存区。如果多个用户运行同一个程序,每个用户维护一个单独的副本,他或她的私有SQL区,来维持会话指定值,和访问一个单一的共享SQL区域。

 

数据库处理单独的SQL语句在一个PL/SQL程序单元作为前面的描述。尽管他们起源在同一个PL/SQL单元,这些SQL语句使用共享池来维持解析表述和一个滴油的区域为每个会话运行命令。

 

在共享池里面分配和回收内存

数据库分配共享内存当一个新的SQL语句被解析。内存的大小取决于语句的复杂性。

 

一般的,一个在共享池项目保留直到它通过一个LRU运算法则移除。数据库允许共享池项目被很多任然在内存中的会话使用只要他们是有用的即使程序创建的项目被终止。这个即使最大程度的减少开销和出库SQL语句。

 

如果新的项目需要空间,那么数据库对于不常使用的项目释放内存。一个共享SQL区域可以从共享池移除即使共享池里面有一个不常使用的游标被打开了。如果随后打开的游标用于运行语句,那么oracle数据库重新解析该语句并分配一个新的共享SQL区域。

数据库在以下环境下面也从共享池里面移除一个共享的SQL区域。

 

· 如果统计信息被收集成一个表,表集群,或者索引,那么默认的数据库逐步的移除所有的共享SQL区域包含了使用一段时间后使用分析对象的语句。接下来的时间移除语句运行,数据库用一个新的共享SQL区域解析来反映统计架构对象信息。

 

· 如果在一个SQL语句里面引用一个架构对象,并且这个项目最后被一个DDL语句修改,然后数据库使得SQL共享区域无效。在下一次启动的时候优化器重新解析语句。

 

· 如果你改变全局数据库的名字,那么数据库从共享池里面移除所有的信息。

你可以使用ALTER SYSTEM FLUSH SHARED_POOL语句去手动的移除所有在共享池里面的语句,实例重新启动后评估预期表现的性能

 

数据字典缓存区

这个数据字典是数据库表和视图包含的涉及的信息的一个收集关于数据库,它的结构,和它的用户。oracle数据库频繁的访问数据字典在SQL语句解析的时候。

 

数据字典被访问的是如此的平凡,数据库在下面特殊的内存位置是专门用来存储数据字典数据而设计的:

· 数据字典缓存区

这个缓存区保留关于数据库对象的信息。这个缓存区也被叫做行缓存区因为它拥有的数据行而不是高速缓存器。

 

· 库缓存

所有服务进程共享这些缓存来访问数据字典信息。

 

服务器结果缓存

不像buffer池,服务器结果缓存区存储结果设置而不是数据块。服务器结果缓存包括SQL查询结果缓存区PL/SQL函数结果缓存区,共享相同的基础设施。

 

客户端结果缓存区不同于服务器结果缓存区。客户端缓存区在软件水平被配置并且坐落在客户端内存,不是数据库内存。

 

SQL查询结果缓存区

数据库可以存储查询的结果和在SQL查询结果缓存区片段,使用缓存区结果为将来的查询和查询片段。绝大多数的应用从这些性能的提升获得益处。

 

例如,假设一个应用运行重复的使用形同的SELECT语句。如果结果被缓存,那么数据库立即的返回。用这种方法,数据库避免了复杂的记录块和再计算结果的需要。数据库自动的似的一个缓存的结果无效无论何时事务修改数据或者数据库对象的元数据使用用于构建缓存的结果。

 

用户可以注解查询或查询片段与RESULT_CACHE提示来指出数据库应该在SQL查询结果缓存区存储结果。RESULT_CACHE_MODE初始化参数取决于SQL查询结果缓存区是用来所有的查询或者仅仅是一个注释查询。

 

PL/SQL 函数结果缓存区

PL/SQL 函数结果缓存区存储函数结果设置。没有缓存,1000调用一个函数以1秒每次通话会采取1000秒。有缓存,1000函数调用相同的输入可能需要总共1秒。很好的结果缓存的代表是频繁的撤销函数依靠相对静态的数据。

    

PL/SQl函数代码可以包括一个请求去缓存它的结果。当调用此函数时,系统检查缓存区。如果缓存区包含从一个先前的函数调用相同参数值的结果,那么系统返回缓存结果来撤消并且没有执行函数主题。如果这个缓存没有包含结果,那么系统执行函数体并且添加结果(为这些参数值)到缓存区在控制权返回给调用者之前。

 

工作第15天记录—oracle <wbr>concepts

缓存区可以聚集很多结果每一个唯一的团体的参数值的结果伴随每一个结果缓存函数被撤销。如果数据库需要更多的内存,那么它排除一个旧的或者更多的缓存结果。

 

存储池

存储池是一个在共享池里面的内存区域oracle数据库可以使用分配大的连续的内存块。

 

从共享池分配内存是自大块中执行。大块允许大的对象(超过5KB)装载到缓存器中不需要一个单独的连续区域。用这种方法,数据库减少了因为碎片而跑出连续内存的可能。

 

稀有的,javaPL/SQL,或者SQL游标可能分配查获5K的共享池。为了让这些分配有效的发生,数据库隔离少量保留池共享池。

 

大型池

大型池是一个可选的内存区域用于内存分配比适当的共享池大。大型池可以提供大的内存分配:

·  UGA共享服务器和oracle XA接口(用来与多个数据库交易)

· 用于在并行执行的语句的消息缓冲器

· 缓冲器恢复管理器( RMAN I / O从属

靠从大型池里面分配会话内存为共享的SQL,数据库避免由压缩共享SQL缓存区引起的性能的开销。为RMAN操作在大buffer中分配内存,I/O服务器进程,和并行的缓存器,大型池比共享池更能满足对大内存的需求。

工作第15天记录—oracle <wbr>concepts

 

大型池与共享池里面预留的空间不同,使用共同的LRU列表作为从共享池的其他内存分配。很多块被分配的内存和不能被释放知道他们完成正在使用的。一旦大块的内存被释放,其它程序可以使用它了。

 

Java

Java是一个内存区域可以存储所有指定会话的Java代码并且在Java 虚拟机里面的数据。这个内存包括Java体迁在通话结束后移到Java会话空间。

 

对于专用的服务器连接,Java池包括每个Java类的共享部分,包括方法和只读内存就像代码载体,但是不是每个会话Java的状态。对于共享服务,包括共享池的一部分,每个类和一些UGA用于每个会话的状态。每个UGA按需增长和压缩,但是整个UGA的大小必须适应Java池的空间。

 

Java池顾问统计提供信息关于Java库缓存区内存使用并且预料怎样的改变Java池大大小可以影响解析率。Java池顾问内部的转储当statistics_level被设置成典型的或者更高的。当顾问被关掉的时候这些统计被重置。

 

流池

流池存储高速缓存器的队列消息并且为oracle流捕获流程和申请流程提供内存。流池是专门的被oracle流使用的。

 

除非你制定去配置它,流池开始的大小为0。池的大小按oracle流的需求动态的增长。

 

固定的SGA

固定的SGA是一个内部的管理区域。例如,固定的SGA包括:

· 一般的关于数据库和实例的状态的信息,后台进程需要去访问

· 在程序间交流的信息,像关于锁的信息

 

软件代码区域的概述

软件代码区域是内存的一个部分从存储正在运行的或者可以运行的代码。oracle数据库代码存储在一个软件区域通常比用户区域要有给你更多的独立和保护。

 

软件区域通常是静态的大小,只有当软件升级或者重新安装的时候改变。这个区域的需求大小取决于操作系统。

 

软件区域是只读的并且可以安装共享和不共享。一些数据库工具和单元,就像oracle表单和SQL*Plus,可以被安装共享,但是有些不能。当可能的时候,数据库代码被共享那么所有的用户可以访问二不用在内存中的多个副本,造成在主存储的减少并且整体性能得以改善。一个数据库的多个实例可以使用相同的数据库代码区域伴随不同的数据库如果运行在同一台机器上面的话。

工作第15天记录—oracle <wbr>concepts

     

 

 

 

 

 

 

 

 

 

 


15 进程结构

这个章节讨论在一个oracle数据库里面的程序

 

进程的介绍

进程是一个操作系统的机制可以执行一系列的步骤。这个机制取决于操作系统。比如说,在linux上面,一个oracle的后台就进程就是一个linux进程。在windows上面,一个oracle后台进程是一个线程内的执行过程。

 

代码模式被程序用来跑。所有连接到oracle数据库的用户必须运行下面模式去访问一个数据库实例:

· 应用或者oracle数据库单元

一个数据库用户运行一个数据库应用,就像一个预编译程序或者一个数据库工具就像SQL*Plus,发出SQL语句到一个数据库。

· oracle数据库代码

每个用户都有他或她的代表Oracle数据库上执行的代码编译和处理应用的SQL语句。

 

一个进程一般的运行在它私有的内存区域。大多数进程可以周期性的写到一个关联的文件。

 

多进程的oracle数据库系统

多进程的oracle(也叫做多用户的oracle)用户几个进程运行Oracle数据库的代码和为用户添加进程--- 不管是每一个连接用户还是多个用户共享一个或者多个进程。绝大多数的数据库都是多用户的因为一个数据库主要的优点就是同时的由多个用户去管理数据。

每个在数据库实例里面的进程执行一个特殊的工作。把数据库的工作和应用分成一些进程,多个用户和应用可以同时的连接到一个实例当系统提供了良好的性能。

 

进程的类型

一个数据库实例包括或者相互作用下面类型的进程

· 客户端进程运行应用程序或者oracle工具代码

· oracle进程运行oracle数据库代码。oracle进程包括下面的子类型:

--- 后台进程

   跟实例一起启动并且执行维护测试,例如执行实例恢复,清理进程,把重做缓存写到磁盘,等等

 

--- 服务器进程

   执行基于客户端请求的工作。

   例如,这个进程解析SQL查询,把他们放在共享池,创建和执行查询计划为每一个查询,并且从数据库高速缓存区高速缓存读取高速缓存区或者从磁盘


工作第15天记录—oracle <wbr>concepts


   

--- 从进程

   为一个后台或者服务器进程执行添加任务

 

这个进程的类型是多样的取决于操作系统和oracle数据库选项的选择。例如,连接的用户的代码可以被专有服务器读取或者共享服务器连接配置。在一个共享服务结构,每个服务器进程运行数据库的代码可以服务多个客户端进程。

 

15-1显示了SGA和后台进程使用专有服务器连接。对于每一个用户的连接,应用是被一个客户端进程运行的这跟专有服务器进程运行数据库代码是不同的。每个客户端进程属于它自己的进程,拥有它自己的PGA

工作第15天记录—oracle <wbr>concepts

 

客户端进程的概述

当一个用户运行一个应用像Pro*C 程序或者SQL*Plus,这个操作系统创建了一个客户端进程(有些时候叫做用户进程)去运行用户的应用。客户端应用连接到oracle数据库提供了APIs的需求跟数据库去交流。

 

客户端和服务器进程

客户端进程和oracle进程直接的和实例相互作用有很大的不同在许多重要方面不同。oracle进程服务客户端进程可以从SGA中读和写,然而客户端进程不可以。一个客户端可以泡在一个主机上面而不是数据库主机,然而oracle进程不可以。

 

例如。假设一个在客户端主机上的用户启动了SQL*Plus并且通过网络连接到在一个不同主机上的数据库SAMPLE(数据库实例没有启动)

SQL> CONNECT SYS@inst1 AS SYSDBA

Enter password: *********

Connected to an idle instance.

 

在客户端主机上面,无论是sqlplus还是sample的进程搜索直线式sqlplus 客户端进程:

 

在一个数据库主机上面无论是sqlplus还是sample的一个进程搜索显示了一个服务器进程在一个非本地的连接,但是没有客户端进程。

 

连接和会话

一个连接时一个在客户端进程和数据库实例之间的一个物理的通信通路。一个通信途径被建立可用的进程间通信机制或者网络软件。典型的,一个连接发生在客户端进程或者服务器进程或者调度员,但是它也可以发生在客户端进程和oracle连接管理(CMAN

 

一个会话是是在数据库实例内存的一个逻辑的实体代表当前用户状态登录到数据库。例如,当一个用户被一个数据库密码认证,一个会话被建立为这个用户。一个会话的持续的时间是用户被数据库认证知道用户断开或者推出数据库应用。

 

一个单独的连接可以由01或者更多的会话建立在上面。这个会话是独立的:在一个会话中一个提交不会影响在其它事务中的会话。


     工作第15天记录—oracle <wbr>concepts



多个会话可以同时的存在为一个数据库用户。如图15-2中显示,用户hr可以有多个连接到一个数据库。在专有服务器连接,数据库在每个连接的上面创建了一个服务器进程。只有客户端进程会引起专有服务器去创建和使用。在一个共享的服务器连接,很多客户端进程访问一个单一的共享服务器进程。

工作第15天记录—oracle <wbr>concepts

 

15-3解释了万一用户hr有一个单一的连接到一个数据库,但是连接有两个会话。

工作第15天记录—oracle <wbr>concepts

 

产生以一个SQL语句执行统计重建的情节的跟踪报告在图15-3.例子15-2连接SQL*Plus到数据库作为用户的系统比启动跟踪,因此创建了一个新的会话(样本输出)

工作第15天记录—oracle <wbr>concepts

 

DISCOUNNECT命令在例子15-1中确实结束了会话,不是连接。打开一个新的中终端并且链接到实例作为一个不同的用户,在例子15-2中的查询显示了从例子15-1中的连接还是活动的。

工作第15天记录—oracle <wbr>concepts

 

服务器进程的概述

Oracle数据库创建服务进程来处理客户端连接到该实例的进程的请求。一个客户端进程往往通过一个单独的服务器进程来跟数据库交流。

 

服务器进程创建在一个数据库应用之上可以执行一个或者多个的任务:

· 解析和运行通过应用发出的SQL语句,包括创建金和执行查询计划

· 执行PL/SQL代码

· 从数据文件中读取数据块到数据库的高速缓存

· 用这样的方式返回结果应用可以处理信息

 

专有服务器进程

在专有服务器连接,客户端连接关联一个并且只有一个服务器进程。在linux上面,20个客户端进程链接到一个数据库实例有20个服务器进程服务。

 

每个客户端进程直接的和它的服务器进程交流。会话期间,该服务器进程是专门为它的客户端进程。服务器进程存储进程制定的信息和UGA在他的SGA中。

 

共享服务器进程

在一个共享的服务器连接,客户端应用程序连接网络的调度程序进程,不是一个服务器进程。例如,20个客户端进程可以连接到一个单一的调度进程。

 

调度进程收到连接客户端的请求并且把他们放在一个大型池的请求列队里面。第一个可用的共享服务器把结果放到一个专有的相应队列中。这个调度进程监视这个队列并且发送结果到客户端。

 

就像一个专有的服务器进程,一个共享的服务器进程有它自己的PGA。然而在SGA中一个会话的UGA那样任何共享服务器可以访问会话数据。

 

后台进程的概述

一个多进程oracle数据库使用一些添加进程叫做后台进程。后台进程执行维护任务需要去操作数据库和为多个用户提供最大化的性能。

 

每个后天进程都有一个独立的任务,但是和其他的进程一起工作。例如,LGWR进程从重做日志缓存到联机重做日志写数据。当一个满的日志文件准备好被归档,LGWR发出信号italian的进程去归档文件。

 

oracle数据库自动的创建后台进程当一个数据库实例启动的时候。一个实例可以有很多的后台进程,并不是所有的始终存在于每个数据库配置。下面的查询列出了运行在数据库上面的后台进程:

SELECT  PNAME

FROM  V$PROCESS

WHERE  PNAME  IS  NOT  NULL

ORDER  BY  PNAME;

 

强制性后台进程

强制性的后台进程出现在多有典型的数据库配置中。这些进程默认的运行在一个数据库启动伴随的最小的配置初始化参数文件

 

程序监视进程(PMON

PMON监视其它的后台进程和执行进程恢复当一个服务器或者调度程序被异常的终止。PMON负责清理数据库高速缓存器高速缓存和释放正在使用的客户端进程的资源。例如,PMON充值活动事务表的状态,释放不在需要的锁,从活动进程列表移除进程ID

 

PMON也注册关于实例的信息和与oracle Net listener调度进程。当一个实例启动,PMON传递给它相关参数。如果它没有在运行,那么PMON定期的尝试连接它。

 

系统监视进程(SMON

SMON负责各种垃圾级的清理工作。SMON的分配职责包括:

· 在一个实例启动的时候执行实例恢复,如果需要,在一个oracle RAC数据库中,数据库实例的SMON进程可以为一个失败的实例进行实例恢复。

 

· 恢复终止的会话那些在实例恢复的时候因为文件读或者表空间离线错误被跳过的。当表空间或者文件变成在线的时候SMON恢复这个事务。

 

· 清理没用的临时段。例如。当创建一个索引的时候oracle数据库分配一个区。如果这个操作失败了,那么SMON清理临时表空间

 

· 凝聚连接自由的区在数据字典管理的表空间里面。

SMON有规律的检查是否需要。其它进程可以调用SMON如果他们需要它检测的时候。

 

数据库写进程

数据库写进程(DBWn)把数据库缓存的目录写到数据文件。DBWn进程在数据库缓存器缓存写修改到磁盘。

 

虽然一个数据库写进程对大多数系统来说是足够的,你可以配置添加进程---DBW1通过DBW9DBWa通过DBWj—来提高写的性能如果你的系统有大量的修改数据。这些添加的DBWn进程是没用的在但处理系统上。

 

· 当一个服务器进程不能找到一个干净的可重复使用的缓存区在扫描一个阈值数缓存以后,它发出信号让DBWn写。DBWn异步的写脏的缓存区到磁盘如果可能在执行其它进程的时候。

 

· DBWn周期性的写缓存到推进检查点,是在redo thread里面的一个位置从实例恢复开始。这个检查点的日志位置是由buffer cache里面最旧的脏缓存决定的。

 

在许多情况下, DBWn进程写入的块分散在整个磁盘,因此,写往往比由LGWR进程执行的顺序写入慢DBWn执行多个块的写当效率提高的时候。在多个块里面的写的操作是变化的取决于操作系统。

 

日志写进程(LGWR

日志写进程管理重做日志缓存。LGWR写入联机重做日志缓冲区的一个连续的部分。通过分离的修改数据库缓冲区的任务,执行散落的脏缓冲区​​写入磁盘,并且执行快速的顺序写入重做到磁盘,数据库提高了性能。

 

在下面的环境中,LGWR写所有那些已经被复制进缓存的重做条目从最后一次它写:

·一个用户提交一个事务

·一个联机重做日志切换发生

·从最近一次LGWR发生后已经过去3秒了

·重做日志缓冲区的三分之一完整或包含1 MB的缓冲数据。

·DBWN必须修改的缓冲区写入磁盘。

DBWn可以写一个脏的缓存区之前,关于改变到缓存区的重做记录必须被写到磁盘(提前写协议)。如果DBWn发现一些重做记录没有被写,发出信号给LGWR把记录写道磁盘并且等待LGWE完成在把数据缓存写到磁盘之前。

 

LGWR 和提交

oracle数据库使用一个快速的提交机制来提高提交事务的性能。当一个用户发出一个COMMIT语句,事务被分配一个SCN号。LGWR在重做日志缓存区提交一个记录并且立即直接的把它写到磁盘,伴随一起提交的SCN和交易的重做条目。

 

重做日志缓存区是循环的。当LGWR从重做日志缓存区写重做条目到一个联机重做日志缓存区,服务器进程可以复制​​新条目已写入到磁盘的重做日志缓冲区中的条目。LGWR正常的写的足够快来确定空间始终是可用的在一个新条目的缓存中,即使访问到联机重做日志是繁重的。

 工作第15天记录—oracle <wbr>concepts


原子写入重做条目包括事务的提交记录是单一的项目由提交的事务决定。oracle数据库返回一个成功的代码来提交事务虽然这些数据缓存还没有被写到磁盘。当前到数据块的改变被延迟直到DBWn生效把他们写道数据文件里面。


     

 

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22921930/viewspace-1117424/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-11-24