当前位置:文档之家› oracle体系结构总结

oracle体系结构总结

oracle体系结构总结传统上Oracle体系结构由内存结构、进程结构、存储结构组成。

其中,内存结构由SGA、PGA组成;进程结构由用户进程和Oracle进程组成;存储结构由逻辑存储、物理存储组成。

通过数据库的启动过程和一条sql的执行过程可以将oracle的内存结构、进程结构、存储结构串起来。

一、内存结构(1)SGA(System Global Area):一个包含实例数据和控制信息的共享内存区域(2)PGA(Program Global Area):一个包含服务器进程和后台进程的数据和控制信息的共享内存区域1.1系统全局区SGA系统全局区,是DB Server 中实例的必要组成部分,由很多小内存区共同构成,各个小内存区存放不同的信息,系统全局区用于暂存可以被所有进程(包括server process 以及background process)共享的信息,对系统的运行性能有好处,SGA 在实例启动的时候自动分配,实例关闭时自动释放。

SGA 暂存系统的大量共享数据,对系统有相当的性能影响,所以需要为SGA 选择适当的管理方式,根据所使用的数据库版本不同,SGA 的管理有三种方式:1)8i:SGA 的大小由所有内存组件大小之和决定,不能直接定义SGA 大小,对内存组件的大小可后台进行修改,但只能通过直接修改参数文件的内存参数大小,而且修改完数据库必须重起后才能生效,所以这种内存管理方法叫做SGA 的静态管理。

2)9i:SGA 的大小由初始化参数SGA_MAX_SIZ E 确定,各个内存组件大小之和不能超过这个参数。

可以直接通过命令进行修改内存组件大小而不用重启,这种叫做SGA 的动态管理3)10g:SGA 大小既可以像9i 一人样动态管理,也可以实施SGA 的自动管理,默认是SGA 的自动管理,启用SGA 自动管理只需要设置初始化参数SGA_TARGET 即可,各个组件大小之和不超过SGA _TARGET 。

在自动管理下,SGA 各个内存组件由数据库自动设置大小,设置各个内存区大小的依据来源于系统自动收集的统计信息。

在设置内存组件大小的时候,分配的基本单位是粒度(granule )granule 是一段连续的虚拟内存,大小取决于SGA_MAX_SIZE 的大小,如果SGA_MAX_SIZ E小于128M ,Granule 为4M,否则Granule 为16M。

大多数内存组件的大小必须是Granule 的整数倍,Redo Log Buffer 的大小不受这个限制,可以自行设置,它与其他小内存区共同构成Granule 的整数倍。

整个SGA 最小不小于3 个Granule 大小,其中共享池一个,数据缓存区一个,其他分一个,SGA的总大小也一定是Granule 的整数倍大小。

SGA 大多数组件的大小可以动态调整,只要确保所有的内存组件大小之和不超过SGA _MAX_SIZE 或SGA_TARGET 的大小,在10G 中SGA 内存组件可以自动管理,各个内存大小由数据库自己决定,设置SGA_TARGET 参数(非0)即可以开启内存自动管理,这个参数也可动态修改,如果设置为0,则意味着,禁用内存自动管理,伋需要DBA 手动调整各个内存组件大小。

以下内存组件大小可以由数据库自动设置1)Buffer cache(db_cache_size)2)Shared pool(shared_pool_size)3)Large pool(large_pool_size)4)Java pool(java_pool_size)5)Stream pool(stream_pool_size)手动设置:1)LOG_BUFFER2)STREAMS_POOL3)DB_NK_CACHE_SIZE4)DB_KEEP_CACHE_SIZE5)DB_RECYCLE_CACHE_SIZESGA 的必要内存区包括Shared Pool( 共享池)、DB Buffer Cache(数据库高速缓存)Redo Log和Buffers (重做日志缓存区)。

共享池中又包含了库高速缓存(Library Cache)和数据字典高速缓存(Data Dict Cache)其中库高速缓存中暂存了最近常用的SQL 和PL/SQL 语句文件,分析代码,执行计划,用于减少代码的硬解析频度;数据字典高速缓存中暂存了最近常用的数据字典信息,用于为SQL 语句解析提供可以快速读取的数据字典信息。

数据库高速缓存(DB Buffer Cache)暂存最近常用的数据块信息,减少磁盘I/O 操作,用于提高数据访问的速度。

重做日志缓存区暂存最近生成的重做日志,将来批量写到重做日志文件中,这样可以确保日志能够更快的生成,提高DML 操作的执行速度,也能够减少日志带来的写频度。

