数据库写入进程( DBWR ) 1
查询( Query )处理步骤 1
发出COMMIT 命令时执行下面的步骤 2
快速提交( Fast Commit ) 2
日志写入进程( LGWR ) 2
检查点( CKPT ) 3
强制检查点 3
设置数据库检查点时间间隔 3
LOG_CHECKPOINT_INTERVAL 3
LOG_CHECKPOINT_TIMEOUT 4
FAST_START_IO_TARGET 4
数据库写入进程( DBWR ) 1
查询( Query )处理步骤 1
发出COMMIT 命令时执行下面的步骤 2
快速提交( Fast Commit ) 2
日志写入进程( LGWR ) 2
检查点( CKPT ) 3
强制检查点 3
设置数据库检查点时间间隔 3
LOG_CHECKPOINT_INTERVAL 3
LOG_CHECKPOINT_TIMEOUT 4
FAST_START_IO_TARGET 4
查询( Query )处理步骤
查询不同于其它类型的SQL 语句,因为如果查询成功它们会返回作为结果的数据,查询可以返回一行或者上千行,而其它语句只是返回成功或失败,查询的处理有三个主要阶段:
分析编译SQL 语句
执行标识选定的行或对数据应用DML 更改
提取返回SELECT 语句查询的行
1. 分析SQL 语句:在分析阶段SQL 语句从用户进程传递到服务器进程,并且SQL 语句的分析说明被载入共享的SQL 区,在分析过程中服务器进程做如下工作:
在共享池中搜索SQL 语句的现有副本
通过检查语法验证SQL 语句
执行数据字典查找来验证表和列的定义
分析SQL 语句续
获取对象的分析锁以便在语句的分析过程中对象的定义不会改变
检查用户访问引用方案对象的权限
确定语句的最佳执行计划
将语句和执行计划载入共享的SQL 区
主意:分析阶段包括处理某些要求,不论语句执行多少次这些要求通常只需要处理一次。Oracle 服务器总是验证用户是否具有执行SQL 语句所需的权限。
2. 执行SELECT 语句:到了SELECT 语句这一步服务器进程准备要检索数据了
3. 提取查询行:在提取阶段对行进行选择和排序(如有必要)并且由服务器返回给用户
发出COMMIT 命令时执行下面的步骤
1. 服务器进程随同SCN 一起在重做日志缓冲区中放置一个提交记录。
2. LGWR 向重做日志文件中连续写入,直到提交记录(含提交记录)的所有重做日志缓冲区条目,这之后Oracle 服务器就能够保证即使存在例程失败也不会丢失更改。
3. 通知用户COMMIT 命令已完成
4. 服务器进程记录信息以指出事务处理已完成,并且可以释放资源锁,将灰数据缓冲区刷新到数据文件由DBW0 独立执行,在提交之前或之后进行都可以。(因此请牢记,DBWR的触发不依赖于Commit行为)
快速提交( Fast Commit )
快速提交机制将更改写入重做日志缓冲区而不是写入数据文件,这样确保数据得以恢复,Oracle 服务器使用这种机制来保证提交的更改能够在例程失败的情况下得以恢复。它有如下优势
连续写入日志文件比写入数据文件的各个块更快。(因为日志文件是顺序写的)
只将记录更改必须的最少信息写入日志文件,然而写入数据文件却需要写入整个数据块(它记录被更改的块,更改位置,以及重做条目中的新值。)。
如果多个事务处理同时请求提交那么例程将重做日志记录合成为单个写入。
除非重做日志缓冲区特别满否则每个事务处理只需要一个同步写入,如果发生合成,那么每个事务处理的同步写入可能不到一个, 因为提交之前可能会刷新重做日志缓冲区,所以事务处理的大小并不影响实际的提交操作所需的时间量。(因为,每3秒,重做日志缓冲区填满1M,重做日志缓冲区填满1/3,或者事务提交的时候的时候,LGWR进程会将REDO LOG BUFFER中内容的写入到REDO LOG FILE 中。)
注:回退事务处理并不会触发LGWR 写入磁盘(因为没有提交的数据本身不会被写入数据文件)。
数据库写入进程( DBWR )
服务器进程在缓冲区高速缓存中记录回退和数据块的更改,数据库写入进程(DBW0) 将灰数据缓冲区从数据库缓冲区高速缓存写入数据文件,它确保有足够数量的空闲缓冲区,即当服务器进程需要读取数据文件中的块时,可以覆盖的缓冲区在数据库缓冲区高速缓存中可用。由于服务器进程只在缓冲区高速缓存中进行更改,因此数据库性能得到改善,而且DBW0 延迟写入数据文件直到发生下列事件之一:
灰数据缓冲区的数量达到阈值;
当进行扫描而无法找到任何空闲缓冲区时进程扫描了指定数量的块;
出现超时每三秒;
出现检查点(检查点是使数据库缓冲区高速缓存与数据文件同步的一种方法)
日志写入进程( LGWR )
LGWR 在下列情况下执行从重做日志缓冲区到重做日志文件的连续写入:
当提交事务处理时( Commit )
当重做日志缓冲区的三分之一已满时
当重做日志缓冲区中记录了超过1 MB 的更改时
在DBW0 将数据库缓冲区高速缓存中修改的块写入数据文件以前
因为恢复操作需要重做,所以LGWR 只在重做写入磁盘后确认COMMIT 命令。(所以,LGWR是5个不可缺少的后台进程中,唯一个与SQL语句执行相关的进程。当然,SQL语句的执行还要依赖于在客户端运行的用户进程和在服务器端执行的服务器进程。)
检查点( CKPT )
检查点后台进程(CKPT)用于更新所有数据文件和控制文件的标题以反映该进程已成功完成,使数据库文件同步。
数据库在检查点期间做如下工作: DBWn 将许多由正在经历检查点事件的日志覆盖的灰数据库缓冲区写入到数据文件中。由DBWn 写入的缓冲区数量由参数FAST_START_IO_TARGET 决定。
检查点可发生在下面情况中:
每次日志切换时;
当已通过正常事务处理或者立即选项关闭例程时;
当通过设置初始化参数LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT 和FAST_START_IO_TARGET 强制时;
当数据库管理员手动请求时;
如果初始化参数LOG_CHECKPOINTS_TO_ALERT 设置为TRUE ,则每个检查点信息都记录在ALERT 文件内;该参数缺省值为FALSE,不记录检查点。
注意:FAST_START_IO_TARGET 参数是在 ORACLE 8.1.x Enterprise Edition 版本及其后续版本中添加的参数。
强制检查点
可以使用下面的SQL 命令手动强制检查点发生:
SQL> ALTER SYSTEM CHECKPOINT;
设置数据库检查点时间间隔
当数据库使用大型联机重做日志文件时,可以通过设置以下初始化参数来设置其它数据库检查点,以改善数据库的性能:
LOG_CHECKPOINT_INTERVAL
LOG_CHECKPOINT_TIMEOUT
AST_START_IO_TARGET (只限于ORACLE 8.1.x Enterprise Edition 版本及其后续版本)
LOG_CHECKPOINT_INTERVAL
在低于ORACLE 8.1.X 的版本中,LGWR 一写入参数LOG_CHECKPOINT_INTERVAL 指定的块数就启动了检查点。LOG_CHECKPOINT_INTERVAL 值在操作系统块中指定而不是在Oracle 数据库块中指定。但是,无论该值如何,当从一个联机重做日志文件切换到另一个时检查点始终发生。
如果该值超过实际联机重做日志文件大小,那么检查点仅在日志切换时发生。
注意:将时间间隔值指定为0 可能导致非常频繁地启动检查点,因为即使上一个请求启动后仅对单个重做日志缓冲区写入仍会启动新的请求。
在ORACLE 8.1.x Enterprise Edition 版本及其后续版本内,当指定了LOG_CHECKPOINT_INTERVAL 后,检查点位置目标相对于日志尾的滞后不能大于该参数指定的重做日志块数,这确保了在例程恢复期间需要读取不超过固定数目的重做块。
LOG_CHECKPOINT_TIMEOUT
对于低于ORACLE 8.1 的版本,该初始化参数值指定了另一个检查点发生前的最大时间量,该值按秒指定该时间。从前一个检查点启动时,开始经过该参数指定的时间量后发生另一个检查点,将超时值指定为0 就可以禁用基于时间的检查点。
在ORACLE 8.1.x Enterprise Edition 版本及其后续版本内,当指定了LOG_CHECKPOINT_TIMEOUT 后,该参数将检查点位置目标设置到日志文件中的某个位置,而该日志在该参数指定的秒数前结束,这确保了在恢复期间需要读取的重做块数不超过与指定秒数相当的块数。
FAST_START_IO_TARGET
参数FAST_START_IO_TARGET 改善了实例失败恢复的性能,该参数值越小,由于需要恢复的块就越少因而恢复性能就越好。该参数设置后DBWn 更频繁地将灰缓冲区写出。该参数在在ORACLE 8.1.x Enterprise Edition 版本及其后续版本中引入。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84716/,如需转载,请注明出处,否则将追究法律责任。