Oracle体系结构

发布 2021-05-02 13:47:28 阅读 8716

oracle 实例――包括内存结构与后台进程。

oracle 数据库――物理操作系统文件的集合(数据文件,控制文件,联机日志,参数文件,归档文件)

随着数据库实例的启动向操作系统申请分配一块内存结构,又会随着数据库实例的关闭而释放,每一个oracle数据库实例有且仅有一个sga。

系统全局区(system global area) 是一块巨大的共享内存区域,他被看做是oracle 数据库的一个大缓冲池,这里的数据可以被oracle的各个进程共用。其大小可以通过如下语句查看:

sql> select * from v$sga;--固定大小,可变大小、数据缓存大小,重做缓存大小)

更详细的信息可以参考v$sgastat、v$buffer_pool

主要包括以下几个部分:

a、 共享池(shared pool)

共享池是sga中最关键的内存片段,特别是在性能和可伸缩性上。一个太小的共享池会扼杀性能,使系统停止,太大的共享池也会有同样的效果,将会消耗大量的cpu来管理这个共享池。不正确的使用共享池只会带来灾难。

共享池主要又可以分为以下两个部分:

sql语句缓冲(library cache)

当一个用户提交一个sql语句,oracle会将这句sql进行分析(parse),这个过程类似于编译,会耗费相对较多的时间。在分析完这个sql,oracle会把他的分析结果给保存在shared pool的library cache中,当数据库第二次执行该sql时,oracle自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的sql 比第二次运行的sql要慢一点的原因。

对于保存在共享池中的sql语句,可以从v$sqltext、v$sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。一个设计的差的应用程序可以毁掉整个数据库的share pool,提高sql语句的重用率必须先养成良好的变成习惯。

更多关于(sql语句缓冲(library cache)

请访问。数据字典缓冲区(data dictionary cache)

数据字典缓冲区是oracle特地为数据字典准备的一块缓冲池,供oracle内部使用。

b、块缓冲区高速缓存(database buffer cache)

这些缓冲是对应所有数据文件中的一些被使用到的数据块。让他们能够在内存中进行操作。在这个级别里没有系统文件,,用户数据文件,临时数据文件,回滚段文件之分。

也就是任何文件的数据块都有可能被缓冲。数据库的任何修改都在该缓冲里完成,并由dbwr进程将修改后的数据写入磁盘。

这个缓冲区的块基本上在两个不同的列表中管理。一个是块的“脏”表(dirty list),需要用数据库块的。

书写器(dbwr)来写入,另外一个是不脏的块的列表(free list),一般的情况下,是使用最近最少使用 (least recently used,lru)算法来管理。块缓冲区高速缓存又可以细分为以下三个部分(default pool,keep pool,recycle pool)。如果不是人为设置初始化参数(将默认为default pool。

由于操作系统寻址能力的限制,不通过特殊设置,在32位的系统上,块缓冲区高速缓存最大可以达到1.7g,在64位系统上,块缓冲区高速缓存最大可以达到10g。

c、重做日志缓冲区(redo log buffer)

重做日志文件的缓冲区,对数据库的任何修改都按顺序被记录在该缓冲,然后由lgwr进程将它写入磁盘。这些修改信息可能是dml语句,如(insert,update,delete),或ddl语句,如(create,alter,drop等)。

重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。所以重作日志缓冲区一般都很小,大于3m之后的重作日志缓冲区已经没有太大的实际意义。

d、j**a程序缓冲区(j**a pool)

j**a 的程序区,oracle 8i 以后,oracle 在内核中加入了对j**a的支持。该程序缓冲区就是为j**a 程序保留的。如果不用j**a程序没有必要改变该缓冲区的默认大小。

e、大池(large pool)

大池的得名不是因为大,而是因为它用来分配大块的内存,处理比共享池更大的内存,在8.0开始引入。

下面对象使用大池:

mts――在sga的large pool中分配uga

语句的并行查询(parallel executeion of statements)――允许进程间消息缓冲区的分配,用来协调并行查询服务器。

备份(backup)――用于rman磁盘i/o缓存。

1. pga(程序全局区)

用于保存每一个用户连接到数据库的信息。

当用户进程连接到数据库并创建一个对应的会话时,oracle服务进程会为这个用户专门设。

置一个pga区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自。

动释放这个pga区所占用的内存。这个pga区对于数据库的性能有比较大的影响,特别。

是对于排序操作的性能。所以,在。

必要的时候合理管理pga区,能够在很大程度上提高数据库的性能。

保存每一个用户连接到数据库的信息,包括:会话信息、排序信息和游标信息。分为:

排序区、 会话区、 游标区、 堆栈区。

2. sga和pga的区别。

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语句运行时的内存结构等重要的信息。

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

Oracle体系结构

课后测试。单选题。1.哪个不是数据库的物理组件 a表空间 b物理文件 c控制文件 d日志文件 正确答案 a 2.最小的数据库逻辑结构是什么?a操作系统块 b数据库块 c表空间 d表 e区 正确答案 b 3.在数据库启动的mount阶段,可以进行什么操作 a查询用户scott下的表 b建立表空间 c创...

Oracle体系结构

簇 cluster 经常被频繁引用的表可以在物理位置上被存储在一起,簇就是用来管理这种集中存储的。集中存储可以减少i o次数,以达到性能的改善和提高。散列簇 hash cluster 簇的另一种形式,这种簇中的数据要通过散列函数计算得出物理位置,它可以极大程度的提高等值查询的效率。视图 view 可...

oracle体系结构

meta data 描述 说明 数据的数据。ctl 文件描述了 记录了 dbf 文件和log文件的位置,大小,一致性,checkpoint等信息。参数文件 oracle instance启动时,实例的参数由参数文件决定。d oracle product 10.2.0 db 1 dbs 密码文件 d ...