oracle服务器结构01

Oracle 服务器结构

Oracle服务器的总体结构

oracle服务器结构01

  • Oracle服务器由实例(instance)和数据库两大部分构成。实例是一组内存结构和Oracle后台进程的集合;数据库则是由多个操作系统文件组成,包括数据文件、控制文件和日志文件。

Oracle实例

  • Oracle实例由SGA(System Global Area)内存结构和Oracle后台进程组成。 当用户启动(start)实例时,Oracle 将自动地为SGA分配内存并启动后台进程,实 例运行后,用户可以访问实例,由实例来访问数据库。实例相当于用户和数据库的中间层。 当用户关闭(shut down)实例时,由操作系统负责回收内存。每个实例都有自己的 SGA,并且,每个实例同时只能访问一个数据库。 Oracle 数据库实例(Instance) = 内存结构(SGA) + 后台进程(Background Process)。

Oracle 内存结构

  • Oracle的内存由系统全局区(SGA/System Global Area)和程序全局区(PGA/Program Global Area)组成。

1.SGA

  • SGA的构成要素如下:
构成要素 描述
Buffer Cache 在数据存储到数据库之前,可以查询或者修改数据,但是必须从磁盘中读取并且存储在Buffer Cache中。所有的用户程序都会连接到数据库共享次访问。为了获得最佳效率,Buffer Cache必须足够大,以避免频繁进行磁盘的读写操作
Share Pool Share Pool用于快速存取数据,可共享的信息如下:SQL中可被重复使用的语句;从数据字典中包含的信息,例如用户账户数据、表格和索引的描述;存储过程,也就是原本被存储在数据库中的执行代码
Redo Log Buffer 此Buffer区利用快速存取Redo提高性能,直到它可被写入Redo Log Files并存储在磁盘中
Large Pool 被使用在Buffer Large I/O请求各种服务的程序
Java Pool 是一个内存区块,用于所有在Java虚拟机中特定的Java代码以及数据
Streams Pool 是一个内存区块,用于Oracle Stream功能
Result Cache 此Result Cache 用于查询结果。当查询的是已经在Result Cache中运行的结果时,会从Result Cache中返回结果,而不是重新查询。这个功能加快了经常使用的查询

oracle服务器结构01

  • 1.1 Buffer Cache
  • 在Oracle 中无论是读取还是修改数据,都是由服务器进程在数据库高速缓冲区中完成 的。数据库高速缓冲区的作用就是用来缓存最近从数据库中读出的数据块,并可供其他客户 进程共享。用户进程查看数据时,首先检查需要的信息是否在缓冲区内,如果在缓冲区中, 就可以直接访问,否则访问物理文件并读取数据块到数据库缓冲区。我们知道内存的读写速 度要比物理设备的读写速度快很多,这样就可以大大提高Oracle 数据库的性能。
  • Oracle数据库支持多个区块大小,当使用非标准区块大小来建立一个表格空间时,必须配置这些非标准区块大小的Buffer,以适应这些表格空间。每个数据库都可以通过参数DB_BLOCK_SIZE 指定标准块大小(2k、4k、8k、16k、 32k),默认为8k。但是Oracle 数据库同时支持多种块大小,我们称这些标准块以外的块为 “非标准大小块”。 非标准大小块的高速缓冲区大小指定以下参数(DB_nK_CACHE_SIZE,n可取2,4,8,16,32)
  • DBA可以通过创建多个缓冲池来提高数据库缓冲区高速缓存的性能。用户可以指定方案对象(schema object)来使用相应的缓冲池,以便控制数据被移出缓存区的时机。Oracle使用LRU算法来管理数据高速缓冲区。
    oracle服务器结构01
  • 1.2 Share Pool
  • SGA 的共享池(Shared Pool)内包含了库缓存(Library Cache),数据字典缓冲区 (Dictionary Cache),并行执行消息缓冲区(Buffers for parallel execution messages), 以及用于系统控制的各种内存结构。 共享存储区的大小由SHARED_POOL_SIZE 初始化参数来决定。同数据高速缓冲区一样,他的大小可以动态的修改。
    oracle服务器结构01
  • 1.2.1 数据字典缓冲区
  • 数据字典是一系列保存了数据库参考信息(例如数据库结构,数据库用户等)的表和视 图。Oracle 需要频繁地使用经过解析的SQL 语句访问数据字典。数据字典信息对Oracle 能否正常运行至关重要。
  • 数据字典是用来描述数据库数据的组织方式的,由表和视图组成。
  • 数据字典由脚本$oracle_home/rdbms/admin/catalog.sql 创建。
  • 视图有三种实例:
    • user_*(当前用户所拥有对象的有关信息),
    • all_*(当前用户可访问对象 的信息),
    • dba_*(数据库中所有对象的信息)。