除了必要内存区外,SGA 也有一些可选的内存区,主要有大池Large Pool)Java 池Java Pool)(,(以及流池(Stream Pool)。

大池主要用于共享模式存放用户全局区(UGA) 的信息,也提供了对Rman 备份恢复以及并行进程的支持。

Java 池的功能类似于共享池,暂存Java 程序的信息。

Stream 池是10G 的新内存区,支持新的流复制技术。

1.1.1共享池(Shared pool)共享池用于缓存sql,plsql、数据字典、资源锁及其它用于控制结构相关的数据,共享池是SGA中最关键的内存片段,特别是在性能和可伸缩性上。

太大太小都会扼杀性能,使系统停止,将会消耗大量的CPU来管理这个共享池。

共享池大小由参数shared_pool_size 决定大小,可以动态调整,它的各个内部件大小由共享池大小决定,不能单独设置alter system shared_pool_size=100m; 设置共享池大小;如果开启了内存自动管理特性,则不需要DBA 手动调整。

共享池主要包括两个与sql 语句解析性能相关的内存组件。

清空缓存池:alter system flush shared_pool;dbms_shared_pool.purge 某个sql共享池可分为:Library Cache和Data Dictionaey Cache1.1.1.1 库高速缓冲区(Library Cache)库高速缓存用于暂存最近常使用的SQL 和PL/SQL 语句的文本,分析代码,执行计划。

SQL 文本也就是SQL 语句。

执行计划是最终SQL 语句的执行算法,分析代码则是生成执行计划的分析过程。

库高速缓存暂时存放常用语句信息的目的是为了能够共享SQL 代码,从而能够重用已经解析好的执行计划,减少硬解析带来的资源消耗与其它内存区一样,库高速缓存也遵循LRU 算法管理内存,由于内存空间大小有限,所以总会有一些SQL 语句的信息被挤出库高速缓存区,这意味着必然会带来一些语句代码的硬解析,所以需要对库高速缓存进行一些调整,以减少对解析性能的影响库高速缓存的内部又分为两个内存区,分别缓存SQL 语句和PL/SQL 语句的信息:共享sql 区共享pl/sql 区库高速缓存的大小不能直接设置,受共享池的大小影响,由数据库自行决定对于保存在共享池中的SQL语句,可以从V$Sqltext、v$Sqlarea中查询到,对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间。

一个设计的差的应用程序可以毁掉整个数据库的Share pool,提高SQL语句的重用率必须先养成良好的变成习惯,尽量使用Bind变量。

1.1.1.2 数据字典高速缓存区(data dict cache)数据字典高速缓存用于暂存最近常使用的数据字典信息,它同样遵循LRU 算法管理内存,在字典缓存区中主要暂存解析所需的表空间,存储,表,索引,字段,用户,权限以及其他数据库对象的相关字典信息。

由于SQL 语句解析时,服务进程需要查找相关的数据字典信息以支持解析,而字典信息默认存储在数据文件的数据字典信息中,所以每次解析去I/O 读取数据文件并不是好的选择。

将常用的字典信息缓存在数据字典高速缓存区中,能够快速访问所需的字典信息,有效减少解析的时间,所以SQL 语句解析的性能得到提高。

数据字典的大小也不能直接修改,受共享池的大小的影响,数据库自行决定1.1.2 数据高速缓存区(db buffer cache)用于暂存从数据文件中获得的数据块的数据映像,同样遵循LRU 算法管理内存,不论是表中的数据块,不是索引的数据块,或回滚段的数据块,都被读取到数据高速缓存中进行处理,如果内存中的数据块发生变化,在特定的时机会被DBWR进程将修改后的数据写回到数据文件中。

由于大量数据块经常被反复访问,所以如果数据已经读入内存,当再次需要操作这些数据块时就可以在内存中直接获取和更新,减少了磁盘I/O 的操作,SQL 语句的执行执行效率有大幅的提高初始化参数DB_BLOCK_SIZE 决定了数据块的大小,这也是数据库I/O 的最小单位,所以这个参数将影响到数据访问的性能,而且需要注意的是,这个参数在创建数据库之后将不能够被改变,数据高速缓区由多个独立的子缓存池构成,它的大小是这些缓存池的大小之和,这些子缓存区可以独立设置大小,通过下面的参数进行设置1)Default db_cache_size2)Keep db_keep_cache_size3)Recycle db_recycle_cache_sizekeep缓存池适合存放常用的数据字典表,可以把这样的表直接keep在keep缓存池中;recycle缓存池,用完就释放,适合存放不常用的大表这些子缓存池的大小都可以动态调整,但是只有db_cache_size 可以由数据库自动管理大小,默认只有db_cache_size 被设置了有效值,其他两个缓存池大小被设置为零1.1.3 重做日志缓冲区(Redo log buffer)重做日志缓冲区用于暂存数据库中所有数据块的改变信息,这些信息将按照改变的发生时间顺序记录在缓存区中,然后在特定的时机下被写入重做日志文件,日志缓存区的内存管理方法是FIFO,也就是是先进先出。

重做日志主要被用于提供数据的恢复功能,应用日志前滚(roll forward)就是数据库的基本恢复原理使用重做日志缓冲区的目的是为了提高DML 或者DDL 语句的执行速度,减少日志产生带来的性能影响,减少系统日志I/O 的频度。

重做日志缓冲区的大小出log_buffer 参数决定,但这个内存区不能动态调整大小,也不能被自动管理。

重做日志缓冲区的存在是因为内存到内存的操作比较内存到硬盘的速度快很多,所以重作日志缓冲区可以加快数据库的操作速度,但是考虑的数据库的一致性与可恢复性,数据在重做日志缓冲区中的滞留时间不会很长。

相关主题