oracle sql 执行原理
oracle sql 执行原理
select 的工作原理:
1:Parse,语法分析阶段
2:Execute,执行
3:Fetch,提取数据阶段
一:先在Library Cache找这条命令,看执行计划,
二:如果没有,就语法分析
三:如果语法通过,就对象分析,通过数据字典
比如表存不存在,表列存不存在,表列如果是*,就翻译成全部列名
四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
六:服务器生成执行计划,装载到Library Cache中
七:检查数据库高速缓存区(Data buffer)中,有没有内容,即看能不能找到对象(表,视图)的数据块(block),如果有,就返回
八:如果不存在,由服务器进程,把表块读取到Data Buffer中
九:把Data Buffer中的数据提取出来.
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)。
个人疑惑待解决问题:
对于insert into table1 (id) values(select max(id)+1 from table2) 这种sql,并发会不会引起id重复???
合并连接(Sort Merge Join, SMJ):
a) 对于非等值连接,这种连接方式的效率是比较高的。
b) 如果在关联的列上都有索引,效果更好。
c) 对于将2个较大的row source做连接,该连接方法比NL连接要好一些。
d) 但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O.
嵌套循环(Nested Loops, NL):
a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。
哈希连接(Hash Join, HJ):
a) 这种方法是在oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。
b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
c) 只能用于等值连接中