zoukankan      html  css  js  c++  java
  • oracle sql 执行原理

    oracle 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)。
     
     
    个人疑惑待解决问题
      对于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) 只能用于等值连接中

  • 相关阅读:
    leetcode203
    leetcode88
    leetcode219
    leetcode225
    2018-12-25-C#-使用转换语义版本号
    2018-12-25-C#-使用转换语义版本号
    2018-10-15-Winforms-可能遇到的-1000-个问题
    2018-10-15-Winforms-可能遇到的-1000-个问题
    2018-8-10-UWP-WPF-解决-xaml-设计显示异常
    2018-8-10-UWP-WPF-解决-xaml-设计显示异常
  • 原文地址:https://www.cnblogs.com/luluQQ/p/3770293.html
Copyright © 2011-2022 走看看