在Oracle 数据库中,数据库的一些信息,包括账户、数据文件、表的描述、用户权限 等信息,存储在数据字典表中,数据字典表被存放在SYSTEM 表空间的数据文件中。
因为执行任何SQL 语句都需要访问数据字典,所以为了提高数据字典的访问性能, Oracle 在共享池中专门为存放数据字典信息分配了内存空间,这些内存空间被称为数据字典高速缓冲区。用来缓存来自于数据字典的定义。

  • 例如,当用户执行SELECT * FROM emp WHERE empno=7788 语句时,Oracle 需要 查询数据字典dba_tables 确定表emp 是否存在;如果该表已经存在,还需要查询数据字典 dba_tab_columns 确定列empno 在表emp 中是否存在,然后才能生成执行语句的过程(执行计划)。这些定义在首次查询时存入数据字典高速缓冲区,在后续过程中用到就可以直接使用,而不必重新查询数据字典。
  • 1.2.2 库高速缓存
    -库高速缓冲区又可分为共享SQL 区和共享PL/SQL 区。
  • 共享SQL 区用来存放最近执行的SQL 语句信息,包括语句文本、解析树及执行计划。 执行计划就是Oracle 为执行特定的SQL 语句,产生的优化的执行步骤。
  • 库高速缓冲区由许多上下文区(Context Area)组成,SQL 语句和执行计划存放在相应上 下文区中,并且不同SQL 语句分别对应于不同的上下文区。当客户端运行SQL 语句时,服务器进程首先检查是否存在对应于该SQL 语句的上下文区,若存在,则按照其执行计划直 接执行该SQL 语句;否则生成SQL 语句执行计划,并将执行计划、SQL 语句存放到相应上下文区中,然后执行该SQL 语句。
    在开发应用程序时,必须要注意使用标准格式来编写SQL 语句,使得SQL 语句尽可能共享上下文区,以降低SQL语句解析次数,进而提高应用性能。
  • 在解析SQL 语句时,认为完全相同的SQL 语句有以下特点:
    ● 语句文本相同。
    ● 大小写相同。
    ● 赋值变量相同。
  • 共享PL/SQL 区用来存放最近执行的PL/SQL语句,解析和编译过的程序单元和过程函数、包和触发器)也存放在此区域。类似于数据高速缓冲区,Oracle 也是使用LRU 算法来管理库高速缓存的。通过库高速缓存,可以最小化SQL语句解析次数,进而提高应用程序的性能。
    -1.3 Redo Log Buffer
  • 当运行Oracle 服务器的时候,如果突然断电或系统瘫痪,会不会造成数据的丢失?
  • Oracle 提供了一套复杂的机制来维护数据完整性,并最终确保数据不会丢失。这就是重做 日志文件的作用。 重做日志缓冲区用来记录对数据缓冲区数据进行的修改,可以循环使用。当用户运行 DML(INSERT、UPDATE、DELETE)以及DDL(CREATE、ALTER、DROP)语句时,会改 变数据高速缓存中的相应缓冲区。但是在修改这些缓冲区之前,Oracle 会自动生成重做项, 首先要将这些缓冲区的变化记载到“重做日志缓冲区”中。重做日志缓冲区由一条一条的重 做项构成,每条重做项记载了修改的时间、被修改的块、修改位置以及新数据。缓冲区被循 环使用,当重做日志缓冲区填满时,数据库系统将重做日志缓冲区的内容写入日志文件。在系统发生故障时,可以通过重做项重新执行对数据库的修改,实现对实例的恢复。 重做日志缓冲区的大小由LOG_BUFFER 初始化参数来决定。

2.PGA

  • 当客户进程访问Oracle服务器时,会在Oracle服务器端为用户进程分配相应的服务进程,并且为该服务进程分配相应的内存空间来存放其数据和控制信息,每一个后台进程也同样需要为其分配专用的存储空间,这块内存空间被称为程序全局区(Program Global Area 或 Process Global Area )。如图2-4 表示为服务进程专门分配PGA 存储区。
    oracle服务器结构01
  • 所有进程都可共享SGA,而PGA 是非共享的。当建立服务进程或后台进程时,Oracle会自动为其分配PGA;而当服务进程或后台进程终止时,Oracle 会自动释放PGA 所占用的内存空间。
  • SGA是公共场所,你去也在,不去也在,比如:公园,有没有人去逛公园,公园永久存在。
  • PGA是私有场所,你去了才有,不去,是没有的,比如:私家车,你开出去了,别人才知道你有车,你不开出去,谁知道你有车呢。
  • PGA 通常被用于处理SQL语句、处理登录及其他Session等信息。其中一大部分的PGA是专门用于SQL工作区,也就是执行内存区块排序和其他SQL的操作。PGA内存的使用量内容取决于Instance是运行在专用服务器还是共享服务器上,,但大致可分为几部分:
  • 1)私有SQL区
    私有SQL区中包含绑定信息及运行时内存结构等数据。每个提交了SQL语句的Session都有自己的私有SQL区,每个提交了相同SQL语句的用户都有自己的私有SQL区,但她们使用同一个共享SQL区。即多个私有SQL去可以和同一个共享SQL区相联系。
  • 2)会话内存
    会话内存是位会话变量和会话有关信息分配的内存。对共享服务器模式,会话内存也是共享的。
  • 3)SQL工作区
    SQL工作区用于排序(Sort)、哈希连接、位图合并和位图创建。该区域大小即可控制也可以自动调整。用户可以对工作区的容量进行控制与调优。一般来说,更大的工作区能够显著地提高 SQL 操作的性能,但代价是消耗更多的内存。最理想的情况是,工作区能够容纳SQL 语 句的全部输入数据及额外的控制内存结构。否则语句的响应时间将增加,因为部分输入数据 必须放入临时磁盘区。在极端情况下,如果工作区容量远小于输入数据,那么输入数据需要在临时磁盘区与工作区间多次交换。这将显著地增加SQL 操作的响应时间。
    参考自:https://www.cnblogs.com/ios9/p/7594721.html
    Oracle数据库开发基础教程