SQL执行计划分析
select 的工作原理:
1:Parse,语法分析阶段
2:Execute,执行
3:Fetch,提取数据阶段
一:先在Library Cache找这条命令,看执行计划,
二:如果没有,就语法分析
三:如果语法通过,就对象分析,通过数据字典
比如表存不存在,表列存不存在,表列如果是*,就翻译成全部列名
四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
六:服务器生成执行计划,装载到Library Cache中
七:检查数据库高速缓存区(Data buffer)中,有没有内容,即看能不能找到对象(表,视图)的数据块(block),如果有,就返回
八:如果不存在,由服务器进程,把表块读取到Data Buffer中
九:把Data Buffer中的数据提取出来,
update语句分析:
1:Parse阶段
2:Execute阶段
一:先在Library Cache找这条命令,看执行计划,
二:如果没有,就语法分析
三:如果语法通过,就对象分析,通过数据字典
比如表存不存在,表列存不存在
四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
六:服务器生成执行计划,装载到Library Cache中
七:检查数据库高速缓存区(Data buffer)中,要修改的内容的行(数据块)存不存在,如果存在,就修改
八:如果不存在,由服务器进程,把表块读取到Data Buffer中
九:给被修改的行加锁,以防止其它用户对对象(表)的结构进行修改。
十:旧数据放到Undo buffer(回滚段)中,新数据写时去,这个改变状态记录到Redo Logo中(Redo 日志/重做日志)
删除(DELETE)
1.Oracle读Block到Buffer Cache(如果该Block在Buffer中不存在)
2.在redo log buffer中记录delete操作的细节
3.在相应回滚段段头的事务表中创建一个undo条目
4.把将要删除的记录创建前镜像,存放到Undo Block中
5.在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty
提交(COMMIT)
1.Oracle产生一个SCN
2.在回滚段事务表中标记该事务状态为commited
3.LGWR Flush Log Buffer到日志文件
3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)
4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。
1:Parse,语法分析阶段
2:Execute,执行
3:Fetch,提取数据阶段
一:先在Library Cache找这条命令,看执行计划,
二:如果没有,就语法分析
三:如果语法通过,就对象分析,通过数据字典
比如表存不存在,表列存不存在,表列如果是*,就翻译成全部列名
四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
六:服务器生成执行计划,装载到Library Cache中
七:检查数据库高速缓存区(Data buffer)中,有没有内容,即看能不能找到对象(表,视图)的数据块(block),如果有,就返回
八:如果不存在,由服务器进程,把表块读取到Data Buffer中
九:把Data Buffer中的数据提取出来,
update语句分析:
1:Parse阶段
2:Execute阶段
一:先在Library Cache找这条命令,看执行计划,
二:如果没有,就语法分析
三:如果语法通过,就对象分析,通过数据字典
比如表存不存在,表列存不存在
四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
六:服务器生成执行计划,装载到Library Cache中
七:检查数据库高速缓存区(Data buffer)中,要修改的内容的行(数据块)存不存在,如果存在,就修改
八:如果不存在,由服务器进程,把表块读取到Data Buffer中
九:给被修改的行加锁,以防止其它用户对对象(表)的结构进行修改。
十:旧数据放到Undo buffer(回滚段)中,新数据写时去,这个改变状态记录到Redo Logo中(Redo 日志/重做日志)
删除(DELETE)
1.Oracle读Block到Buffer Cache(如果该Block在Buffer中不存在)
2.在redo log buffer中记录delete操作的细节
3.在相应回滚段段头的事务表中创建一个undo条目
4.把将要删除的记录创建前镜像,存放到Undo Block中
5.在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty
提交(COMMIT)
1.Oracle产生一个SCN
2.在回滚段事务表中标记该事务状态为commited
3.LGWR Flush Log Buffer到日志文件
3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)
4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。